diff --git a/docs/.buildinfo b/docs/.buildinfo index d9ce8dab..1857e17e 100644 --- a/docs/.buildinfo +++ b/docs/.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: 84555ec9fefb928fe9970dd525a17df6 +config: 23fd5c9a8562e86bc017afd5666bb426 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_images/base-game-version.png b/docs/_images/base-game-version.png new file mode 100644 index 00000000..4cc45099 Binary files /dev/null and b/docs/_images/base-game-version.png differ diff --git a/docs/_images/button-create.png b/docs/_images/button-create.png new file mode 100644 index 00000000..c9aa4992 Binary files /dev/null and b/docs/_images/button-create.png differ diff --git a/docs/_images/button-load.png b/docs/_images/button-load.png new file mode 100644 index 00000000..bd293135 Binary files /dev/null and b/docs/_images/button-load.png differ diff --git a/docs/_images/button-refresh.png b/docs/_images/button-refresh.png new file mode 100644 index 00000000..a187ee80 Binary files /dev/null and b/docs/_images/button-refresh.png differ diff --git a/docs/_images/custom-scripts-editor.png b/docs/_images/custom-scripts-editor.png new file mode 100644 index 00000000..9cdd736d Binary files /dev/null and b/docs/_images/custom-scripts-editor.png differ diff --git a/docs/_images/default-tilesets.png b/docs/_images/default-tilesets.png new file mode 100644 index 00000000..073e90de Binary files /dev/null and b/docs/_images/default-tilesets.png differ diff --git a/docs/_images/delete.png b/docs/_images/delete.png new file mode 100644 index 00000000..03aaed63 Binary files /dev/null and b/docs/_images/delete.png differ diff --git a/docs/_images/events.png b/docs/_images/events.png new file mode 100644 index 00000000..ea6e5170 Binary files /dev/null and b/docs/_images/events.png differ diff --git a/docs/_images/file_edit.png b/docs/_images/file_edit.png new file mode 100644 index 00000000..d197d1d6 Binary files /dev/null and b/docs/_images/file_edit.png differ diff --git a/docs/_images/folder.png b/docs/_images/folder.png new file mode 100644 index 00000000..12525f11 Binary files /dev/null and b/docs/_images/folder.png differ diff --git a/docs/_images/import-defaults.png b/docs/_images/import-defaults.png new file mode 100644 index 00000000..ce1d71c5 Binary files /dev/null and b/docs/_images/import-defaults.png differ diff --git a/docs/_images/import_defaults.png b/docs/_images/import_defaults.png new file mode 100644 index 00000000..ce1d71c5 Binary files /dev/null and b/docs/_images/import_defaults.png differ diff --git a/docs/_images/map-collisions.png b/docs/_images/map-collisions.png index 0fc9bd69..51f58469 100644 Binary files a/docs/_images/map-collisions.png and b/docs/_images/map-collisions.png differ diff --git a/docs/_images/maps.png b/docs/_images/maps.png new file mode 100644 index 00000000..3054c155 Binary files /dev/null and b/docs/_images/maps.png differ diff --git a/docs/_images/new-map-defaults.png b/docs/_images/new-map-defaults.png new file mode 100644 index 00000000..50b557f7 Binary files /dev/null and b/docs/_images/new-map-defaults.png differ diff --git a/docs/_images/new-script.png b/docs/_images/new-script.png new file mode 100644 index 00000000..a046f5ec Binary files /dev/null and b/docs/_images/new-script.png differ diff --git a/docs/_images/pokemon-icon-placeholder.png b/docs/_images/pokemon-icon-placeholder.png new file mode 100644 index 00000000..43957668 Binary files /dev/null and b/docs/_images/pokemon-icon-placeholder.png differ diff --git a/docs/_images/pokemon_icon_placeholder.png b/docs/_images/pokemon_icon_placeholder.png new file mode 100644 index 00000000..43957668 Binary files /dev/null and b/docs/_images/pokemon_icon_placeholder.png differ diff --git a/docs/_images/prefabs.png b/docs/_images/prefabs.png new file mode 100644 index 00000000..40aa4c77 Binary files /dev/null and b/docs/_images/prefabs.png differ diff --git a/docs/_images/preferences.png b/docs/_images/preferences.png new file mode 100644 index 00000000..b1b5bf5e Binary files /dev/null and b/docs/_images/preferences.png differ diff --git a/docs/_images/refresh-prompt.png b/docs/_images/refresh-prompt.png new file mode 100644 index 00000000..9f82bb97 Binary files /dev/null and b/docs/_images/refresh-prompt.png differ diff --git a/docs/_images/restore-defaults.png b/docs/_images/restore-defaults.png new file mode 100644 index 00000000..e0ee440d Binary files /dev/null and b/docs/_images/restore-defaults.png differ diff --git a/docs/_images/settings.png b/docs/_images/settings.png new file mode 100644 index 00000000..91d55b4e Binary files /dev/null and b/docs/_images/settings.png differ diff --git a/docs/_images/tab-events.png b/docs/_images/tab-events.png new file mode 100644 index 00000000..1fd1da8a Binary files /dev/null and b/docs/_images/tab-events.png differ diff --git a/docs/_images/tab-files.png b/docs/_images/tab-files.png new file mode 100644 index 00000000..447df124 Binary files /dev/null and b/docs/_images/tab-files.png differ diff --git a/docs/_images/tab-general.png b/docs/_images/tab-general.png new file mode 100644 index 00000000..eb787a4f Binary files /dev/null and b/docs/_images/tab-general.png differ diff --git a/docs/_images/tab-identifiers.png b/docs/_images/tab-identifiers.png new file mode 100644 index 00000000..87a5ea81 Binary files /dev/null and b/docs/_images/tab-identifiers.png differ diff --git a/docs/_images/tab-maps.png b/docs/_images/tab-maps.png new file mode 100644 index 00000000..4ff22e46 Binary files /dev/null and b/docs/_images/tab-maps.png differ diff --git a/docs/_images/tab-project-files.png b/docs/_images/tab-project-files.png new file mode 100644 index 00000000..846490ee Binary files /dev/null and b/docs/_images/tab-project-files.png differ diff --git a/docs/_images/tab-tilesets.png b/docs/_images/tab-tilesets.png new file mode 100644 index 00000000..3a1e767a Binary files /dev/null and b/docs/_images/tab-tilesets.png differ diff --git a/docs/_images/tilesets-metatiles.png b/docs/_images/tilesets-metatiles.png new file mode 100644 index 00000000..96f312c9 Binary files /dev/null and b/docs/_images/tilesets-metatiles.png differ diff --git a/docs/_sources/manual/editing-map-collisions.rst.txt b/docs/_sources/manual/editing-map-collisions.rst.txt index e1278cc2..35131be4 100644 --- a/docs/_sources/manual/editing-map-collisions.rst.txt +++ b/docs/_sources/manual/editing-map-collisions.rst.txt @@ -9,7 +9,7 @@ Selecting Collision Types The Collision Type Selector is a tab next to the Metatile Selector. It features 32 total different collision types. The left column is for collision types that allow the player to walk through the tiles. These are denoted by white text. The right column is for collision types that are impassable by the player. These are denoted by red text. -The transparency slider above the collision types controls the transparency of the collision properties on the map view. +The transparency slider above the collision types controls the transparency of the collision properties on the map view. The slider at the bottom of the panel zooms the selector image in and out. .. figure:: images/editing-map-collisions/map-collisions.png :alt: Map Collisions View @@ -73,3 +73,6 @@ Multi-Level Collision Type |multi-level-collision-type-1| |multi-level-collision .. |multi-level-collision-type-2| image:: images/editing-map-collisions/multi-level-collision-type-2.png + +.. note:: + For advanced usage: Any valid elevation/collision value combination can be selected using the ``Elevation`` and ``Collision`` value spinners, even if it's not represented graphically on the selector image. You may also resize/replace this selector image under ``Options -> Project Settings``. diff --git a/docs/_sources/manual/editing-map-events.rst.txt b/docs/_sources/manual/editing-map-events.rst.txt index 22e30983..9f383196 100644 --- a/docs/_sources/manual/editing-map-events.rst.txt +++ b/docs/_sources/manual/editing-map-events.rst.txt @@ -110,7 +110,7 @@ Target Map Warp Events ----------- -Warp events are how the player is able to warp to other maps, such as entering a building. Double-clicking on a warp will automatically open the destination map and select the destination warp. This makes it very easy to navigate around in Porymap. +Warp events are how the player is able to warp to other maps, such as entering a building. Double-clicking on a warp will automatically open the destination map and select the destination warp. This makes it very easy to navigate around in Porymap. Warps need to be on specific metatiles to function as an exit; a warning will appear if the warp event is not on one of these metatiles. .. figure:: images/editing-map-events/event-warp.png :alt: Warp Event Properties diff --git a/docs/_sources/manual/project-files.rst.txt b/docs/_sources/manual/project-files.rst.txt index 78a899dc..bc629a1f 100644 --- a/docs/_sources/manual/project-files.rst.txt +++ b/docs/_sources/manual/project-files.rst.txt @@ -6,9 +6,16 @@ Porymap relies on the user maintaining a certain level of integrity with their p This is a list of files that porymap reads from and writes to. Generally, if porymap writes to a file, it probably is not a good idea to edit yourself unless otherwise noted. -The filepath that Porymap expects for each file can be overridden with config options. The name of each config override is listed in the table, and should begin with ``path/``. -For example if you wanted to rename ``include/constants/items.h`` to ``headers/defines/stuff.h``, you would add ``path/constants_items=headers/defines/stuff.h`` to your project's ``porymap.project.cfg`` file. +The filepath that Porymap expects for each file can be overridden on the ``Files`` tab of ``Options -> Project Settings``. A new path can be specified by entering it in the text box or choosing it with the |button-folder| button. Paths are expected to be relative to the root project folder. If no path is specified, or if the file/folder specified does not exist, then the default path will be used instead. The name of each setting in this section is listed in the table below under ``Override``. +.. |button-folder| image:: images/scripting-capabilities/folder.png + :width: 24 + :height: 24 + +.. figure:: images/settings-and-options/tab-files.png + :alt: Files tab + +.. _files: .. csv-table:: :header: File Name,Read,Write,Override,Notes @@ -28,7 +35,7 @@ For example if you wanted to rename ``include/constants/items.h`` to ``headers/d data/tilesets/graphics.inc, yes, yes, ``tilesets_graphics_asm``, only if ``tilesets_headers`` can't be found data/tilesets/metatiles.inc, yes, yes, ``tilesets_metatiles_asm``, only if ``tilesets_headers`` can't be found data/tilesets/[primary|secondary]/\*, yes, yes, ``data_tilesets_folders``, default tileset data location - src/data/wild_encounters.json, yes, yes, ``json_wild_encounters``, + src/data/wild_encounters.json, yes, yes, ``json_wild_encounters``, optional (only required to use Wild Pokémon tab) src/data/object_events/object_event_graphics_info_pointers.h, yes, no, ``data_obj_event_gfx_pointers``, src/data/object_events/object_event_graphics_info.h, yes, no, ``data_obj_event_gfx_info``, src/data/object_events/object_event_pic_tables.h, yes, no, ``data_obj_event_pic_tables``, @@ -37,18 +44,17 @@ For example if you wanted to rename ``include/constants/items.h`` to ``headers/d src/data/heal_locations.h, yes, yes, ``data_heal_locations``, src/data/region_map/region_map_sections.json, yes, yes, ``json_region_map_entries``, src/data/region_map/porymap_config.json, yes, yes, ``json_region_porymap_cfg``, - include/constants/global.h, yes, no, ``constants_global``, reads ``OBJECT_EVENT_TEMPLATES_COUNT`` + include/constants/global.h, yes, no, ``constants_global``, reads ``define_obj_event_count`` include/constants/map_groups.h, no, yes, ``constants_map_groups``, - include/constants/items.h, yes, no, ``constants_items``, - include/constants/opponents.h, yes, no, ``constants_opponents``, reads max trainers constant - include/constants/flags.h, yes, no, ``constants_flags``, - include/constants/vars.h, yes, no, ``constants_vars``, - include/constants/weather.h, yes, no, ``constants_weather``, - include/constants/songs.h, yes, no, ``constants_songs``, + include/constants/items.h, yes, no, ``constants_items``, for Hidden Item events + include/constants/flags.h, yes, no, ``constants_flags``, for Object and Hidden Item events + include/constants/vars.h, yes, no, ``constants_vars``, for Trigger events + include/constants/weather.h, yes, no, ``constants_weather``, for map weather and Weather Triggers + include/constants/songs.h, yes, no, ``constants_songs``, for map music include/constants/heal_locations.h, yes, yes, ``constants_heal_locations``, - include/constants/pokemon.h, yes, no, ``constants_pokemon``, reads min and max level constants + include/constants/pokemon.h, yes, no, ``constants_pokemon``, reads ``define_min_level`` and ``define_max_level`` include/constants/map_types.h, yes, no, ``constants_map_types``, - include/constants/trainer_types.h, yes, no, ``constants_trainer_types``, + include/constants/trainer_types.h, yes, no, ``constants_trainer_types``, for Object events include/constants/secret_bases.h, yes, no, ``constants_secret_bases``, pokeemerald and pokeruby only include/constants/event_object_movement.h, yes, no, ``constants_obj_event_movement``, include/constants/event_objects.h, yes, no, ``constants_obj_events``, @@ -56,8 +62,75 @@ For example if you wanted to rename ``include/constants/items.h`` to ``headers/d include/constants/region_map_sections.h, yes, no, ``constants_region_map_sections``, include/constants/metatile_labels.h, yes, yes, ``constants_metatile_labels``, include/constants/metatile_behaviors.h, yes, no, ``constants_metatile_behaviors``, + include/constants/species.h, yes, no, ``constants_metatile_behaviors``, for the Wild Pokémon tab + include/global.fieldmap.h, yes, no, ``global_fieldmap``, reads map and tileset data masks include/fieldmap.h, yes, no, ``constants_fieldmap``, reads tileset related constants - src/event_object_movement.c, yes, no, ``initial_facing_table``, reads ``gInitialMovementTypeFacingDirections`` - src/pokemon_icon.c, yes, no, ``pokemon_icon_table``, reads files in ``gMonIconTable`` + src/fieldmap.c, yes, no, ``fieldmap``, reads ``symbol_attribute_table`` + src/event_object_movement.c, yes, no, ``initial_facing_table``, reads ``symbol_facing_directions`` + src/pokemon_icon.c, yes, no, ``pokemon_icon_table``, reads files in ``symbol_pokemon_icon_table`` + graphics/pokemon/\*/icon.png, yes, no, ``pokemon_gfx``, to search for Pokémon icons if they aren't found in ``symbol_pokemon_icon_table`` +In addition to these files, there are some specific symbol and macro names that Porymap expects to find in your project. These can be overridden on the ``Identifiers`` tab of ``Options -> Project Settings``. The name of each setting in this section is listed in the table below under ``Override``. Overrides with ``regex`` in the name support the `regular expression syntax `_ used by Qt. + +.. figure:: images/settings-and-options/tab-identifiers.png + :alt: Files tab + +.. _identifiers: + +.. csv-table:: + :header: Override,Default,Notes + :widths: 20, 20, 30 + + ``symbol_facing_directions``, ``gInitialMovementTypeFacingDirections``, to set sprite frame for Object Events based on movement type + ``symbol_obj_event_gfx_pointers``, ``gObjectEventGraphicsInfoPointers``, to map Object Event graphics IDs to graphics data + ``symbol_pokemon_icon_table``, ``gMonIconTable``, to map species constants to icon images + ``symbol_wild_encounters``, ``gWildMonHeaders``, output as the ``label`` property for the top-level wild ecounters JSON object + ``symbol_heal_locations``, ``sHealLocations``, only if ``Respawn Map/NPC`` is disabled + ``symbol_spawn_points``, ``sSpawnPoints``, only if ``Respawn Map/NPC`` is enabled + ``symbol_spawn_maps``, ``sWhiteoutRespawnHealCenterMapIdxs``, values for Heal Locations ``Respawn Map`` field + ``symbol_spawn_npcs``, ``sWhiteoutRespawnHealerNpcIds``, values for Heal Locations ``Respawn NPC`` field + ``symbol_attribute_table``, ``sMetatileAttrMasks``, optionally read to get settings on ``Tilesets`` tab + ``symbol_tilesets_prefix``, ``gTileset_``, for new tileset names and to extract base tileset names + ``define_obj_event_count``, ``OBJECT_EVENT_TEMPLATES_COUNT``, to limit total Object Events + ``define_min_level``, ``MIN_LEVEL``, minimum wild encounters level + ``define_max_level``, ``MAX_LEVEL``, maximum wild encounters level + ``define_tiles_primary``, ``NUM_TILES_IN_PRIMARY``, + ``define_tiles_total``, ``NUM_TILES_TOTAL``, + ``define_metatiles_primary``, ``NUM_METATILES_IN_PRIMARY``, total metatiles are calculated using metatile ID mask + ``define_pals_primary``, ``NUM_PALS_IN_PRIMARY``, + ``define_pals_total``, ``NUM_PALS_TOTAL``, + ``define_map_size``, ``MAX_MAP_DATA_SIZE``, to limit map dimensions + ``define_mask_metatile``, ``MAPGRID_METATILE_ID_MASK``, optionally read to get settings on ``Maps`` tab + ``define_mask_collision``, ``MAPGRID_COLLISION_MASK``, optionally read to get settings on ``Maps`` tab + ``define_mask_elevation``, ``MAPGRID_ELEVATION_MASK``, optionally read to get settings on ``Maps`` tab + ``define_mask_behavior``, ``METATILE_ATTR_BEHAVIOR_MASK``, optionally read to get settings on ``Tilesets`` tab + ``define_mask_layer``, ``METATILE_ATTR_LAYER_MASK``, optionally read to get settings on ``Tilesets`` tab + ``define_attribute_behavior``, ``METATILE_ATTRIBUTE_BEHAVIOR``, name used to extract setting from ``symbol_attribute_table`` + ``define_attribute_layer``, ``METATILE_ATTRIBUTE_LAYER_TYPE``, name used to extract setting from ``symbol_attribute_table`` + ``define_attribute_terrain``, ``METATILE_ATTRIBUTE_TERRAIN``, name used to extract setting from ``symbol_attribute_table`` + ``define_attribute_encounter``, ``METATILE_ATTRIBUTE_ENCOUNTER_TYPE``, name used to extract setting from ``symbol_attribute_table`` + ``define_metatile_label_prefix``, ``METATILE_``, expected prefix for metatile label macro names + ``define_heal_locations_prefix``, ``HEAL_LOCATION_``, output as prefix for Heal Location IDs if ``Respawn Map/NPC`` is disabled + ``define_spawn_prefix``, ``SPAWN_``, output as prefix for Heal Location IDs if ``Respawn Map/NPC`` is enabled + ``define_map_prefix``, ``MAP_``, expected prefix for map macro names + ``define_map_dynamic``, ``DYNAMIC``, macro name after prefix for Dynamic maps + ``define_map_empty``, ``UNDEFINED``, macro name after prefix for empty maps + ``define_map_section_prefix``, ``MAPSEC_``, expected prefix for location macro names + ``define_map_section_empty``, ``NONE``, macro name after prefix for empty region map sections + ``define_map_section_count``, ``COUNT``, macro name after prefix for total number of region map sections + ``regex_behaviors``, ``\bMB_``, regex to find metatile behavior macro names + ``regex_obj_event_gfx``, ``\bOBJ_EVENT_GFX_``, regex to find Object Event graphics ID macro names + ``regex_items``, ``\bITEM_(?!(B_)?USE_)``, regex to find item macro names + ``regex_flags``, ``\bFLAG_``, regex to find flag macro names + ``regex_vars``, ``\bVAR_``, regex to find var macro names + ``regex_movement_types``, ``\bMOVEMENT_TYPE_``, regex to find movement type macro names + ``regex_map_types``, ``\bMAP_TYPE_``, regex to find map type macro names + ``regex_battle_scenes``, ``\bMAP_BATTLE_SCENE_``, regex to find battle scene macro names + ``regex_weather``, ``\bWEATHER_``, regex to find map weather macro names + ``regex_coord_event_weather``, ``\bCOORD_EVENT_WEATHER_``, regex to find weather trigger macro names + ``regex_secret_bases``, ``\bSECRET_BASE_[A-Za-z0-9_]*_[0-9]+``, regex to find secret base ID macro names + ``regex_sign_facing_directions``, ``\bBG_EVENT_PLAYER_FACING_``, regex to find sign facing direction macro names + ``regex_trainer_types``, ``\bTRAINER_TYPE_``, regex to find trainer type macro names + ``regex_music``, ``\b(SE|MUS)_``, regex to find music macro names + ``regex_species``, ``\bSPECIES_``, regex to find species macro names diff --git a/docs/_sources/manual/scripting-capabilities.rst.txt b/docs/_sources/manual/scripting-capabilities.rst.txt index c191d6f6..62044464 100644 --- a/docs/_sources/manual/scripting-capabilities.rst.txt +++ b/docs/_sources/manual/scripting-capabilities.rst.txt @@ -11,32 +11,71 @@ Porymap is extensible via scripting capabilities. This allows the user to write - Procedurally Generated Maps - Randomize Grass Patterns + +Custom Scripts Editor +--------------------- + +Your custom scripts can be managed with the Custom Scripts Editor accessible under ``Options -> Custom Scripts...``. + +.. figure:: images/scripting-capabilities/custom-scripts-editor.png + :alt: Custom Scripts Editor + :width: 60% + :align: center + + Custom Scripts Editor + +At the top there are three basic buttons for managing your scripts: + - |button-create| Opens a prompt to create a new script file, which will be populated with a basic template. + - |button-load| Lets you add an existing script file to Porymap that you've already created or downloaded from elsewhere. + - |button-refresh| Any edits made to your scripts while Porymap is already open will not be reflected until you select this button. + +Below these buttons is a list of all the custom scripts you have loaded for your project. Each entry will have a text box showing the path of the script file. This path can be freely updated, or you can choose a new path with the |button-folder| button next to it. The |button-edit| button will open the script file in your default text editor, and the |button-remove| button will remove it from the list. The check box to the left of the filepath indicates whether your script should be running. If you'd like to temporarily disable a script you can uncheck this box. + +.. |button-create| image:: images/scripting-capabilities/button-create.png + :height: 24 +.. |button-load| image:: images/scripting-capabilities/button-load.png + :height: 24 +.. |button-refresh| image:: images/scripting-capabilities/button-refresh.png + :height: 24 +.. |button-folder| image:: images/scripting-capabilities/folder.png + :width: 24 + :height: 24 +.. |button-edit| image:: images/scripting-capabilities/file_edit.png + :width: 24 + :height: 24 +.. |button-remove| image:: images/scripting-capabilities/delete.png + :width: 24 + :height: 24 + + Writing a Custom Script ----------------------- Let's write a custom script that will randomize grass patterns when the user is editing the map. This is useful, since it's cumbersome to manually add randomness to grass patches. With the custom script, it will happen automatically. Whenever the user paints a grass tile onto the map, the script will overwrite the tile with a random grass tile instead. -First, create a new script file called ``my_script.js``--place it in the project directory (e.g. ``pokefirered/``). +First, open the ``Options -> Custom Scripts...`` window and select the |button-create| button. This will open a file save prompt; let's name our new script file ``my_script.js`` and save it. We've successfully added a new script! We can now see it listed in the editor. -Next, open the Porymap project config file, ``porymap.user.cfg``, in the project directory. Add the script file to the ``custom_scripts`` configuration value. Multiple script files can be loaded by separating the filepaths with a comma. +.. figure:: images/scripting-capabilities/new-script.png + :alt: Our New Script + :width: 60% + :align: center -.. code-block:: - - custom_scripts=my_script.js - -Now that Porymap is configured to load the script file, let's write the actual code that will power the grass-randomizer. Scripts have access to several "callbacks" for events that occur while Porymap is running. This means our script can define functions for each of these callbacks. We're interested in the ``onBlockChanged()`` callback, since we want our script to take action whenever a user paints a block on the map. +At the moment our script doesn't do anything. Let's select the |button-edit| button to open it and write the actual code that will power the grass-randomizer. Once the script file is open you will notice that there are several empty functions already inside. These are special "callback" functions that will be called automatically for certain events that occur while Porymap is running. We're interested in the ``onBlockChanged()`` callback, since we want our script to take action whenever a user paints a block on the map. .. code-block:: js - - // Porymap callback when a block is painted. - export function onBlockChanged(x, y, prevBlock, newBlock) { - // Grass-randomizing logic goes here. - } + + // Porymap callback when a block is painted. + export function onBlockChanged(x, y, prevBlock, newBlock) { + // Grass-randomizing logic goes here. + } -It's very **important** to remember to ``export`` the callback functions in the script. Otherwise, Porymap will not be able to execute them. +We can leave the rest of the callback functions in here alone, or we can delete them because we're not using them. Every callback function does not need to be defined in your script. **Note**: For Porymap to be able to execute these callback functions they need to have the ``export`` keyword. The rest of the functions in your script do not need this keyword. In addition to the callbacks, Porymap also supports a scripting API so that the script can interact with Porymap in interesting ways. For example, a script can change a block or add overlay text on the map. Since we want to paint random grass tiles, we'll be using the ``map.setMetatileId()`` function. Let's fill in the rest of the grass-randomizing code. +.. note:: + **For pokeemerald/pokeruby users**: We only have 1 regular grass metatile, but if you want to try this script you could replace ``const grassTiles = [0x8, 0x9, 0x10, 0x11];`` in the code below with ``const grassTiles = [0x1, 0x4, 0xD];`` to randomize using tall grass and flowers instead! + .. code-block:: js function randInt(min, max) { @@ -58,7 +97,14 @@ In addition to the callbacks, Porymap also supports a scripting API so that the } } -Let's test the script out by re-launching Porymap. If we try to paint grass on the map, we should see our script inserting a nice randomized grass pattern. +Let's apply our changes by selecting the |button-refresh| button. Because we've added a new script we'll be met with this confirmation prompt. Accept this prompt by selecting ``YES``. + +.. figure:: images/scripting-capabilities/refresh-prompt.png + :alt: Refresh Scripts Prompt + :width: 60% + :align: center + +Now let's test our script! If we try to paint grass on the map, we should see our script inserting a nice randomized grass pattern. .. figure:: images/scripting-capabilities/porymap-scripting-grass.gif :alt: Grass-Randomizing Script @@ -81,7 +127,7 @@ The grass-randomizer script above happens implicitly when the user paints on the utility.registerAction("applyNightTint", "View Night Tint", "T") } -Then, to trigger the ``applyNightTint()`` function, we could either click ``Tools -> View Night Tint`` or use the ``T`` keyboard shortcut. +Then, to trigger the ``applyNightTint()`` function, we could either click ``Tools -> View Night Tint`` or use the ``T`` keyboard shortcut. **Note**: Like callbacks, functions registered using ``utility.registerAction()`` also need the ``export`` keyword for Porymap to call them. Now that we have an overview of how to utilize Porymap's scripting capabilities, the entire scripting API is documented below. diff --git a/docs/_sources/manual/settings-and-options.rst.txt b/docs/_sources/manual/settings-and-options.rst.txt index 3679f3d7..8a2624c6 100644 --- a/docs/_sources/manual/settings-and-options.rst.txt +++ b/docs/_sources/manual/settings-and-options.rst.txt @@ -5,66 +5,273 @@ Porymap Settings **************** Porymap uses config files to read and store user and project settings. + +=============== +Global settings +=============== + A global settings file is stored in a platform-dependent location for app configuration files (``%Appdata%\pret\porymap\porymap.cfg`` on Windows, ``~/Library/Application\ Support/pret/porymap/porymap.cfg`` on macOS). -A config file is also created when opening a project in porymap for the first time. It is stored in -your project root as ``porymap.project.cfg``. There are several project-specific settings that are -determined by this file. You may want to force commit this file so that other users will automatically have access to your project settings. +A selection of the settings in this file can be edited under ``Preferences...``, and the rest are updated automatically while using Porymap. -A second config file is created for user-specific settings. It is stored in -your project root as ``porymap.user.cfg``. You should add this file to your gitignore. +================ +Project settings +================ -.. csv-table:: - :header: Setting,Default,Location,Can Edit?,Description - :widths: 10, 3, 5, 5, 20 + * :ref:`General ` + * :ref:`Maps ` + * :ref:`Tilesets ` + * :ref:`Events ` + * :ref:`Files & Identifiers ` - ``recent_project``, , global, yes, The project that will be opened on launch - ``reopen_on_launch``, 1, global, yes, Whether the most recent project should be opened on launch - ``recent_map``, , user, yes, The map that will be opened on launch - ``pretty_cursors``, 1, global, yes, Whether to use custom crosshair cursors - ``map_sort_order``, group, global, yes, The order map list is sorted in - ``window_geometry``, , global, no, For restoring window sizes - ``window_state``, , global, no, For restoring window sizes - ``map_splitter_state``, , global, no, For restoring window sizes - ``main_splitter_state``, , global, no, For restoring window sizes - ``collision_opacity``, 50, global, yes, Opacity of collision overlay - ``metatiles_zoom``, 30, global, yes, Scale of map metatiles - ``show_player_view``, 0, global, yes, Display a rectangle for the GBA screen radius - ``show_cursor_tile``, 0, global, yes, Display a rectangle around the hovered metatile(s) - ``monitor_files``, 1, global, yes, Whether porymap will monitor changes to project files - ``tileset_checkerboard_fill``, 1, global, yes, Whether new tilesets will be filled with a checkerboard pattern of metatiles. - ``theme``, default, global, yes, The color theme for porymap windows and widgets - ``text_editor_goto_line``, , global, yes, The command that will be executed when clicking the button next the ``Script`` combo-box. - ``text_editor_open_directory``, , global, yes, The command that will be executed when clicking ``Open Project in Text Editor``. - ``base_game_version``, , project, no, The base pret repo for this project - ``use_encounter_json``, 1, user, yes, Enables wild encounter table editing - ``use_poryscript``, 0, project, yes, Whether to open .pory files for scripts - ``use_custom_border_size``, 0, project, yes, Whether to allow variable border sizes - ``enable_event_weather_trigger``, 1 if not ``pokefirered``, project, yes, Allows adding Weather Trigger events - ``enable_event_secret_base``, 1 if not ``pokefirered``, project, yes, Allows adding Secret Base events - ``enable_event_clone_object``, 1 if ``pokefirered``, project, yes, Allows adding Clone Object events - ``enable_hidden_item_quantity``, 1 if ``pokefirered``, project, yes, Adds ``Quantity`` to Hidden Item events - ``enable_hidden_item_requires_itemfinder``, 1 if ``pokefirered``, project, yes, Adds ``Requires Itemfinder`` to Hidden Item events - ``enable_heal_location_respawn_data``, 1 if ``pokefirered``, project, yes, Adds ``Respawn Map`` and ``Respawn NPC`` to Heal Location events - ``enable_floor_number``, 1 if ``pokefirered``, project, yes, Adds ``Floor Number`` to map headers - ``enable_map_allow_flags``, 1 if not ``pokeruby``, project, yes, "Adds ``Allow Running``, ``Allow Biking``, and ``Allow Dig & Escape Rope`` to map headers" - ``create_map_text_file``, 1 if not ``pokeemerald``, project, yes, A ``text.inc`` or ``text.pory`` file will be created for any new map - ``enable_triple_layer_metatiles``, 0, project, yes, Enables triple-layer metatiles (See https://github.com/pret/pokeemerald/wiki/Triple-layer-metatiles) - ``new_map_metatile``, 1, project, yes, The metatile id that will be used to fill new maps - ``new_map_elevation``, 3, project, yes, The elevation that will be used to fill new maps - ``new_map_border_metatiles``, "``468,469,476,477`` or ``20,21,28,29``", project, yes, The list of metatile ids that will be used to fill the 2x2 border of new maps - ``default_primary_tileset``, ``gTileset_General``, project, yes, The label of the default primary tileset - ``default_secondary_tileset``, ``gTileset_Petalburg`` or ``gTileset_PalletTown``, project, yes, The label of the default secondary tileset - ``custom_scripts``, , user, yes, A list of script files to load into the scripting engine - ``prefabs_filepath``, ``/prefabs.json``, project, yes, The filepath containing prefab JSON data - ``prefabs_import_prompted``, 0, project, no, Keeps track of whether or not the project was prompted for importing default prefabs - ``tilesets_have_callback``, 1, project, yes, Whether new tileset headers should have the ``callback`` field - ``tilesets_have_is_compressed``, 1, project, yes, Whether new tileset headers should have the ``isCompressed`` field - ``metatile_attributes_size``, 2 or 4, project, yes, The number of attribute bytes each metatile has - ``metatile_behavior_mask``, ``0xFF`` or ``0x1FF``, project, yes, The mask for the metatile Behavior attribute - ``metatile_encounter_type_mask``, ``0x0`` or ``0x7000000``, project, yes, The mask for the metatile Encounter Type attribute - ``metatile_layer_type_mask``, ``0xF000`` or ``0x60000000``, project, yes, The mask for the metatile Layer Type attribute - ``metatile_terrain_type_mask``, ``0x0`` or ``0x3E00``, project, yes, The mask for the metatile Terrain Type attribute +A config file for project-specific settings is also created when opening a project in porymap for the first time. It is stored in your project root as ``porymap.project.cfg``. You may want to force commit this file so that other users will automatically have access to your project settings. + +A second config file is created for user-specific settings. It is stored in your project root as ``porymap.user.cfg``. You should add this file to your gitignore. + +The settings in ``porymap.project.cfg`` and ``porymap.user.cfg`` can be edited under ``Options -> Project Settings...``. Any changes made in this window will not take effect unless confirmed by selecting ``OK`` and then reloading the project. + +.. |button-folder| image:: images/scripting-capabilities/folder.png + :width: 24 + :height: 24 + +.. |button-import-defaults| image:: images/settings-and-options/import-defaults.png + :height: 24 + +.. |button-restore-defaults| image:: images/settings-and-options/restore-defaults.png + :height: 24 + +.. |pokemon-icon-placeholder| image:: images/settings-and-options/pokemon-icon-placeholder.png + :width: 24 + :height: 24 + + +.. _general: + +General +------- + +.. figure:: images/settings-and-options/tab-general.png + :alt: General tab + +Use Poryscript + If this is checked, a ``scripts.pory`` (and ``text.pory``, if applicable) file will be created alongside new maps, instead of a ``scripts.inc`` file. Additionally, ``.pory`` files will be considered when searching for scripts labels and when opening scripts files (in addition to the regular ``.inc`` files). + + Defaults to ``unchecked``. + +Show Wild Encounter Tables + If this is checked, the ``Wild Pokemon`` tab will be enabled and wild encounter data will be read from the project's encounters JSON file. + + Defaults to ``checked``. If no encounters JSON file is found this will be automatically unchecked. + +Prefabs + ``Prefabs Path`` is the file path to a ``.json`` file that contains definitions of prefabs. This will be used to populate the ``Prefabs`` panel on the ``Map`` tab. If no path is specified prefabs will be saved to a new ``prefabs.json`` file in the root project folder. A new file can be selected with the |button-folder| button or by editing the file path. + + The |button-import-defaults| button will populate the specified file with version-specific prefabs constructed using the vanilla tilesets. This will overwrite any existing prefabs. + +Collision Graphics + ``Image Path`` is a path to any image file you'd like to use to represent collision and elevation values on the ``Collision`` tab. A new file can be selected with the |button-folder| button or by editing the file path. The image will be evenly divided into segments, with each row representing an elevation value (starting with ``0`` at the top) and each column representing a collision value (starting with ``0`` on the left). + + Your image does not need to have a row/column for every valid elevation/collision value (for instance, the default collision values range from ``0-3``, but because ``2-3`` are semantically the same as ``1`` they are not displayed). You can specify the highest elevation and collision value represented on your image with ``Max Elevation`` and ``Max Collision``. + + Note: Images with transparency may not function correctly when displayed on the map. + + The filepath defaults empty, which will use `Porymap's original image `_. ``Max Elevation`` and ``Max Collision`` default to ``15`` and ``1`` respectively. + +Pokémon Icons + Porymap can display Pokémon species icons that it reads from your project on the ``Wild Pokemon`` tab. If Porymap fails to load your icon image, or if you'd like to display your own icon in Porymap for any reason, you can select a new image with the |button-folder| button or by editing the file path. You can select a species with the dropdown to edit the path for a different icon. + + If your custom icon or the default icon fails to load a |pokemon-icon-placeholder| icon will be displayed. + + Defaults to empty (the path in your project where Porymap expects to find each icon). + +Base Game Version + This is the name of the base pret repository for this project. Changing this setting will prompt you to restore the default project settings for any of the three versions. You can also do this for the currently-selected base game version by selecting |button-restore-defaults| at the bottom of the window. Aside from determining the default settings in this window, the base game version also determines the default settings when initializing the region map and when importing default prefabs. + + Defaults to ``pokeruby``, ``pokefirered``, or ``pokeemerald`` depending on the project folder name. If the folder name doesn't match you will be prompted to select a version on first launch. + +.. _maps: + +Maps +---- + +.. figure:: images/settings-and-options/tab-maps.png + :alt: Maps tab + +Map Data Defaults + Border Metatiles + This is list of metatile ID values that will be used to fill the border on new maps. The spin boxes correspond to the top-left, top-right, bottom-left, and bottom-right border metatiles respectively. + + If ``Enable Custom Border Size`` is checked, this will instead be a comma-separated list of metatile ID values that will be used to fill the border on new maps. Values in the list will be read sequentially to fill the new border left-to-right top-to-bottom. If the number of metatiles in the border for a new map is not the same as the number of values in the list then the border will be filled with metatile ID ``0x000`` instead. + + Defaults to ``0x014``, ``0x015``, ``0x01C``, ``0x01D`` for ``pokefirered``, and ``0x1D4``, ``0x1D5``, ``0x1DC``, ``0x1DD`` for other versions. + + Metatile ID + This is the metatile ID value that will be used to fill new maps. + + Defaults to ``0x1``. + + Collision + This is the collision value that will be used to fill new maps. It will also be used to set the default selection on the Collision tab when the project is first opened. + + Defaults to ``0``. + + Elevation + This is the elevation value that will be used to fill new maps. It will also be used to set the default selection on the Collision tab when the project is first opened. + + Defaults to ``3``. + + Create separate text file + If this is checked, a ``text.inc`` (or ``text.pory``) file will be created alongside new maps. + + Defaults to ``unchecked`` for ``pokeemerald`` and ``checked`` for other versions. + +Map Data Layout + Each of these three settings are bit masks that will be used to read and write an attribute of the data that makes up each map space (metatile ID, collision, and elevation). A warning will be displayed if any of the masks overlap. Their values may be read from ``#define`` s in your project, in which case editing will be disabled and you can change their values by modifying them in your project. + + Default to being read from ``MAPGRID_METATILE_ID_MASK``, ``MAPGRID_COLLISION_MASK``, and ``MAPGRID_ELEVATION_MASK``. If they can't be read, they default to ``0x3FF``, ``0xC00``, and ``0xF000`` respectively. + +Enable 'Floor Number' + If this is checked, a ``Floor Number`` option will become available on the ``Header`` tab and on the new map prompt. For more information see `Editing Map Headers `_. + + Defaults to ``checked`` for ``pokefirered`` and ``unchecked`` for other versions. + +Enable 'Allow Running/Biking/Escaping' + If this is checked, ``Allow Running``, ``Allow Biking``, and ``Allow Dig & Escape Rope`` options will become available on the ``Header`` tab and on the new map prompt. For more information see `Editing Map Headers `_. + + Defaults to ``unchecked`` for ``pokeruby`` and ``checked`` for other versions. + +Enable Custom Border Size + If this is checked, ``Border Width`` and ``Border Height`` options will become available under the ``Change Dimensions`` button and on the new map prompt. If it is unchecked all maps will use the default 2x2 dimensions. + + Defaults to ``checked`` for ``pokefirered`` and ``unchecked`` for other versions. + +.. _tilesets: + +Tilesets +-------- + +.. figure:: images/settings-and-options/tab-tilesets.png + :alt: Tilesets tab + +Default Primary/Secondary Tilesest + These will be the initially-selected tilesets when creating a new map, and will be used if a layout's tileset fails to load. If a default tileset is not found then the first tileset in the respective list will be used instead. + + The default primary tileset is ``gTileset_General``. + + The default secondary tileset is ``gTileset_PalletTown`` for ``pokefirered``, and ``gTileset_Petalburg`` for other versions. + +Enable Triple Layer Metatiles + Metatile data normally consists of 2 layers with 4 tiles each. If this is checked, they should instead consist of 3 layers with 4 tiles each. Additionally, the ``Layer Type`` option in the ``Tileset Editor`` will be removed. Note that layer type data will still be read and written according to your ``Layer Type mask`` setting. + + For details on supporting this setting in your project, see https://github.com/pret/pokeemerald/wiki/Triple-layer-metatiles. + + Defaults to ``unchecked`` + +Attributes size + The number of bytes used per metatile for metatile attributes. The data in each of your project's ``metatile_attributes.bin`` files will be expected to be ``s * n``, where ``s`` is this size and ``n`` is the number of metatiles in the tileset. Additionally, new ``metatile_attributes.bin`` will be included in the project with a corresponding ``INCBIN_U8``, ``INCBIN_U16``, or ``INCBIN_U32`` directive. + + Changing this setting will automatically enforce the new limit on the metatile attribute mask settings. + + Defaults to ``4`` for ``pokefirered`` and ``2`` for other versions. + +Attribute masks + Each of these four settings are bit masks that will be used to read and write a specific metatile attribute from the metatile attributes data. If you are instead importing metatile attribute data from AdvanceMap, a default mask value will be used to read the data, and the mask value specified here will be used to write the new file. + + If any of the mask values are set to ``0x0``, the corresponding option in the Tileset Editor will be removed. The maximum for all the attribute masks is determined by the Attributes size setting. A warning will be displayed if any of the masks overlap. + + - Metatile Behavior mask + This is the mask value for the ``Metatile Behavior`` metatile attribute. + + Defaults to being read from ``sMetatileAttrMasks`` or ``METATILE_ATTR_BEHAVIOR_MASK``. If these can't be read, defaults to ``0x1FF`` for ``pokefirered``, and ``0xFF`` for other versions. + + - Layer Type mask + This is the mask value for the ``Layer Type`` metatile attribute. If the value is set to ``0x0`` the ``Layer Type`` option will be disabled in the Tileset Editor, and all metatiles will be treated in the editor as if they had the ``Normal`` layer type. + + Defaults to being read from ``sMetatileAttrMasks`` or ``METATILE_ATTR_LAYER_MASK``. If these can't be read, defaults to ``0x60000000`` for ``pokefirered``, and ``0xF000`` for other versions. + + - Encounter Type mask + This is the mask value for the ``Encounter Type`` metatile attribute. + + Defaults to being read from ``sMetatileAttrMasks``. If this can't be read, defaults to ``0x7000000`` for ``pokefirered``, and ``0x0`` for other versions. + + - Terrain Type mask + This is the mask value for the ``Terrain Type`` metatile attribute. + + Defaults to being read from ``sMetatileAttrMasks``. If this can't be read, defaults to ``0x3E00`` for ``pokefirered``, and ``0x0`` for other versions. + +Output 'callback' and 'isCompressed' fields + If these are checked, then ``callback`` and ``isCompressed`` fields will be output in the C data for new tilesets. Their default values will be ``NULL`` and ``TRUE``, respectively. + + Defaults to ``checked`` for both. + +.. _events: + +Events +------ + +.. figure:: images/settings-and-options/tab-events.png + :alt: Events tab + +Default Icons + Each event group is represented by a unique icon on the ``Events`` tab of the main editor. Here you can provide filepaths to your own image files to replace these icons, either by selecting the |button-folder| button or by editing the file path directly. + + Events in the ``Objects`` group will only use this icon if there are no graphics associated with their ``Sprite`` field. + + The filepaths default to empty, which will use `Porymap's original icons `_. + +Warp Behaviors + By default, Warp Events only function as exits if they're positioned on a metatile whose Metatile Behavior is treated specially in your project's code. If any Warp Events are positioned on a metatile that doesn't have one of these behaviors they will display a warning. Here you can disable that warning, or edit the list of behavior names that will silence the warning. + + Defaults to ``unchecked``, i.e. the warning is enabled. The list of behaviors is initially populated with all the vanilla warp behavior names across pokeemerald, pokefirered, and pokeruby. + +Enable Clone Objects + If this is checked Clone Object Events will be available on the ``Events`` tab. For more information see `Clone Object Events `_. + + Defaults to ``checked`` for ``pokefirered`` and ``unchecked`` for other versions. + +Enable Secret Bases + If this is checked Secret Base Events will be available on the ``Events`` tab. For more information see `Secret Base Events `_. + + Defaults to ``unchecked`` for ``pokefirered`` and ``checked`` for other versions. + +Enable Weather Triggers + If this is checked Weather Trigger Events will be available on the ``Events`` tab. For more information see `Weather Trigger Events `_. + + Defaults to ``unchecked`` for ``pokefirered`` and ``checked`` for other versions. + +Enable 'Quantity' for Hidden Items + If this is checked the ``Quantity`` property will be available for Hidden Item Events. For more information see `Hidden Item Events `_. + + Defaults to ``checked`` for ``pokefirered`` and ``unchecked`` for other versions. + +Enable 'Requires Itemfinder' for Hidden Items + If this is checked the ``Requires Itemfinder`` property will be available for Hidden Item Events. For more information see `Hidden Item Events `_. + + Defaults to ``checked`` for ``pokefirered`` and ``unchecked`` for other versions. + +Enable 'Repsawn Map/NPC' for Heal Locations + If this is checked the ``Respawn Map`` and ``Respawn NPC`` properties will be available for Heal Location events. For more information see `Heal Locations `_. + + Defaults to ``checked`` for ``pokefirered`` and ``unchecked`` for other versions. + + +.. _files-identifiers: + +Files & Identifiers +------------------- + +.. figure:: images/settings-and-options/tab-files.png + :alt: Files tab + +.. figure:: images/settings-and-options/tab-identifiers.png + :alt: Identifiers tab + +These two tabs provide a way to override the filepaths and symbol/macro names Porymap expects to find in your project. + +For ``Files``, each can be overridden by typing a new path or selecting a file/folder with the |button-folder| button. Paths are expected to be relative to the root project folder. If no path is specified, or if the file/folder specified does not exist, then the default path will be used instead. + +For ``Identifiers``, each can be overridden by typing a new name in the line edit. Overrides with ``regex`` in the name support the `regular expression syntax `_ used by Qt. + +For more information on what each of these overrides does, see `Project Files `_. -Some of these settings can be toggled manually in porymap via the *Options* menu. diff --git a/docs/_sources/reference/CHANGELOG.md.txt b/docs/_sources/reference/CHANGELOG.md.txt index 24276954..cb19c2fa 100644 --- a/docs/_sources/reference/CHANGELOG.md.txt +++ b/docs/_sources/reference/CHANGELOG.md.txt @@ -7,11 +7,49 @@ and this project somewhat adheres to [Semantic Versioning](https://semver.org/sp The **"Breaking Changes"** listed below are changes that have been made in the decompilation projects (e.g. pokeemerald), which porymap requires in order to work properly. It also includes changes to the scripting API that may change the behavior of existing porymap scripts. If porymap is used with a project or API script that is not up-to-date with the breaking changes, then porymap will likely break or behave improperly. ## [Unreleased] +### Added +- Add an editor window under `Options -> Project Settings...` to customize the project-specific settings in `porymap.project.cfg` and `porymap.user.cfg`. +- Add an editor window under `Options -> Custom Scripts...` for Porymap's API scripts. +- Add an `Open Recent Project` menu +- Add a warning to warp events if they're on an incompatible metatile behavior. +- Add settings for custom images, including the collision graphics, default event icons, and pokémon icons. +- Add settings to override any symbol or macro names Porymap expects to find. +- Add a zoom slider to the Collision tab. +- Add toggleable grids to the Tileset Editor. +- Support for custom metatile ID, collision, and elevation data sizes. +- Support for 8bpp tileset tile images. + ### Changed +- `Script` dropdowns now include scripts from the current map's scripts file. +- Encounter Rate now defaults to the most commonly used value, rather than 0. +- The Collision tab now allows selection of any valid elevation/collision value. - The Palette Editor now remembers the Bit Depth setting. +- The min/max levels on the Wild Pokémon tab will now adjust automatically if they invalidate each other. +- If the recent project directory doesn't exist Porymap will open an empty project instead of failing with a misleading error message. +- Settings under `Options` were relocated either to the `Preferences` window or `Options -> Project Settings`. +- Secret Base and Weather Trigger events are automatically disabled if their respective constants files fail to parse, instead of not opening the project. +- If a Pokémon icon fails to load Porymap will attempt to predict its filepath. If this also fails it will appear with a placeholder icon, and won't disappear when edited. +- The bits in metatile attribute masks are now allowed to be non-contiguous. +- Porymap will now attempt to read metatile attribute masks from the project. ### Fixed - Fix text boxes in the Palette Editor calculating color incorrectly. +- Fix metatile labels being sorted incorrectly for tileset names with multiple underscores. +- Fix default object sprites retaining dimensions and transparency of the previous sprite. +- Fix connections not being deleted when the map name text box is cleared. +- Fix the map border not updating when a tileset is changed. +- Improve the poor speed of the API functions `setMetatileTile` and `setMetatileTiles`. +- Stop the Tileset Editor from scrolling to the initially selected metatile when saving. +- Fix `0x0`/`NULL` appearing more than once in the scripts dropdown. +- Fix the selection outline sticking in single-tile mode on the Prefab tab. +- Fix heal location data being cleared if certain spaces aren't used in the table. +- Fix bad URL color contrast on dark themes. +- Fix some issues when too few/many pokémon are specified for a wild encounter group. +- Fix Porymap reporting errors for macros it doesn't use. +- Fix painting on the Collision tab with the opacity slider at 0 painting metatiles. +- Fix crashes when File->Reload Project fails. +- Fix overworld sprite facing directions if spritesheet has vertical layout. +- Stop reporting `Error: Interrupted` for custom scripts during project reopen ## [5.1.1] - 2023-02-20 ### Added diff --git a/docs/_static/ajax-loader.gif b/docs/_static/ajax-loader.gif new file mode 100644 index 00000000..61faf8ca Binary files /dev/null and b/docs/_static/ajax-loader.gif differ diff --git a/docs/_static/basic.css b/docs/_static/basic.css index 7577acb1..0807176e 100644 --- a/docs/_static/basic.css +++ b/docs/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -15,12 +15,6 @@ div.clearer { clear: both; } -div.section::after { - display: block; - content: ''; - clear: left; -} - /* -- relbar ---------------------------------------------------------------- */ div.related { @@ -130,7 +124,7 @@ ul.search li a { font-weight: bold; } -ul.search li p.context { +ul.search li div.context { color: #888; margin: 2px 0 0 30px; text-align: left; @@ -222,7 +216,7 @@ table.modindextable td { /* -- general body styles --------------------------------------------------- */ div.body { - min-width: 360px; + min-width: 450px; max-width: 800px; } @@ -267,25 +261,19 @@ p.rubric { font-weight: bold; } -img.align-left, figure.align-left, .figure.align-left, object.align-left { +img.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } -img.align-right, figure.align-right, .figure.align-right, object.align-right { +img.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { +img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; @@ -299,45 +287,30 @@ img.align-default, figure.align-default, .figure.align-default { text-align: center; } -.align-default { - text-align: center; -} - .align-right { text-align: right; } /* -- sidebars -------------------------------------------------------------- */ -div.sidebar, -aside.sidebar { +div.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; - padding: 7px; + padding: 7px 7px 0 7px; background-color: #ffe; width: 40%; float: right; - clear: right; - overflow-x: auto; } p.sidebar-title { font-weight: bold; } -nav.contents, -aside.topic, -div.admonition, div.topic, blockquote { - clear: left; -} - /* -- topics ---------------------------------------------------------------- */ -nav.contents, -aside.topic, div.topic { border: 1px solid #ccc; - padding: 7px; + padding: 7px 7px 0 7px; margin: 10px 0 10px 0; } @@ -359,6 +332,10 @@ div.admonition dt { font-weight: bold; } +div.admonition dl { + margin-bottom: 0; +} + p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; @@ -369,34 +346,9 @@ div.body p.centered { margin-top: 25px; } -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -nav.contents > :last-child, -aside.topic > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -nav.contents::after, -aside.topic::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - /* -- tables ---------------------------------------------------------------- */ table.docutils { - margin-top: 10px; - margin-bottom: 10px; border: 0; border-collapse: collapse; } @@ -406,11 +358,6 @@ table.align-center { margin-right: auto; } -table.align-default { - margin-left: auto; - margin-right: auto; -} - table caption span.caption-number { font-style: italic; } @@ -426,6 +373,10 @@ table.docutils td, table.docutils th { border-bottom: 1px solid #aaa; } +table.footnote td, table.footnote th { + border: 0 !important; +} + th { text-align: left; padding-right: 5px; @@ -440,34 +391,22 @@ table.citation td { border-bottom: none; } -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - /* -- figures --------------------------------------------------------------- */ -div.figure, figure { +div.figure { margin: 0.5em; padding: 0.5em; } -div.figure p.caption, figcaption { +div.figure p.caption { padding: 0.3em; } -div.figure p.caption span.caption-number, -figcaption span.caption-number { +div.figure p.caption span.caption-number { font-style: italic; } -div.figure p.caption span.caption-text, -figcaption span.caption-text { +div.figure p.caption span.caption-text { } /* -- field list styles ----------------------------------------------------- */ @@ -494,71 +433,10 @@ table.field-list td, table.field-list th { /* -- hlist styles ---------------------------------------------------------- */ -table.hlist { - margin: 1em 0; -} - table.hlist td { vertical-align: top; } -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - /* -- other body styles ----------------------------------------------------- */ @@ -582,81 +460,11 @@ ol.upperroman { list-style: upper-roman; } -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -aside.footnote > span, -div.citation > span { - float: left; -} -aside.footnote > span:last-of-type, -div.citation > span:last-of-type { - padding-right: 0.5em; -} -aside.footnote > p { - margin-left: 2em; -} -div.citation > p { - margin-left: 4em; -} -aside.footnote > p:last-of-type, -div.citation > p:last-of-type { - margin-bottom: 0em; -} -aside.footnote > p:last-of-type:after, -div.citation > p:last-of-type:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - dl { margin-bottom: 15px; } -dd > :first-child { +dd p { margin-top: 0px; } @@ -670,11 +478,6 @@ dd { margin-left: 30px; } -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - dt:target, span.highlighted { background-color: #fbe54e; } @@ -688,6 +491,14 @@ dl.glossary dt { font-size: 1.1em; } +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + .versionmodified { font-style: italic; } @@ -726,13 +537,6 @@ dl.glossary dt { font-style: oblique; } -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - abbr, acronym { border-bottom: dotted 1px; cursor: help; @@ -745,69 +549,29 @@ pre { overflow-y: hidden; /* fixes display issues on Chrome browsers */ } -pre, div[class*="highlight-"] { - clear: both; -} - span.pre { -moz-hyphens: none; -ms-hyphens: none; -webkit-hyphens: none; hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; } td.linenos pre { + padding: 5px 0px; border: 0; background-color: transparent; color: #aaa; } table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; + margin-left: 0.5em; } table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; + padding: 0 0.5em 0 0.5em; } div.code-block-caption { - margin-top: 1em; padding: 2px 5px; font-size: small; } @@ -816,14 +580,8 @@ div.code-block-caption code { background-color: transparent; } -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ +div.code-block-caption + div > div.highlight > pre { + margin-top: 0; } div.code-block-caption span.caption-number { @@ -835,7 +593,21 @@ div.code-block-caption span.caption-text { } div.literal-block-wrapper { - margin: 1em 0; + padding: 1em 1em 0; +} + +div.literal-block-wrapper div.highlight { + margin: 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; } code.xref, a code { @@ -876,7 +648,8 @@ span.eqno { } span.eqno a.headerlink { - position: absolute; + position: relative; + left: 0px; z-index: 1; } diff --git a/docs/_static/comment-bright.png b/docs/_static/comment-bright.png new file mode 100644 index 00000000..15e27edb Binary files /dev/null and b/docs/_static/comment-bright.png differ diff --git a/docs/_static/comment-close.png b/docs/_static/comment-close.png new file mode 100644 index 00000000..4d91bcf5 Binary files /dev/null and b/docs/_static/comment-close.png differ diff --git a/docs/_static/comment.png b/docs/_static/comment.png new file mode 100644 index 00000000..dfbc0cbd Binary files /dev/null and b/docs/_static/comment.png differ diff --git a/docs/_static/css/badge_only.css b/docs/_static/css/badge_only.css index c718cee4..3c33cef5 100644 --- a/docs/_static/css/badge_only.css +++ b/docs/_static/css/badge_only.css @@ -1 +1 @@ -.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../fonts/fontawesome-webfont.eot");src:url("../fonts/fontawesome-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff") format("woff"),url("../fonts/fontawesome-webfont.ttf") format("truetype"),url("../fonts/fontawesome-webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} diff --git a/docs/_static/css/theme.css b/docs/_static/css/theme.css index c03c88f0..aed8cef0 100644 --- a/docs/_static/css/theme.css +++ b/docs/_static/css/theme.css @@ -1,4 +1,6 @@ -html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! +/* sphinx_rtd_theme version 0.4.3 | MIT license */ +/* Built 20190212 16:02 */ +*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,.rst-content code,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.5cm}p,h2,.rst-content .toctree-wrapper p.caption,h3{orphans:3;widows:3}h2,.rst-content .toctree-wrapper p.caption,h3{page-break-after:avoid}}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file + */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.7.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"),url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.wy-menu-vertical li span.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-left.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-left.toctree-expand,.rst-content .fa-pull-left.admonition-title,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content dl dt .fa-pull-left.headerlink,.rst-content p.caption .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.rst-content code.download span.fa-pull-left:first-child,.fa-pull-left.icon{margin-right:.3em}.fa.fa-pull-right,.wy-menu-vertical li span.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-right.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-right.toctree-expand,.rst-content .fa-pull-right.admonition-title,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content dl dt .fa-pull-right.headerlink,.rst-content p.caption .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.rst-content code.download span.fa-pull-right:first-child,.fa-pull-right.icon{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.wy-menu-vertical li span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content .code-block-caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.rst-content code.download span.pull-left:first-child,.pull-left.icon{margin-right:.3em}.fa.pull-right,.wy-menu-vertical li span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content .code-block-caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.rst-content code.download span.pull-right:first-child,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:""}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-signing:before,.fa-sign-language:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-vcard:before,.fa-address-card:before{content:""}.fa-vcard-o:before,.fa-address-card-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .rst-content p.caption .headerlink,.rst-content p.caption a .headerlink,a .rst-content table>caption .headerlink,.rst-content table>caption a .headerlink,a .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption a .headerlink,a .rst-content tt.download span:first-child,.rst-content tt.download a span:first-child,a .rst-content code.download span:first-child,.rst-content code.download a span:first-child,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .btn span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.btn .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .rst-content p.caption .headerlink,.rst-content p.caption .btn .headerlink,.btn .rst-content table>caption .headerlink,.rst-content table>caption .btn .headerlink,.btn .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .btn .headerlink,.btn .rst-content tt.download span:first-child,.rst-content tt.download .btn span:first-child,.btn .rst-content code.download span:first-child,.rst-content code.download .btn span:first-child,.btn .icon,.nav .fa,.nav .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand,.nav .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .rst-content p.caption .headerlink,.rst-content p.caption .nav .headerlink,.nav .rst-content table>caption .headerlink,.rst-content table>caption .nav .headerlink,.nav .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .nav .headerlink,.nav .rst-content tt.download span:first-child,.rst-content tt.download .nav span:first-child,.nav .rst-content code.download span:first-child,.rst-content code.download .nav span:first-child,.nav .icon{display:inline}.btn .fa.fa-large,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.btn .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .btn .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .btn span.fa-large:first-child,.btn .rst-content code.download span.fa-large:first-child,.rst-content code.download .btn span.fa-large:first-child,.btn .fa-large.icon,.nav .fa.fa-large,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.nav .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.nav .rst-content code.download span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.nav .fa-large.icon{line-height:.9em}.btn .fa.fa-spin,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.btn .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .btn .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .btn span.fa-spin:first-child,.btn .rst-content code.download span.fa-spin:first-child,.rst-content code.download .btn span.fa-spin:first-child,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.nav .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.nav .rst-content code.download span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.wy-menu-vertical li span.btn.toctree-expand:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.rst-content code.download span.btn:first-child:before,.btn.icon:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.rst-content code.download span.btn:first-child:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.rst-content tt.download .btn-mini span:first-child:before,.btn-mini .rst-content code.download span:first-child:before,.rst-content code.download .btn-mini span:first-child:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.admonition{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo,.rst-content .wy-alert-warning.admonition{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title,.rst-content .wy-alert-warning.admonition .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.admonition{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.admonition{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.admonition{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a{color:#2980B9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27AE60}.wy-tray-container li.wy-tray-item-info{background:#2980B9}.wy-tray-container li.wy-tray-item-warning{background:#E67E22}.wy-tray-container li.wy-tray-item-danger{background:#E74C3C}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27AE60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980B9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27AE60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#E74C3C !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#E67E22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980B9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9B59B6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980B9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980B9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 .3125em 0;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#E74C3C}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{float:left;display:block;margin-right:2.3576515979%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.3576515979%;width:48.821174201%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.3576515979%;width:31.7615656014%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type="datetime-local"]{padding:.34375em .625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129FEA}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#E74C3C;border:1px solid #E74C3C}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#E74C3C}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#E74C3C}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type="radio"][disabled],input[type="checkbox"][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{position:absolute;content:"";display:block;left:0;top:0;width:36px;height:12px;border-radius:4px;background:#ccc;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{position:absolute;content:"";display:block;width:18px;height:18px;border-radius:4px;background:#999;left:-3px;top:-3px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27AE60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#E74C3C}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #E74C3C}.wy-control-group.wy-control-group-error textarea{border:solid 1px #E74C3C}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27AE60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#E74C3C}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#E67E22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980B9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:.3em;display:block}.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px}.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980B9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9B59B6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#E67E22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980B9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27AE60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#E74C3C !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,.rst-content .toctree-wrapper p.caption,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2,.rst-content .toctree-wrapper p.caption{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}code,.rst-content tt,.rst-content code{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;color:#E74C3C;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{margin-bottom:0}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{margin-bottom:0}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:before,.wy-breadcrumbs:after{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs li code,.wy-breadcrumbs li .rst-content tt,.rst-content .wy-breadcrumbs li tt{padding:5px;border:none;background:none}.wy-breadcrumbs li code.literal,.wy-breadcrumbs li .rst-content tt.literal,.rst-content .wy-breadcrumbs li tt.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#3a7ca8;height:32px;display:inline-block;line-height:32px;padding:0 1.618em;margin:12px 0 0 0;display:block;font-weight:bold;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li code,.wy-menu-vertical li .rst-content tt,.rst-content .wy-menu-vertical li tt{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.on a:hover span.toctree-expand,.wy-menu-vertical li.current>a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand{display:block;font-size:.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a{color:#404040}.wy-menu-vertical li.toctree-l1.current li.toctree-l2>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>ul{display:none}.wy-menu-vertical li.toctree-l1.current li.toctree-l2.current>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current>ul{display:block}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{display:block;background:#c9c9c9;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3{font-size:.9em}.wy-menu-vertical li.toctree-l3.current>a{background:#bdbdbd;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{display:block;background:#bdbdbd;padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980B9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980B9;text-align:center;padding:.809em;display:block;color:#fcfcfc;margin-bottom:.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em auto;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-side-nav-search>a img.logo,.wy-side-nav-search .wy-dropdown>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search>a.icon img.logo,.wy-side-nav-search .wy-dropdown>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:normal;color:rgba(255,255,255,0.3)}.wy-nav .wy-menu-vertical header{color:#2980B9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980B9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980B9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:gray}footer p{margin-bottom:12px}footer span.commit code,footer span.commit .rst-content tt,.rst-content footer span.commit tt{padding:0px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;font-size:1em;background:none;border:none;color:gray}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{width:100%}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:before,.rst-breadcrumbs-buttons:after{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-side-scroll{width:auto}.wy-side-nav-search{width:auto}.wy-menu.wy-menu-vertical{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1100px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content img{max-width:100%;height:auto}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure p.caption{font-style:italic}.rst-content div.figure p:last-child.caption{margin-bottom:0px}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img,.rst-content .section>a>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;display:block;overflow:auto}.rst-content pre.literal-block,.rst-content div[class^='highlight']{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px 0}.rst-content pre.literal-block div[class^='highlight'],.rst-content div[class^='highlight'] div[class^='highlight']{padding:0px;border:none;margin:0}.rst-content div[class^='highlight'] td.code{width:100%}.rst-content .linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;display:block;overflow:auto}.rst-content div[class^='highlight'] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content pre.literal-block,.rst-content div[class^='highlight'] pre,.rst-content .linenodiv pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;font-size:12px;line-height:1.4}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^='highlight'],.rst-content div[class^='highlight'] pre{white-space:pre-wrap}}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last,.rst-content .admonition .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .section ol p:last-child,.rst-content .section ul p:last-child{margin-bottom:24px}.rst-content .line-block{margin-left:0px;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content .toctree-wrapper p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink{visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content .toctree-wrapper p.caption .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content p.caption .headerlink:after,.rst-content table>caption .headerlink:after,.rst-content .code-block-caption .headerlink:after{content:"";font-family:FontAwesome}.rst-content h1:hover .headerlink:after,.rst-content h2:hover .headerlink:after,.rst-content .toctree-wrapper p.caption:hover .headerlink:after,.rst-content h3:hover .headerlink:after,.rst-content h4:hover .headerlink:after,.rst-content h5:hover .headerlink:after,.rst-content h6:hover .headerlink:after,.rst-content dl dt:hover .headerlink:after,.rst-content p.caption:hover .headerlink:after,.rst-content table>caption:hover .headerlink:after,.rst-content .code-block-caption:hover .headerlink:after{visibility:visible}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#F1C40F;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:baseline;position:relative;top:-0.4em;line-height:0;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:gray}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.docutils.citation tt,.rst-content table.docutils.citation code,.rst-content table.docutils.footnote tt,.rst-content table.docutils.footnote code{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}.rst-content table.docutils td .last,.rst-content table.docutils td .last :last-child{margin-bottom:0}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content tt,.rst-content tt,.rst-content code{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;padding:2px 5px}.rst-content tt big,.rst-content tt em,.rst-content tt big,.rst-content code big,.rst-content tt em,.rst-content code em{font-size:100% !important;line-height:normal}.rst-content tt.literal,.rst-content tt.literal,.rst-content code.literal{color:#E74C3C}.rst-content tt.xref,a .rst-content tt,.rst-content tt.xref,.rst-content code.xref,a .rst-content tt,a .rst-content code{font-weight:bold;color:#404040}.rst-content pre,.rst-content kbd,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace}.rst-content a tt,.rst-content a tt,.rst-content a code{color:#2980B9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold;margin-bottom:12px}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980B9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:#555}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) code{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) code.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27AE60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}.rst-content tt.download,.rst-content code.download{background:inherit;padding:inherit;font-weight:normal;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content tt.download span:first-child,.rst-content code.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}.math{text-align:center}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-regular.eot");src:url("../fonts/Lato/lato-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-regular.woff2") format("woff2"),url("../fonts/Lato/lato-regular.woff") format("woff"),url("../fonts/Lato/lato-regular.ttf") format("truetype");font-weight:400;font-style:normal}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-bold.eot");src:url("../fonts/Lato/lato-bold.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-bold.woff2") format("woff2"),url("../fonts/Lato/lato-bold.woff") format("woff"),url("../fonts/Lato/lato-bold.ttf") format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-bolditalic.eot");src:url("../fonts/Lato/lato-bolditalic.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-bolditalic.woff2") format("woff2"),url("../fonts/Lato/lato-bolditalic.woff") format("woff"),url("../fonts/Lato/lato-bolditalic.ttf") format("truetype");font-weight:700;font-style:italic}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-italic.eot");src:url("../fonts/Lato/lato-italic.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-italic.woff2") format("woff2"),url("../fonts/Lato/lato-italic.woff") format("woff"),url("../fonts/Lato/lato-italic.ttf") format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:400;src:url("../fonts/RobotoSlab/roboto-slab.eot");src:url("../fonts/RobotoSlab/roboto-slab-v7-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.woff2") format("woff2"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.woff") format("woff"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.ttf") format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:700;src:url("../fonts/RobotoSlab/roboto-slab-v7-bold.eot");src:url("../fonts/RobotoSlab/roboto-slab-v7-bold.eot?#iefix") format("embedded-opentype"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.woff2") format("woff2"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.woff") format("woff"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.ttf") format("truetype")} diff --git a/docs/_static/doctools.js b/docs/_static/doctools.js index d06a71d7..344db17d 100644 --- a/docs/_static/doctools.js +++ b/docs/_static/doctools.js @@ -2,155 +2,314 @@ * doctools.js * ~~~~~~~~~~~ * - * Base JavaScript utilities for all Sphinx HTML documentation. + * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ -"use strict"; -const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", -]); +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); -const _ready = (callback) => { - if (document.readyState !== "loading") { - callback(); - } else { - document.addEventListener("DOMContentLoaded", callback); - } +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); }; +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var bbox = span.getBBox(); + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + var parentOfText = node.parentNode.parentNode; + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + /** * Small JavaScript module for the documentation. */ -const Documentation = { - init: () => { - Documentation.initDomainIndexTable(); - Documentation.initOnKeyListeners(); +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { + this.initOnKeyListeners(); + } }, /** * i18n support */ - TRANSLATIONS: {}, - PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), - LOCALE: "unknown", + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) - gettext: (string) => { - const translated = Documentation.TRANSLATIONS[string]; - switch (typeof translated) { - case "undefined": - return string; // no translation - case "string": - return translated; // translation exists - default: - return translated[0]; // (singular, plural) translation tuple exists + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); } }, - ngettext: (singular, plural, n) => { - const translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated !== "undefined") - return translated[Documentation.PLURAL_EXPR(n)]; - return n === 1 ? singular : plural; - }, - - addTranslations: (catalog) => { - Object.assign(Documentation.TRANSLATIONS, catalog.messages); - Documentation.PLURAL_EXPR = new Function( - "n", - `return (${catalog.plural_expr})` - ); - Documentation.LOCALE = catalog.locale; + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } }, /** - * helper function to focus on search bar + * helper function to hide the search marks again */ - focusSearchBar: () => { - document.querySelectorAll("input[name=q]")[0]?.focus(); + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); }, /** - * Initialise the domain index toggle buttons + * make the url absolute */ - initDomainIndexTable: () => { - const toggler = (el) => { - const idNumber = el.id.substr(7); - const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); - if (el.src.substr(-9) === "minus.png") { - el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; - toggledRows.forEach((el) => (el.style.display = "none")); - } else { - el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; - toggledRows.forEach((el) => (el.style.display = "")); - } - }; - - const togglerElements = document.querySelectorAll("img.toggler"); - togglerElements.forEach((el) => - el.addEventListener("click", (event) => toggler(event.currentTarget)) - ); - togglerElements.forEach((el) => (el.style.display = "")); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; }, - initOnKeyListeners: () => { - // only install a listener if it is really needed - if ( - !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS - ) - return; + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, - document.addEventListener("keydown", (event) => { - // bail for input elements - if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; - // bail with special keys - if (event.altKey || event.ctrlKey || event.metaKey) return; - - if (!event.shiftKey) { - switch (event.key) { - case "ArrowLeft": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const prevLink = document.querySelector('link[rel="prev"]'); - if (prevLink && prevLink.href) { - window.location.href = prevLink.href; - event.preventDefault(); + initOnKeyListeners: function() { + $(document).keyup(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box or textarea + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; } - break; - case "ArrowRight": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const nextLink = document.querySelector('link[rel="next"]'); - if (nextLink && nextLink.href) { - window.location.href = nextLink.href; - event.preventDefault(); + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; } - break; } } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case "/": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.focusSearchBar(); - event.preventDefault(); - } }); - }, + } }; // quick alias for translations -const _ = Documentation.gettext; +_ = Documentation.gettext; -_ready(Documentation.init); +$(document).ready(function() { + Documentation.init(); +}); diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js index b57ae3b8..d47d15f7 100644 --- a/docs/_static/documentation_options.js +++ b/docs/_static/documentation_options.js @@ -3,12 +3,8 @@ var DOCUMENTATION_OPTIONS = { VERSION: '', LANGUAGE: 'en', COLLAPSE_INDEX: false, - BUILDER: 'html', FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: '.txt', NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: true, }; \ No newline at end of file diff --git a/docs/_static/down-pressed.png b/docs/_static/down-pressed.png new file mode 100644 index 00000000..5756c8ca Binary files /dev/null and b/docs/_static/down-pressed.png differ diff --git a/docs/_static/down.png b/docs/_static/down.png new file mode 100644 index 00000000..1b3bdad2 Binary files /dev/null and b/docs/_static/down.png differ diff --git a/docs/_static/fonts/Inconsolata-Bold.ttf b/docs/_static/fonts/Inconsolata-Bold.ttf new file mode 100644 index 00000000..809c1f58 Binary files /dev/null and b/docs/_static/fonts/Inconsolata-Bold.ttf differ diff --git a/docs/_static/fonts/Inconsolata-Regular.ttf b/docs/_static/fonts/Inconsolata-Regular.ttf new file mode 100644 index 00000000..fc981ce7 Binary files /dev/null and b/docs/_static/fonts/Inconsolata-Regular.ttf differ diff --git a/docs/_static/fonts/Inconsolata.ttf b/docs/_static/fonts/Inconsolata.ttf new file mode 100644 index 00000000..4b8a36d2 Binary files /dev/null and b/docs/_static/fonts/Inconsolata.ttf differ diff --git a/docs/_static/fonts/Lato-Bold.ttf b/docs/_static/fonts/Lato-Bold.ttf new file mode 100644 index 00000000..1d23c706 Binary files /dev/null and b/docs/_static/fonts/Lato-Bold.ttf differ diff --git a/docs/_static/fonts/Lato-Regular.ttf b/docs/_static/fonts/Lato-Regular.ttf new file mode 100644 index 00000000..0f3d0f83 Binary files /dev/null and b/docs/_static/fonts/Lato-Regular.ttf differ diff --git a/docs/_static/fonts/Lato/lato-bold.eot b/docs/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 00000000..3361183a Binary files /dev/null and b/docs/_static/fonts/Lato/lato-bold.eot differ diff --git a/docs/_static/fonts/Lato/lato-bold.ttf b/docs/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 00000000..29f691d5 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-bold.ttf differ diff --git a/docs/_static/css/fonts/lato-bold.woff b/docs/_static/fonts/Lato/lato-bold.woff similarity index 100% rename from docs/_static/css/fonts/lato-bold.woff rename to docs/_static/fonts/Lato/lato-bold.woff diff --git a/docs/_static/css/fonts/lato-bold.woff2 b/docs/_static/fonts/Lato/lato-bold.woff2 similarity index 100% rename from docs/_static/css/fonts/lato-bold.woff2 rename to docs/_static/fonts/Lato/lato-bold.woff2 diff --git a/docs/_static/fonts/Lato/lato-bolditalic.eot b/docs/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 00000000..3d415493 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/docs/_static/fonts/Lato/lato-bolditalic.ttf b/docs/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 00000000..f402040b Binary files /dev/null and b/docs/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/docs/_static/css/fonts/lato-bold-italic.woff b/docs/_static/fonts/Lato/lato-bolditalic.woff similarity index 100% rename from docs/_static/css/fonts/lato-bold-italic.woff rename to docs/_static/fonts/Lato/lato-bolditalic.woff diff --git a/docs/_static/css/fonts/lato-bold-italic.woff2 b/docs/_static/fonts/Lato/lato-bolditalic.woff2 similarity index 100% rename from docs/_static/css/fonts/lato-bold-italic.woff2 rename to docs/_static/fonts/Lato/lato-bolditalic.woff2 diff --git a/docs/_static/fonts/Lato/lato-italic.eot b/docs/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 00000000..3f826421 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-italic.eot differ diff --git a/docs/_static/fonts/Lato/lato-italic.ttf b/docs/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 00000000..b4bfc9b2 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-italic.ttf differ diff --git a/docs/_static/css/fonts/lato-normal-italic.woff b/docs/_static/fonts/Lato/lato-italic.woff similarity index 100% rename from docs/_static/css/fonts/lato-normal-italic.woff rename to docs/_static/fonts/Lato/lato-italic.woff diff --git a/docs/_static/css/fonts/lato-normal-italic.woff2 b/docs/_static/fonts/Lato/lato-italic.woff2 similarity index 100% rename from docs/_static/css/fonts/lato-normal-italic.woff2 rename to docs/_static/fonts/Lato/lato-italic.woff2 diff --git a/docs/_static/fonts/Lato/lato-regular.eot b/docs/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 00000000..11e3f2a5 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-regular.eot differ diff --git a/docs/_static/fonts/Lato/lato-regular.ttf b/docs/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 00000000..74decd9e Binary files /dev/null and b/docs/_static/fonts/Lato/lato-regular.ttf differ diff --git a/docs/_static/css/fonts/lato-normal.woff b/docs/_static/fonts/Lato/lato-regular.woff similarity index 100% rename from docs/_static/css/fonts/lato-normal.woff rename to docs/_static/fonts/Lato/lato-regular.woff diff --git a/docs/_static/css/fonts/lato-normal.woff2 b/docs/_static/fonts/Lato/lato-regular.woff2 similarity index 100% rename from docs/_static/css/fonts/lato-normal.woff2 rename to docs/_static/fonts/Lato/lato-regular.woff2 diff --git a/docs/_static/fonts/RobotoSlab-Bold.ttf b/docs/_static/fonts/RobotoSlab-Bold.ttf new file mode 100644 index 00000000..df5d1df2 Binary files /dev/null and b/docs/_static/fonts/RobotoSlab-Bold.ttf differ diff --git a/docs/_static/fonts/RobotoSlab-Regular.ttf b/docs/_static/fonts/RobotoSlab-Regular.ttf new file mode 100644 index 00000000..eb52a790 Binary files /dev/null and b/docs/_static/fonts/RobotoSlab-Regular.ttf differ diff --git a/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 00000000..79dc8efe Binary files /dev/null and b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 00000000..df5d1df2 Binary files /dev/null and b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/docs/_static/css/fonts/Roboto-Slab-Bold.woff b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff similarity index 100% rename from docs/_static/css/fonts/Roboto-Slab-Bold.woff rename to docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff diff --git a/docs/_static/css/fonts/Roboto-Slab-Bold.woff2 b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 similarity index 100% rename from docs/_static/css/fonts/Roboto-Slab-Bold.woff2 rename to docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 diff --git a/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 00000000..2f7ca78a Binary files /dev/null and b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 00000000..eb52a790 Binary files /dev/null and b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/docs/_static/css/fonts/Roboto-Slab-Regular.woff b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff similarity index 100% rename from docs/_static/css/fonts/Roboto-Slab-Regular.woff rename to docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff diff --git a/docs/_static/css/fonts/Roboto-Slab-Regular.woff2 b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 similarity index 100% rename from docs/_static/css/fonts/Roboto-Slab-Regular.woff2 rename to docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 diff --git a/docs/_static/css/fonts/fontawesome-webfont.eot b/docs/_static/fonts/fontawesome-webfont.eot similarity index 100% rename from docs/_static/css/fonts/fontawesome-webfont.eot rename to docs/_static/fonts/fontawesome-webfont.eot diff --git a/docs/_static/css/fonts/fontawesome-webfont.svg b/docs/_static/fonts/fontawesome-webfont.svg similarity index 100% rename from docs/_static/css/fonts/fontawesome-webfont.svg rename to docs/_static/fonts/fontawesome-webfont.svg diff --git a/docs/_static/css/fonts/fontawesome-webfont.ttf b/docs/_static/fonts/fontawesome-webfont.ttf similarity index 100% rename from docs/_static/css/fonts/fontawesome-webfont.ttf rename to docs/_static/fonts/fontawesome-webfont.ttf diff --git a/docs/_static/css/fonts/fontawesome-webfont.woff b/docs/_static/fonts/fontawesome-webfont.woff similarity index 100% rename from docs/_static/css/fonts/fontawesome-webfont.woff rename to docs/_static/fonts/fontawesome-webfont.woff diff --git a/docs/_static/css/fonts/fontawesome-webfont.woff2 b/docs/_static/fonts/fontawesome-webfont.woff2 similarity index 100% rename from docs/_static/css/fonts/fontawesome-webfont.woff2 rename to docs/_static/fonts/fontawesome-webfont.woff2 diff --git a/docs/_static/jquery-3.2.1.js b/docs/_static/jquery-3.2.1.js new file mode 100644 index 00000000..d2d8ca47 --- /dev/null +++ b/docs/_static/jquery-3.2.1.js @@ -0,0 +1,10253 @@ +/*! + * jQuery JavaScript Library v3.2.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2017-03-20T18:59Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + + + + function DOMEval( code, doc ) { + doc = doc || document; + + var script = doc.createElement( "script" ); + + script.text = code; + doc.head.appendChild( script ).parentNode.removeChild( script ); + } +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.2.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && Array.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); + }, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE <=9 - 11, Edge 12 - 13 + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Simple selector that can be filtered directly, removing non-Elements + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + // Complex selector, compare the two sets, removing non-Elements + qualifier = jQuery.filter( qualifier, elements ); + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( jQuery.isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ jQuery.camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ jQuery.camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( jQuery.camelCase ); + } else { + key = jQuery.camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains( elem.ownerDocument, elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: jQuery.isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( ">tbody", elem )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rmargin = ( /^margin/ ); + +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + div.style.cssText = + "box-sizing:border-box;" + + "position:relative;display:block;" + + "margin:auto;border:1px;padding:1px;" + + "top:1%;width:50%"; + div.innerHTML = ""; + documentElement.appendChild( container ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = divStyle.marginLeft === "2px"; + boxSizingReliableVal = divStyle.width === "4px"; + + // Support: Android 4.0 - 4.3 only + // Some styles come back with percentage values, even though they shouldn't + div.style.marginRight = "50%"; + pixelMarginRightVal = divStyle.marginRight === "4px"; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + + "padding:0;margin-top:1px;position:absolute"; + container.appendChild( div ); + + jQuery.extend( support, { + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelMarginRight: function() { + computeStyleTests(); + return pixelMarginRightVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { + var ret = jQuery.cssProps[ name ]; + if ( !ret ) { + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + } + return ret; +} + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i, + val = 0; + + // If we already have the right measurement, avoid augmentation + if ( extra === ( isBorderBox ? "border" : "content" ) ) { + i = 4; + + // Otherwise initialize for horizontal or vertical properties + } else { + i = name === "width" ? 1 : 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // At this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + + // At this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // At this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with computed style + var valueIsBorderBox, + styles = getStyles( elem ), + val = curCSS( elem, name, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test( val ) ) { + return val; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && + ( support.boxSizingReliable() || val === elem.style[ name ] ); + + // Fall back to offsetWidth/Height when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + if ( val === "auto" ) { + val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; + } + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + + // Use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + "float": "cssFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + } ) : + getWidthOrHeight( elem, name, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = extra && getStyles( elem ), + subtract = extra && augmentWidthOrHeight( + elem, + name, + extra, + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + styles + ); + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ name ] = value; + value = jQuery.css( elem, name ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = jQuery.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 13 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( jQuery.isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + jQuery.proxy( result.stop, result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( type === "string" ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = value.match( rnothtmlwhite ) || []; + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, isFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +} ); + +jQuery.fn.extend( { + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + + + + +support.focusin = "onfocusin" in window; + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = jQuery.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = jQuery.isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( jQuery.isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 13 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available, append data to url + if ( s.data ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( jQuery.isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " - - - - + + + Index — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
- + + + + + + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 80960092..b8a1e8dc 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,48 +1,88 @@ - - - - - - Porymap Documentation — porymap documentation - - - - - + + + + + + - - - - - + + + Porymap Documentation — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
- + + + + + + \ No newline at end of file diff --git a/docs/manual/creating-new-maps.html b/docs/manual/creating-new-maps.html index 45d0bec0..516cdc8c 100644 --- a/docs/manual/creating-new-maps.html +++ b/docs/manual/creating-new-maps.html @@ -1,49 +1,89 @@ - - - - - - Creating New Maps — porymap documentation - - - - - + + + + + + - - - - - + + + Creating New Maps — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
+ + - + + + - + + + + + + \ No newline at end of file diff --git a/docs/manual/editing-map-collisions.html b/docs/manual/editing-map-collisions.html index fa3e62ff..5aa5d21b 100644 --- a/docs/manual/editing-map-collisions.html +++ b/docs/manual/editing-map-collisions.html @@ -1,49 +1,89 @@ - - - - - - Editing Map Collisions — porymap documentation - - - - - + + + + + + - - - - - + + + Editing Map Collisions — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
+

Multi-Level Collision Type on a Bridge

+
+
+

Note

+

For advanced usage: Any valid elevation/collision value combination can be selected using the Elevation and Collision value spinners, even if it’s not represented graphically on the selector image. You may also resize/replace this selector image under Options -> Project Settings.

+
+ + + - + + + - + + + + + + \ No newline at end of file diff --git a/docs/manual/editing-map-connections.html b/docs/manual/editing-map-connections.html index 4ed1add7..33a53c5a 100644 --- a/docs/manual/editing-map-connections.html +++ b/docs/manual/editing-map-connections.html @@ -1,49 +1,89 @@ - - - - - - Editing Map Connections — porymap documentation - - - - - + + + + + + - - - - - + + + Editing Map Connections — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
+
+

Follow Connections

Double-clicking on a connection will open the destination map. This is very useful for navigating through your maps, similar to double-clicking on Warp Events.

- - +
+ + - + + + - + + + + + + \ No newline at end of file diff --git a/docs/manual/editing-map-events.html b/docs/manual/editing-map-events.html index fef7b054..f170a141 100644 --- a/docs/manual/editing-map-events.html +++ b/docs/manual/editing-map-events.html @@ -1,49 +1,89 @@ - - - - - - Editing Map Events — porymap documentation - - - - - + + + + + + - - - - - + + + Editing Map Events — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
+
+

Clone Object Events

Clone Object events are a special type of object that inherits its properties from another Object event. They are used in-game to load objects that are visible in the connecting area of adjacent maps. The targeted object to clone is specified by id and map name. If the targeted object does not exist, or it’s also a clone, the sprite for graphics id 0 will be displayed instead. Double-clicking on a Clone Object will open the targeted map with the targeted object selected. This event type is exclusive to pokefirered projects; the code to process them does not exist in pokeemerald/pokeruby.

-
+
Clone Object Event Properties -
-

Clone Object Event Properties

-
-
-
-
Id

This is the local id of the object in the map. Some script values use this local id to specify an object when using scripting commands such as applymovement.

-
-
Sprite

The sprite that is used by the object. Clone Objects inherit their sprite from the targeted object, so this cannot be edited. This field is not actually read by the game.

-
-
Target Local Id

The local id of the object to be cloned.

-
-
Target Map

The name of the map the object to be cloned is on.

-
+

Clone Object Event Properties

+
+
+
Id
+
This is the local id of the object in the map. Some script values use this local id to specify an object when using scripting commands such as applymovement.
+
Sprite
+
The sprite that is used by the object. Clone Objects inherit their sprite from the targeted object, so this cannot be edited. This field is not actually read by the game.
+
Target Local Id
+
The local id of the object to be cloned.
+
Target Map
+
The name of the map the object to be cloned is on.
- -
-

Warp Events

-

Warp events are how the player is able to warp to other maps, such as entering a building. Double-clicking on a warp will automatically open the destination map and select the destination warp. This makes it very easy to navigate around in Porymap.

-
+ +
+

Warp Events

+

Warp events are how the player is able to warp to other maps, such as entering a building. Double-clicking on a warp will automatically open the destination map and select the destination warp. This makes it very easy to navigate around in Porymap. Warps need to be on specific metatiles to function as an exit; a warning will appear if the warp event is not on one of these metatiles.

+
Warp Event Properties -
-

Warp Event Properties

-
-
-
-
Id

This is the local id of the warp in the map. This is used when setting the Destination Warp property for another warp.

-
-
Destination Map

The destination map name.

-
-
Destination Warp

The Id of the warp in the destination map.

-
+

Warp Event Properties

+ +
+
Id
+
This is the local id of the warp in the map. This is used when setting the Destination Warp property for another warp.
+
Destination Map
+
The destination map name.
+
Destination Warp
+
The Id of the warp in the destination map.
-
-
-

Trigger Events

+ +
+

Trigger Events

Trigger events are scripts that execute when the player walks over them. However, they only execute when a variable is equal some value. Typically, they execute once, set the variable’s value to something else, and then never execute again because the variable’s value no longer matches.

-
+
Trigger Event Properties -
-

Trigger Event Properties

-
-
-
-
Id

The local id of the trigger in the map. This value is not used for anything.

-
-
Script

The script that executes when the player walks over the trigger AND when the Var equals the Var Value.

-
-
Var

The variable used to determine if the trigger’s Script should execute.

-
-
Var Value

The value that the Var must equal for the trigger’s Script to execute.

-
+

Trigger Event Properties

+
+
+
Id
+
The local id of the trigger in the map. This value is not used for anything.
+
Script
+
The script that executes when the player walks over the trigger AND when the Var equals the Var Value.
+
Var
+
The variable used to determine if the trigger’s Script should execute.
+
Var Value
+
The value that the Var must equal for the trigger’s Script to execute.
-
-
-

Weather Trigger Events

+ +
+

Weather Trigger Events

Weather trigger events are a very specific type of trigger. When the player walks over a weather trigger, the overworld’s weather will transition to the specified weather type. This event type is unavailable for pokefirered projects; the functions to trigger weather changes were dummied out.

-
+
Weather Trigger Event Properties -
-

Weather Trigger Event Properties

-
-
-
-
Id

The local id of the trigger in the map. This value is not used for anything.

-
-
Weather

The type of weather to transition to.

-
+

Weather Trigger Event Properties

+
+
+
Id
+
The local id of the trigger in the map. This value is not used for anything.
+
Weather
+
The type of weather to transition to.
-
-
-

Sign Event

+ +
+

Sign Event

Sign events, or signposts, are simple interactable scripts. They are typically used for things like signs in front of buildings. The player’s facing direction can be required to be a certain direction in order to interact with the sign. Signs are the first of three “BG” event types.

-
+
Sign Event Properties -
-

Sign Event Properties

-
-
-
-
Id

The local id of the BG event in the map. This value is not used for anything.

-
-
Player Facing Direction

The direction the player must be facing in order to execute the sign’s script.

-
-
Script

The script that executes when the player interacts with the sign.

-
+

Sign Event Properties

+
+
+
Id
+
The local id of the BG event in the map. This value is not used for anything.
+
Player Facing Direction
+
The direction the player must be facing in order to execute the sign’s script.
+
Script
+
The script that executes when the player interacts with the sign.
-
-
-

Hidden Item Event

+ +
+

Hidden Item Event

Hidden items are invisible items that can be picked up by the player. They each use a flag to ensure the item can only be picked up once.

-
+
Hidden Item Event Properties -
-

Hidden Item Event Properties

-
-
-
-
Id

The local id of the BG event in the map. This value is not used for anything.

-
-
Item

The item the player will receive when interacting with this hidden item.

-
-
Flag

This flag is set when the player receives the hidden item.

-
-
Quantity

Exclusive to pokefirered. The number of items received when the item is picked up.

-
-
Requires Itemfinder

Exclusive to pokefirered. When checked, the hidden item can only be received by standing on it and using the Itemfinder.

-
+

Hidden Item Event Properties

+
+
+
Id
+
The local id of the BG event in the map. This value is not used for anything.
+
Item
+
The item the player will receive when interacting with this hidden item.
+
Flag
+
This flag is set when the player receives the hidden item.
+
Quantity
+
Exclusive to pokefirered. The number of items received when the item is picked up.
+
Requires Itemfinder
+
Exclusive to pokefirered. When checked, the hidden item can only be received by standing on it and using the Itemfinder.
-
-
-

Secret Base Event

+ +
+

Secret Base Event

This is the event used to mark entrances to secret bases. This event will only be functional on certain metatiles. Unfortunately, they are hardcoded into the game’s engine (see sSecretBaseEntranceMetatiles in src/secret_base.c). This event type is unavailable for pokefirered projects; secret bases do not exist there.

-
+
Secret Base Event Properties -
-

Secret Base Event Properties

-
-
-
-
Id

The local id of the BG event in the map. This value is not used for anything.

-
-
Secret Base Id

The id of the destination secret base.

-
+

Secret Base Event Properties

+
+
+
Id
+
The local id of the BG event in the map. This value is not used for anything.
+
Secret Base Id
+
The id of the destination secret base.
-
-
-

Heal Location / Healspots

+ +
+

Heal Location / Healspots

This event is used to control where a player will arrive when they white out or fly to the map. The white out functions a little differently between game versions. For pokeemerald and pokeruby players will arrive at the event’s coordinates after a white out, while in pokefirered they will arrive on the map set in Respawn Map and at hardcoded coordinates (see SetWhiteoutRespawnWarpAndHealerNpc in src/heal_location.c).

-
+
Heal Location Properties -
-

Heal Location Properties

-
-
-
-
Respawn Map

Exclusive to pokefirered. The map where the player will arrive when they white out (e.g. inside the PokéCenter that the heal location is in front of).

-
-
Respawn NPC

Exclusive to pokefirered. The local id of the NPC the player will interact with when they white out.

-
+

Heal Location Properties

+
+
+
Respawn Map
+
Exclusive to pokefirered. The map where the player will arrive when they white out (e.g. inside the PokéCenter that the heal location is in front of).
+
Respawn NPC
+
Exclusive to pokefirered. The local id of the NPC the player will interact with when they white out.
-
-
-

Open Map Scripts

+ +
+

Open Map Scripts

Clicking the Open Map Scripts button open-map-scripts-button will open the map’s scripts file in your default text editor. If nothing happens when this button is clicked, you may need to associate a text editor with the .inc file extension (or .pory if you’re using Porycript).

Additionally, if you specify a Goto Line Command in Options -> Edit Preferences then a tool-button will appear next to the Script combo-box in the Events tab. Clicking this button will open the file that contains the script directly to the line number of that script. If the script cannot be found in the project then the current map’s scripts file is opened. go-to-script-button

-
-
-

Tool Buttons

+ +
+

Tool Buttons

The event editing tab also extends functionality to a few of the tool buttons described in Editing Map Tiles. A brief description and animation is listed for each of the available tools below:

-
-
Pencil

When clicking on an existing event, the pencil tool will behave normally (as the standard cursor). It can also be used to “draw” events in a certain location. The event created will be a default-valued event of the same type as the currently selected event. Right-clicking with the Pencil Tool will return to the Pointer tool.

-
+
+
Pencil
+
When clicking on an existing event, the pencil tool will behave normally (as the standard cursor). It can also be used to “draw” events in a certain location. The event created will be a default-valued event of the same type as the currently selected event. Right-clicking with the Pencil Tool will return to the Pointer tool.
-
+
Drawing Object Events with the Pencil Tool -
-

Drawing Object Events with the Pencil Tool

-
-
-
-
Pointer

The Pointer Tool is the default tool for the event editing tab and allows you to select and move events on the map. The Pointer Tool also gives you access to the Ruler Tool.

-
-
Shift

You can use the Shift Tool to move any number of events together. When a selected event is dragged, all other selected events will move with it. When a tile with no event is clicked, all events on the map can be dragged.

-
+

Drawing Object Events with the Pencil Tool

+
+
+
Pointer
+
The Pointer Tool is the default tool for the event editing tab and allows you to select and move events on the map. The Pointer Tool also gives you access to the Ruler Tool.
+
Shift
+
You can use the Shift Tool to move any number of events together. When a selected event is dragged, all other selected events will move with it. When a tile with no event is clicked, all events on the map can be dragged.
-
+
Moving Events with the Shift Tool -
-

Moving Events with the Shift Tool

-
-
-
-
-

Ruler Tool

+

Moving Events with the Shift Tool

+ + +
+

Ruler Tool

The Ruler Tool provides a convenient way to measure distance on the map. This is particularly useful for scripting object movement. With the Pointer Tool selected you can activate the ruler with a Right-click. With the ruler active you can move the mouse around to extend the ruler. The ruler can be deactivated with another Right-click, or locked in place with a Left-click (Left-click again to unlock the ruler).

-
+
Measuring metatile distance with the Ruler Tool -
-

Measuring metatile distance with the Ruler Tool

-
-
-
- +

Measuring metatile distance with the Ruler Tool

+ + + + - + + + - + + + + + + \ No newline at end of file diff --git a/docs/manual/editing-map-header.html b/docs/manual/editing-map-header.html index 29517096..083ffe95 100644 --- a/docs/manual/editing-map-header.html +++ b/docs/manual/editing-map-header.html @@ -1,49 +1,89 @@ - - - - - - Editing Map Headers — porymap documentation - - - - - + + + + + + - - - - - + + + Editing Map Headers — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
- + + + + + + \ No newline at end of file diff --git a/docs/manual/editing-map-tiles.html b/docs/manual/editing-map-tiles.html index 2ae0c9eb..8cfa3fa0 100644 --- a/docs/manual/editing-map-tiles.html +++ b/docs/manual/editing-map-tiles.html @@ -1,49 +1,89 @@ - - - - - - Editing Map Tiles — porymap documentation - - - - - + + + + + + - - - - - + + + Editing Map Tiles — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
+
+

Pencil Tool

The Pencil Tool pencil-tool (Tools -> Pencil, or N) is your bread and butter when editing maps. Simply left-click to paint your current metatile selection onto the map. You can click and drag to paint a bigger portion of the map. When clicking and dragging, the metatiles will be painted as if they are snapping to a grid. This simplifies things like painting large areas of trees.

-
+
Painting a Large Metatile Selection -
-

Painting a Large Metatile Selection

-
-
- -
-

Pointer Tool

+

Painting a Large Metatile Selection

+
+ +
+

Pointer Tool

The Pointer Tool pointer-tool (Tools -> Pointer, or P) doesn’t do anything. It just allows you to click on the map without painting anything.

- -
-

Bucket Fill Tool

+
+
+

Bucket Fill Tool

The Bucket Fill Tool bucket-fill-tool (Tools -> Bucket Fill, or B) works just like you think it does. It fills a contiguous region of identical metatiles. If you have a large metatile selection, it will fill the region with that pattern. A useful shortcut for the Bucket Fill Tool is to middle-click when using the Pencil Tool.

-
+
Painting with Bucket Fill Tool -
-

Painting with Bucket Fill Tool

-
-
+

Painting with Bucket Fill Tool

+

Holding down the Ctrl key while using the Bucket Fill Tool will fill all matching metatiles on the map, rather that just the contiguous region.

- -
-

Map Shift Tool

+ +
+

Map Shift Tool

The Map Shift Tool map-shift-tool (Tools -> Map Shift, or S) lets you shift the metatile positions of the entire map at the same time. This is useful after resizing a map. (Though, simply right-click copying the entire map is another way of accomplishing the same thing.) Metatiles are wrapped around to the other side of the map when using the Map Shift Tool. Simply click and drag on the map to perform the map shift.

-
+
Map Shift Tool -
-

Map Shift Tool

-
-
-
-
-

Smart Paths

+

Map Shift Tool

+ + +
+

Smart Paths

Smart Paths provide an easy way to paint pathways, ponds, and mountains. If there is any formation of metatiles that have a basic outline and a “middle” tile, then smart paths can help save you time when painting. Smart Paths can only be used when you have a 3x3 metatile selection. Smart Paths is only available when using the Pencil Tool or the Bucket Fill Tool. To enable Smart Paths, you must either check the Smart Paths checkbox above the map area, or you can hold down the Shift key. If you have the Smart Paths checkbox checked then you can temporarily disable smart paths by holding down the Shift key. Below are a few examples that illustrate the power of Smart Paths.

-
+
Regular vs. Smart Paths -
-

Regular vs. Smart Paths

-
-
-
+

Regular vs. Smart Paths

+
+
Bucket Fill with Smart Paths -
-

Bucket Fill with Smart Paths

-
- -
+

Bucket Fill with Smart Paths

+
+
Smart Paths from Right-Click Selection -
-

Smart Paths from Right-Click Selection

-
- -
-
-

Straight Paths

+

Smart Paths from Right-Click Selection

+ + +
+

Straight Paths

Straight Paths allows for painting tiles in straight lines by snapping the cursor to that line. Either the X or Y axis will be locked depending on the direction you start painting in. To enable straight paths simply hold down Ctrl when painting tiles. Straight paths works for both metatiles and collision tiles, and works in conjunction with Smart Paths. It also works with the Map Shift Tool. Straight path painting can be chained together with normal painting to allow you, for example, to paint a straight path, then release Ctrl to continue the path normally, then press Ctrl again to continue painting a straight path from that position.

-
-
-

Change Map Border

+ +
+

Change Map Border

The map’s border can be modified by painting on the Border image, which is located above the metatile selection pane.

-
+
Change Map Border -
-

Change Map Border

-
-
+

Change Map Border

+

The dimensions of the map’s border can also be adjusted for pokefirered projects via the Change Dimensions button. If you have modified your pokeemerald or pokeruby project to support custom border sizes you can enable this option with the use_custom_border_size field in your project’s porymap.project.cfg file.

-
-
-

Change Map Tilesets

+ +
+

Change Map Tilesets

Every map uses exactly two Tilesets–primary and secondary. These can be changed by choosing a different value from the two Tileset dropdowns.

-
+
Tileset Pickers -
-

Tileset Pickers

-
-
-
-
-

Undo & Redo

+

Tileset Pickers

+ + +
+

Undo & Redo

When painting metatiles, you can undo and redo actions you take. This makes it very easy to fix mistakes or go back in time. Undo can be performed with Ctrl+Z or Edit -> Undo. Redo can be performed with Ctrl+Y or Edit -> Redo.

-
-
-

Prefabs

+ +
+

Prefabs

Prefabs, or “prefabricated selections”, are a way to optimize your map-editing workflow by defining pre-built metatile selections. This can be useful when larger map objects can’t be selected from the main metatile selector window. For example, the Poké Mart building is only partially selectable in the metatile selector view.

-
+
Prefab Tab -
-

Prefab Tab

-
-
+

Prefab Tab

+

Porymap provides a set of default prefabs for each supported base game version (pokeemerald, pokefirered, and pokeruby). When opening a project for the first time, Porymap will prompt the user for importing those default prefabs.

To create a new prefab, simply select a group of metatiles from the main map view. (See the Selecting Metatiles. section above for how to use right-click-drag to select from the map area.) Then, click the “Create from Selection” button. This will bring up the following window where individual metatiles can be toggled on/off in the prefab. You can also give your prefab a name.

-
+
Prefab Creation Window -
-

Prefab Creation Window

-
-
+

Prefab Creation Window

+

Prefabs are designated for whichever primary and secondary tilesets were used to create them. As such, any prefabs for with tilesets that are incompatible with the currently-opened map will be hidden from the Prefab list.

To select a prefab to use for painting on the map, simply click on the prefab image in the list view.

-
+
Painting with a Prefab -
-

Painting with a Prefab

-
-
+

Painting with a Prefab

+

Prefab data is saved to a JSON file. It defaults to <project_root>/prefabs.json. However, it can be configured in Porymap’s project config file using the prefabs_filepath setting.

-
- + + + - + + + - + + + + + + \ No newline at end of file diff --git a/docs/manual/editing-wild-encounters.html b/docs/manual/editing-wild-encounters.html index 1f99f2d8..ff4475f9 100644 --- a/docs/manual/editing-wild-encounters.html +++ b/docs/manual/editing-wild-encounters.html @@ -1,49 +1,89 @@ - - - - - - Editing Wild Encounters — porymap documentation - - - - - + + + + + + - - - - - + + + Editing Wild Encounters — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -

If we accept the changes, we can now assign pokemon to each slots, and adjust the levels.

-
+
../_images/headbutt-mons.png -
+

Changes made to the wild encounters are not saved to disk until you save the map.

- - + + + - + + + - + + + + + + \ No newline at end of file diff --git a/docs/manual/introduction.html b/docs/manual/introduction.html index 9fa9b34e..f92c13e3 100644 --- a/docs/manual/introduction.html +++ b/docs/manual/introduction.html @@ -1,49 +1,89 @@ - - - - - - Introduction — porymap documentation - - - - - + + + + + + - - - - - + + + Introduction — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -

That looks great! Save your changes with File -> Save (Ctrl+S). Finally, compile the ROM and see the results in-game.

-

Note

-

When re-compiling your ROM, it is not recommended to use NODEP=1, since that can result in data changes being ignored.

+

Note

+

When re-compiling your ROM, it is not recommended to use NODEP=1, since that can result in data changes being ignored.

-
+
Petalburg City In-Game Changes -
-

Petalburg City In-Game Changes

-
-
+

Petalburg City In-Game Changes

+

Now that you have the basic workflow down, it’s time to learn how to navigate the various windows and screens of Porymap.

- - + + + - + + + - + + + + + + \ No newline at end of file diff --git a/docs/manual/navigation.html b/docs/manual/navigation.html index 4a9bd492..a7daf7e7 100644 --- a/docs/manual/navigation.html +++ b/docs/manual/navigation.html @@ -1,49 +1,89 @@ - - - - - - Navigation — porymap documentation - - - - - + + + + + + - - - - - + + + Navigation — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
+
+

Tileset Editor

The Tileset Editor can be opened with File -> Tileset Editor (Ctrl+T). Check out The Tileset Editor section for more details.

-
+
Tileset Editor -
-

Tileset Editor

-
-
- -
-

Region Map Editor

+

Tileset Editor

+
+ +
+

Region Map Editor

The Region Map Editor can be opened with File -> Region Map Editor (Ctrl+M). This window will allow you to modify the look and layout of maps on the game’s region map. Check out The Region Map Editor section for more details.

-
+
Region Map Editor -
-

Region Map Editor

-
-
+

Region Map Editor

+

We covered all of the basic views and windows of porymap above. Next, let’s learn how to use Porymap’s features to the fullest when editing map tiles.

- - + + + - + + + - + + + + + + \ No newline at end of file diff --git a/docs/manual/project-files.html b/docs/manual/project-files.html index b38b0825..d2d8c44d 100644 --- a/docs/manual/project-files.html +++ b/docs/manual/project-files.html @@ -1,49 +1,89 @@ - - - - - - Project Files — porymap documentation - - - - - + + + + + + - - - - - + + + Project Files — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
- + + + + + + \ No newline at end of file diff --git a/docs/manual/region-map-editor.html b/docs/manual/region-map-editor.html index 7a9329e4..e21751ee 100644 --- a/docs/manual/region-map-editor.html +++ b/docs/manual/region-map-editor.html @@ -1,49 +1,89 @@ - - - - - - The Region Map Editor — porymap documentation - - - - - + + + + + + - - - - - + + + The Region Map Editor — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
+
+

Map Entries Tab

A region map entry is the area on the region map that spans an entire map section. This determines, for example, where the player’s head appears on the region map in-game. Entries are stored in src/data/region_map/region_map_sections.json.

-
+
RME Entries -
-

RME Entries Tab

-
-
+

RME Entries Tab

+

To edit an entry, select a map section from the “Map Section” combobox. You can use the “Location” “x” and “y” spinboxes to change the coordinates of the entry. You can also drag the entry around the map. The “x” and “y” values correspond to @@ -508,38 +597,56 @@ the position of the entry’s top-left square on the region map. The “Dimensi “width” and “height” spinboxes will change the size of the map entry.

To change the popup name of the map section when you enter the map, type it into the “Map Name” box.

- - + + + - + + + - + + + + + + \ No newline at end of file diff --git a/docs/manual/scripting-capabilities.html b/docs/manual/scripting-capabilities.html index 52aa5506..03ea8dbb 100644 --- a/docs/manual/scripting-capabilities.html +++ b/docs/manual/scripting-capabilities.html @@ -1,49 +1,89 @@ - - - - - - Scripting Capabilities — porymap documentation - - - - - + + + + + + - - - - - + + + Scripting Capabilities — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
+
+

Scripting API

+
+

Callbacks

+
+
+onProjectOpened(projectPath)

Called when Porymap successfully opens a project.

-
-
Arguments:
-
    -
  • projectPath (string) – the directory path of the opened project

  • + +++ + + + +
    Arguments:
      +
    • projectPath (string) – the directory path of the opened project
    - - +
-
-
-onProjectClosed(projectPath)
+
+
+onProjectClosed(projectPath)

Called when Porymap closes a project. For example, this is called when opening a different project.

-
-
Arguments:
-
    -
  • projectPath (string) – the directory path of the closed project

  • + +++ + + + +
    Arguments:
      +
    • projectPath (string) – the directory path of the closed project
    - - +
-
-
-onMapOpened(mapName)
+
+
+onMapOpened(mapName)

Called when a map is opened.

-
-
Arguments:
-
    -
  • mapName (string) – the name of the opened map

  • + +++ + + + +
    Arguments:
      +
    • mapName (string) – the name of the opened map
    - - +
-
-
-onBlockChanged(x, y, prevBlock, newBlock)
+
+
+onBlockChanged(x, y, prevBlock, newBlock)

Called when a block is changed on the map. For example, this is called when a user paints a new tile or changes the collision property of a block.

-
-
Arguments:
-
    -
  • x (number) – x coordinate of the block

  • -
  • y (number) – y coordinate of the block

  • -
  • prevBlock (object) – the block’s state before it was modified. The object’s shape is {metatileId, collision, elevation, rawValue}

  • -
  • newBlock (object) – the block’s new state after it was modified. The object’s shape is {metatileId, collision, elevation, rawValue}

  • + +++ + + + +
    Arguments:
      +
    • x (number) – x coordinate of the block
    • +
    • y (number) – y coordinate of the block
    • +
    • prevBlock (object) – the block’s state before it was modified. The object’s shape is {metatileId, collision, elevation, rawValue}
    • +
    • newBlock (object) – the block’s new state after it was modified. The object’s shape is {metatileId, collision, elevation, rawValue}
    - - +
-
-
-onBorderMetatileChanged(x, y, prevMetatileId, newMetatileId)
+
+
+onBorderMetatileChanged(x, y, prevMetatileId, newMetatileId)

Called when a border metatile is changed.

-
-
Arguments:
-
    -
  • x (number) – x coordinate of the block

  • -
  • y (number) – y coordinate of the block

  • -
  • prevMetatileId (number) – the metatile id of the border block before it was modified

  • -
  • newMetatileId (number) – the metatile id of the border block after it was modified

  • + +++ + + + +
    Arguments:
      +
    • x (number) – x coordinate of the block
    • +
    • y (number) – y coordinate of the block
    • +
    • prevMetatileId (number) – the metatile id of the border block before it was modified
    • +
    • newMetatileId (number) – the metatile id of the border block after it was modified
    - - +
-
-
-onBlockHoverChanged(x, y)
+
+
+onBlockHoverChanged(x, y)

Called when the mouse enters a new map block.

-
-
Arguments:
-
    -
  • x (number) – x coordinate of the block

  • -
  • y (number) – y coordinate of the block

  • + +++ + + + +
    Arguments:
      +
    • x (number) – x coordinate of the block
    • +
    • y (number) – y coordinate of the block
    - - +
-
-
-onBlockHoverCleared()
+
+
+onBlockHoverCleared()

Called when the mouse exits the map.

-
-
-onMapResized(oldWidth, oldHeight, newWidth, newHeight)
+
+
+onMapResized(oldWidth, oldHeight, newWidth, newHeight)

Called when the dimensions of the map are changed.

-
-
Arguments:
-
    -
  • oldWidth (number) – the width of the map before the change

  • -
  • oldHeight (number) – the height of the map before the change

  • -
  • newWidth (number) – the width of the map after the change

  • -
  • newHeight (number) – the height of the map after the change

  • + +++ + + + +
    Arguments:
      +
    • oldWidth (number) – the width of the map before the change
    • +
    • oldHeight (number) – the height of the map before the change
    • +
    • newWidth (number) – the width of the map after the change
    • +
    • newHeight (number) – the height of the map after the change
    - - +
-
-
-onBorderResized(oldWidth, oldHeight, newWidth, newHeight)
+
+
+onBorderResized(oldWidth, oldHeight, newWidth, newHeight)

Called when the dimensions of the border are changed.

-
-
Arguments:
-
    -
  • oldWidth (number) – the width of the border before the change

  • -
  • oldHeight (number) – the height of the border before the change

  • -
  • newWidth (number) – the width of the border after the change

  • -
  • newHeight (number) – the height of the border after the change

  • + +++ + + + +
    Arguments:
      +
    • oldWidth (number) – the width of the border before the change
    • +
    • oldHeight (number) – the height of the border before the change
    • +
    • newWidth (number) – the width of the border after the change
    • +
    • newHeight (number) – the height of the border after the change
    - - +
-
-
-onMapShifted(xDelta, yDelta)
+
+
+onMapShifted(xDelta, yDelta)

Called when the map is updated by use of the Map Shift tool.

-
-
Arguments:
-
    -
  • xDelta (number) – the horizontal change from the shift

  • -
  • yDelta (number) – the vertical change from the shift

  • + +++ + + + +
    Arguments:
      +
    • xDelta (number) – the horizontal change from the shift
    • +
    • yDelta (number) – the vertical change from the shift
    - - +
-
-
-onTilesetUpdated(tilesetName)
+
+
+onTilesetUpdated(tilesetName)

Called when the currently loaded tileset is changed by switching to a new one or by saving changes to it in the Tileset Editor.

-
-
Arguments:
-
    -
  • tilesetName (string) – the name of the updated tileset

  • + +++ + + + +
    Arguments:
      +
    • tilesetName (string) – the name of the updated tileset
    - - +
-
-
-onMainTabChanged(oldTab, newTab)
+
+
+onMainTabChanged(oldTab, newTab)

Called when the selected tab in the main tab bar is changed. Tabs are indexed from left to right, starting at 0 (0: Map, 1: Events, 2: Header, 3: Connections, 4: Wild Pokemon).

-
-
Arguments:
-
    -
  • oldTab (number) – the index of the previously selected tab

  • -
  • newTab (number) – the index of the newly selected tab

  • + +++ + + + +
    Arguments:
      +
    • oldTab (number) – the index of the previously selected tab
    • +
    • newTab (number) – the index of the newly selected tab
    - - +
-
-
-onMapViewTabChanged(oldTab, newTab)
+
+
+onMapViewTabChanged(oldTab, newTab)

Called when the selected tab in the map view tab bar is changed. Tabs are indexed from left to right, starting at 0 (0: Metatiles, 1: Collision, 2: Prefabs).

-
-
Arguments:
-
    -
  • oldTab (number) – the index of the previously selected tab

  • -
  • newTab (number) – the index of the newly selected tab

  • + +++ + + + +
    Arguments:
      +
    • oldTab (number) – the index of the previously selected tab
    • +
    • newTab (number) – the index of the newly selected tab
    - - +
-
-
-onBorderVisibilityToggled(visible)
+
+
+onBorderVisibilityToggled(visible)

Called when the visibility of the border and connecting maps is toggled on or off.

-
-
Arguments:
-
    -
  • visible (boolean) – whether the border is now visible

  • + +++ + + + +
    Arguments:
      +
    • visible (boolean) – whether the border is now visible
    - - +
- -
-

Functions

-
-

Map Editing Functions

+
+
+

Functions

+
+

Map Editing Functions

The following functions are related to editing the map’s blocks or retrieving information about them.

All map editing functions are callable via the global map object.

-
-
-map.getBlock(x, y)
+
+
+map.getBlock(x, y)

Gets a block in the currently-opened map.

-
-
Arguments:
-
    -
  • x (number) – x coordinate of the block

  • -
  • y (number) – y coordinate of the block

  • + +++ + + + + + + + +
    Arguments:
      +
    • x (number) – x coordinate of the block
    • +
    • y (number) – y coordinate of the block
    - -
    Returns:
    -

    the block object

    -
    -
    Return type:
    -

    object ({metatileId, collision, elevation, rawValue})

    -
    - +
    Returns:

    the block object

    +
    Return type:

    object ({metatileId, collision, elevation, rawValue})

    +
-
-
-map.setBlock(x, y, metatileId, collision, elevation, forceRedraw = true, commitChanges = true)
+
+
+map.setBlock(x, y, metatileId, collision, elevation, forceRedraw = true, commitChanges = true)

Sets a block in the currently-opened map.

-
-
Arguments:
-
    -
  • x (number) – x coordinate of the block

  • -
  • y (number) – y coordinate of the block

  • -
  • metatileId (number) – the metatile id of the block

  • -
  • collision (number) – the collision of the block (0 = passable, 1-3 = impassable)

  • -
  • elevation (number) – the elevation of the block

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • -
  • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().

  • + +++ + + + +
    Arguments:
      +
    • x (number) – x coordinate of the block
    • +
    • y (number) – y coordinate of the block
    • +
    • metatileId (number) – the metatile id of the block
    • +
    • collision (number) – the collision of the block (0 = passable, 1-3 = impassable)
    • +
    • elevation (number) – the elevation of the block
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    • +
    • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().
    - - +
-
-
-map.setBlock(x, y, rawValue, forceRedraw = true, commitChanges = true)
+
+
+map.setBlock(x, y, rawValue, forceRedraw = true, commitChanges = true)

Sets a block in the currently-opened map. This is an overloaded function that takes the raw value of a block instead of each of the block’s properties individually.

-
-
Arguments:
-
    -
  • x (number) – x coordinate of the block

  • -
  • y (number) – y coordinate of the block

  • -
  • rawValue (number) – the 16 bit value of the block. Bits 0-9 will be the metatile id, bits 10-11 will be the collision, and bits 12-15 will be the elevation.

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • -
  • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().

  • + +++ + + + +
    Arguments:
      +
    • x (number) – x coordinate of the block
    • +
    • y (number) – y coordinate of the block
    • +
    • rawValue (number) – the 16 bit value of the block. Bits 0-9 will be the metatile id, bits 10-11 will be the collision, and bits 12-15 will be the elevation.
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    • +
    • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().
    - - +
-
-
-map.getMetatileId(x, y)
+
+
+map.getMetatileId(x, y)

Gets the metatile id of a block in the currently-opened map.

-
-
Arguments:
-
    -
  • x (number) – x coordinate of the block

  • -
  • y (number) – y coordinate of the block

  • + +++ + + + + + + + +
    Arguments:
      +
    • x (number) – x coordinate of the block
    • +
    • y (number) – y coordinate of the block
    - -
    Returns:
    -

    the metatile id of the block

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the metatile id of the block

    +
    Return type:

    number

    +
-
-
-map.setMetatileId(x, y, metatileId, forceRedraw = true, commitChanges = true)
+
+
+map.setMetatileId(x, y, metatileId, forceRedraw = true, commitChanges = true)

Sets the metatile id of a block in the currently-opened map.

-
-
Arguments:
-
    -
  • x (number) – x coordinate of the block

  • -
  • y (number) – y coordinate of the block

  • -
  • metatileId (number) – the metatile id of the block

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • -
  • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().

  • + +++ + + + +
    Arguments:
      +
    • x (number) – x coordinate of the block
    • +
    • y (number) – y coordinate of the block
    • +
    • metatileId (number) – the metatile id of the block
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    • +
    • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().
    - - +
-
-
-map.getBorderMetatileId(x, y)
+
+
+map.getBorderMetatileId(x, y)

Gets the metatile id of a block in the border of the currently-opened map.

-
-
Arguments:
-
    -
  • x (number) – x coordinate of the block

  • -
  • y (number) – y coordinate of the block

  • + +++ + + + + + + + +
    Arguments:
      +
    • x (number) – x coordinate of the block
    • +
    • y (number) – y coordinate of the block
    - -
    Returns:
    -

    the metatile id of the block

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the metatile id of the block

    +
    Return type:

    number

    +
-
-
-map.setBorderMetatileId(x, y, metatileId, forceRedraw = true, commitChanges = true)
+
+
+map.setBorderMetatileId(x, y, metatileId, forceRedraw = true, commitChanges = true)

Sets the metatile id of a block in the border of the currently-opened map.

-
-
Arguments:
-
    -
  • x (number) – x coordinate of the block

  • -
  • y (number) – y coordinate of the block

  • -
  • metatileId (number) – the metatile id of the block

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • -
  • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().

  • + +++ + + + +
    Arguments:
      +
    • x (number) – x coordinate of the block
    • +
    • y (number) – y coordinate of the block
    • +
    • metatileId (number) – the metatile id of the block
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    • +
    • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().
    - - +
-
-
-map.getCollision(x, y)
+
+
+map.getCollision(x, y)

Gets the collision of a block in the currently-opened map. (0 = passable, 1-3 = impassable)

-
-
Arguments:
-
    -
  • x (number) – x coordinate of the block

  • -
  • y (number) – y coordinate of the block

  • + +++ + + + + + + + +
    Arguments:
      +
    • x (number) – x coordinate of the block
    • +
    • y (number) – y coordinate of the block
    - -
    Returns:
    -

    the collision of the block

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the collision of the block

    +
    Return type:

    number

    +
-
-
-map.setCollision(x, y, collision, forceRedraw = true, commitChanges = true)
+
+
+map.setCollision(x, y, collision, forceRedraw = true, commitChanges = true)

Sets the collision of a block in the currently-opened map. (0 = passable, 1-3 = impassable)

-
-
Arguments:
-
    -
  • x (number) – x coordinate of the block

  • -
  • y (number) – y coordinate of the block

  • -
  • collision (number) – the collision of the block

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • -
  • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().

  • + +++ + + + +
    Arguments:
      +
    • x (number) – x coordinate of the block
    • +
    • y (number) – y coordinate of the block
    • +
    • collision (number) – the collision of the block
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    • +
    • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().
    - - +
-
-
-map.getElevation(x, y)
+
+
+map.getElevation(x, y)

Gets the elevation of a block in the currently-opened map.

-
-
Arguments:
-
    -
  • x (number) – x coordinate of the block

  • -
  • y (number) – y coordinate of the block

  • + +++ + + + + + + + +
    Arguments:
      +
    • x (number) – x coordinate of the block
    • +
    • y (number) – y coordinate of the block
    - -
    Returns:
    -

    the elevation of the block

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the elevation of the block

    +
    Return type:

    number

    +
-
-
-map.setElevation(x, y, elevation, forceRedraw = true, commitChanges = true)
+
+
+map.setElevation(x, y, elevation, forceRedraw = true, commitChanges = true)

Sets the elevation of a block in the currently-opened map.

-
-
Arguments:
-
    -
  • x (number) – x coordinate of the block

  • -
  • y (number) – y coordinate of the block

  • -
  • elevation (number) – the elevation of the block

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • -
  • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().

  • + +++ + + + +
    Arguments:
      +
    • x (number) – x coordinate of the block
    • +
    • y (number) – y coordinate of the block
    • +
    • elevation (number) – the elevation of the block
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    • +
    • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().
    - - +
-
-
-map.setBlocksFromSelection(x, y, forceRedraw = true, commitChanges = true)
+
+
+map.setBlocksFromSelection(x, y, forceRedraw = true, commitChanges = true)

Sets blocks on the map using the user’s current metatile selection.

-
-
Arguments:
-
    -
  • x (number) – initial x coordinate

  • -
  • y (number) – initial y coordinate

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • -
  • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().

  • + +++ + + + +
    Arguments:
      +
    • x (number) – initial x coordinate
    • +
    • y (number) – initial y coordinate
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    • +
    • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().
    - - +
-
-
-map.bucketFill(x, y, metatileId, forceRedraw = true, commitChanges = true)
+
+
+map.bucketFill(x, y, metatileId, forceRedraw = true, commitChanges = true)

Performs a bucket fill of a metatile id, starting at the given coordinates.

-
-
Arguments:
-
    -
  • x (number) – initial x coordinate

  • -
  • y (number) – initial y coordinate

  • -
  • metatileId (number) – metatile id to fill

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • -
  • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().

  • + +++ + + + +
    Arguments:
      +
    • x (number) – initial x coordinate
    • +
    • y (number) – initial y coordinate
    • +
    • metatileId (number) – metatile id to fill
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    • +
    • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().
    - - +
-
-
-map.bucketFillFromSelection(x, y, forceRedraw = true, commitChanges = true)
+
+
+map.bucketFillFromSelection(x, y, forceRedraw = true, commitChanges = true)

Performs a bucket fill using the user’s current metatile selection, starting at the given coordinates.

-
-
Arguments:
-
    -
  • x (number) – initial x coordinate

  • -
  • y (number) – initial y coordinate

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • -
  • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().

  • + +++ + + + +
    Arguments:
      +
    • x (number) – initial x coordinate
    • +
    • y (number) – initial y coordinate
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    • +
    • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().
    - - +
-
-
-map.magicFill(x, y, metatileId, forceRedraw = true, commitChanges = true)
+
+
+map.magicFill(x, y, metatileId, forceRedraw = true, commitChanges = true)

Performs a magic fill of a metatile id, starting at the given coordinates.

-
-
Arguments:
-
    -
  • x (number) – initial x coordinate

  • -
  • y (number) – initial y coordinate

  • -
  • metatileId (number) – metatile id to magic fill

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • -
  • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().

  • + +++ + + + +
    Arguments:
      +
    • x (number) – initial x coordinate
    • +
    • y (number) – initial y coordinate
    • +
    • metatileId (number) – metatile id to magic fill
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    • +
    • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().
    - - +
-
-
-map.magicFillFromSelection(x, y, forceRedraw = true, commitChanges = true)
+
+
+map.magicFillFromSelection(x, y, forceRedraw = true, commitChanges = true)

Performs a magic fill using the user’s current metatile selection, starting at the given coordinates.

-
-
Arguments:
-
    -
  • x (number) – initial x coordinate

  • -
  • y (number) – initial y coordinate

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • -
  • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().

  • + +++ + + + +
    Arguments:
      +
    • x (number) – initial x coordinate
    • +
    • y (number) – initial y coordinate
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    • +
    • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().
    - - +
-
-
-map.shift(xDelta, yDelta, forceRedraw = true, commitChanges = true)
+
+
+map.shift(xDelta, yDelta, forceRedraw = true, commitChanges = true)

Performs a shift on the map’s blocks.

-
-
Arguments:
-
    -
  • xDelta (number) – number of blocks to shift horizontally

  • -
  • yDelta (number) – number of blocks to shift vertically

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • -
  • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().

  • + +++ + + + +
    Arguments:
      +
    • xDelta (number) – number of blocks to shift horizontally
    • +
    • yDelta (number) – number of blocks to shift vertically
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    • +
    • commitChanges (boolean) – Commit the changes to the map’s edit/undo history. Defaults to true. When making many related map edits, it can be useful to set this to false, and then commit all of them together with map.commit().
    - - +
-
-
-map.getDimensions()
+
+
+map.getDimensions()

Gets the dimensions of the currently-opened map.

-
-
Returns:
-

the dimensions of the map

-
-
Return type:
-

object ({width, height})

-
-
+ +++ + + + + + +
Returns:the dimensions of the map
Return type:object ({width, height})
-
-
-map.getWidth()
+
+
+map.getWidth()

Gets the width of the currently-opened map.

-
-
Returns:
-

the width of the map

-
-
Return type:
-

number

-
-
+ +++ + + + + + +
Returns:the width of the map
Return type:number
-
-
-map.getHeight()
+
+
+map.getHeight()

Gets the height of the currently-opened map.

-
-
Returns:
-

the height of the map

-
-
Return type:
-

number

-
-
+ +++ + + + + + +
Returns:the height of the map
Return type:number
-
-
-map.getBorderDimensions()
+
+
+map.getBorderDimensions()

Gets the dimensions of the border of the currently-opened map.

-
-
Returns:
-

the dimensions of the border

-
-
Return type:
-

object ({width, height})

-
-
+ +++ + + + + + +
Returns:the dimensions of the border
Return type:object ({width, height})
-
-
-map.getBorderWidth()
+
+
+map.getBorderWidth()

Gets the width of the border of the currently-opened map.

-
-
Returns:
-

the width of the border

-
-
Return type:
-

number

-
-
+ +++ + + + + + +
Returns:the width of the border
Return type:number
-
-
-map.getBorderHeight()
+
+
+map.getBorderHeight()

Gets the height of the border of the currently-opened map.

-
-
Returns:
-

the height of the border

-
-
Return type:
-

number

-
-
+ +++ + + + + + +
Returns:the height of the border
Return type:number
-
-
-map.setDimensions(width, height)
+
+
+map.setDimensions(width, height)

Sets the dimensions of the currently-opened map.

-
-
Arguments:
-
    -
  • width (number) – width in blocks

  • -
  • height (number) – height in blocks

  • + +++ + + + +
    Arguments:
      +
    • width (number) – width in blocks
    • +
    • height (number) – height in blocks
    - - +
-
-
-map.setWidth(width)
+
+
+map.setWidth(width)

Sets the width of the currently-opened map.

-
-
Arguments:
-
    -
  • width (number) – width in blocks

  • + +++ + + + +
    Arguments:
      +
    • width (number) – width in blocks
    - - +
-
-
-map.setHeight()
+
+
+map.setHeight()

Sets the height of the currently-opened map.

-
-
Arguments:
-
    -
  • height (number) – height in blocks

  • + +++ + + + +
    Arguments:
      +
    • height (number) – height in blocks
    - - +
-
-
-map.setBorderDimensions(width, height)
+
+
+map.setBorderDimensions(width, height)

Sets the dimensions of the border of the currently-opened map. If the config setting use_custom_border_size is set to 0 then this does nothing.

-
-
Arguments:
-
    -
  • width (number) – width in blocks

  • -
  • height (number) – height in blocks

  • + +++ + + + +
    Arguments:
      +
    • width (number) – width in blocks
    • +
    • height (number) – height in blocks
    - - +
-
-
-map.setBorderWidth(width)
+
+
+map.setBorderWidth(width)

Sets the width of the border of the currently-opened map. If the config setting use_custom_border_size is set to 0 then this does nothing.

-
-
Arguments:
-
    -
  • width (number) – width in blocks

  • + +++ + + + +
    Arguments:
      +
    • width (number) – width in blocks
    - - +
-
-
-map.setBorderHeight(height)
+
+
+map.setBorderHeight(height)

Sets the height of the border of the currently-opened map. If the config setting use_custom_border_size is set to 0 then this does nothing.

-
-
Arguments:
-
    -
  • height (number) – height in blocks

  • + +++ + + + +
    Arguments:
      +
    • height (number) – height in blocks
    - - +
-
-
-map.redraw()
+
+
+map.redraw()

Redraws the entire map area. Useful when delaying map redraws using forceRedraw = false in certain map editing functions.

-
-
-map.commit()
+
+
+map.commit()

Commits any uncommitted changes to the map’s edit/undo history. Useful when delaying commits using commitChanges = false in certain map editing functions.

- -
-

Map Header Editing Functions

+
+
+

Map Header Editing Functions

The following functions are related to reading/writing the map’s header properties.

All map header functions are callable via the global map object.

-
-
-map.getSong()
+
+
+map.getSong()

Gets the name of the background song for the currently-opened map.

-
-
Returns:
-

the name of the song

-
-
Return type:
-

string

-
-
+ +++ + + + + + +
Returns:the name of the song
Return type:string
-
-
-map.setSong(song)
+
+
+map.setSong(song)

Sets the name of the background song for the currently-opened map. The song name must be one of the names in the “Song” dropdown menu on the Header tab.

-
-
Arguments:
-
    -
  • song (string) – the name of the song

  • + +++ + + + +
    Arguments:
      +
    • song (string) – the name of the song
    - - +
-
-
-map.getLocation()
+
+
+map.getLocation()

Gets the name of the region map location for the currently-opened map.

-
-
Returns:
-

the name of the location

-
-
Return type:
-

string

-
-
+ +++ + + + + + +
Returns:the name of the location
Return type:string
-
-
-map.setLocation(location)
+
+
+map.setLocation(location)

Sets the name of the region map location for the currently-opened map. The location name must be one of the names in the “Location” dropdown menu on the Header tab.

-
-
Arguments:
-
    -
  • location (string) – the name of the location

  • + +++ + + + +
    Arguments:
      +
    • location (string) – the name of the location
    - - +
-
-
-map.getRequiresFlash()
+
+
+map.getRequiresFlash()

Gets whether flash would be required in-game for the currently-opened map.

-
-
Returns:
-

whether flash is required

-
-
Return type:
-

boolean

-
-
+ +++ + + + + + +
Returns:whether flash is required
Return type:boolean
-
-
-map.setRequiresFlash(require)
+
+
+map.setRequiresFlash(require)

Sets whether flash would be required in-game for the currently-opened map.

-
-
Arguments:
-
    -
  • require (boolean) – whether flash should be required

  • + +++ + + + +
    Arguments:
      +
    • require (boolean) – whether flash should be required
    - - +
-
-
-map.getWeather()
+
+
+map.getWeather()

Gets the name of the weather for the currently-opened map.

-
-
Returns:
-

the name of the weather

-
-
Return type:
-

string

-
-
+ +++ + + + + + +
Returns:the name of the weather
Return type:string
-
-
-map.setWeather(weather)
+
+
+map.setWeather(weather)

Sets the name of the weather for the currently-opened map. The weather name must be one of the names in the “Weather” dropdown menu on the Header tab.

-
-
Arguments:
-
    -
  • weather (string) – the name of the weather

  • + +++ + + + +
    Arguments:
      +
    • weather (string) – the name of the weather
    - - +
-
-
-map.getType()
+
+
+map.getType()

Gets the name of the map type for the currently-opened map.

-
-
Returns:
-

the name of the map type

-
-
Return type:
-

string

-
-
+ +++ + + + + + +
Returns:the name of the map type
Return type:string
-
-
-map.setType(type)
+
+
+map.setType(type)

Sets the name of the map type for the currently-opened map. The map type name must be one of the names in the “Type” dropdown menu on the Header tab.

-
-
Arguments:
-
    -
  • type (string) – the name of the map type

  • + +++ + + + +
    Arguments:
      +
    • type (string) – the name of the map type
    - - +
-
-
-map.getBattleScene()
+
+
+map.getBattleScene()

Gets the name of the battle scene for the currently-opened map.

-
-
Returns:
-

the name of the battle scene

-
-
Return type:
-

string

-
-
+ +++ + + + + + +
Returns:the name of the battle scene
Return type:string
-
-
-map.setBattleScene(battleScene)
+
+
+map.setBattleScene(battleScene)

Sets the name of the battle scene for the currently-opened map. The battle scene name must be one of the names in the “Battle scene” dropdown menu on the Header tab.

-
-
Arguments:
-
    -
  • battleScene (string) – the name of the battle scene

  • + +++ + + + +
    Arguments:
      +
    • battleScene (string) – the name of the battle scene
    - - +
-
-
-map.getShowLocationName()
+
+
+map.getShowLocationName()

Gets whether the location name will appear in-game for the currently-opened map.

-
-
Returns:
-

whether the location name will be shown

-
-
Return type:
-

boolean

-
-
+ +++ + + + + + +
Returns:whether the location name will be shown
Return type:boolean
-
-
-map.setShowLocationName(show)
+
+
+map.setShowLocationName(show)

Sets whether the location name should appear in-game for the currently-opened map.

-
-
Arguments:
-
    -
  • show (boolean) – whether the location name should be shown

  • + +++ + + + +
    Arguments:
      +
    • show (boolean) – whether the location name should be shown
    - - +
-
-
-map.getAllowRunning()
+
+
+map.getAllowRunning()

Gets whether running is allowed in-game for the currently-opened map.

-
-
Returns:
-

whether running is allowed

-
-
Return type:
-

boolean

-
-
+ +++ + + + + + +
Returns:whether running is allowed
Return type:boolean
-
-
-map.setAllowRunning(allow)
+
+
+map.setAllowRunning(allow)

Sets whether running should be allowed in-game for the currently-opened map.

-
-
Arguments:
-
    -
  • allow (boolean) – whether running should be allowed

  • + +++ + + + +
    Arguments:
      +
    • allow (boolean) – whether running should be allowed
    - - +
-
-
-map.getAllowBiking()
+
+
+map.getAllowBiking()

Gets whether biking is allowed in-game for the currently-opened map.

-
-
Returns:
-

whether biking is allowed

-
-
Return type:
-

boolean

-
-
+ +++ + + + + + +
Returns:whether biking is allowed
Return type:boolean
-
-
-map.setAllowBiking(allow)
+
+
+map.setAllowBiking(allow)

Sets whether biking should be allowed in-game for the currently-opened map.

-
-
Arguments:
-
    -
  • allow (boolean) – whether biking should be allowed

  • + +++ + + + +
    Arguments:
      +
    • allow (boolean) – whether biking should be allowed
    - - +
-
-
-map.getAllowEscaping()
+
+
+map.getAllowEscaping()

Gets whether escaping (using Escape Rope or Dig) is allowed in-game for the currently-opened map.

-
-
Returns:
-

whether escaping is allowed

-
-
Return type:
-

boolean

-
-
+ +++ + + + + + +
Returns:whether escaping is allowed
Return type:boolean
-
-
-map.setAllowEscaping(allow)
+
+
+map.setAllowEscaping(allow)

Sets whether escaping (using Escape Rope or Dig) should be allowed in-game for the currently-opened map.

-
-
Arguments:
-
    -
  • allow (boolean) – whether escaping should be allowed

  • + +++ + + + +
    Arguments:
      +
    • allow (boolean) – whether escaping should be allowed
    - - +
-
-
-map.getFloorNumber()
+
+
+map.getFloorNumber()

Gets the floor number for the currently-opened map.

-
-
Returns:
-

the floor number

-
-
Return type:
-

number

-
-
+ +++ + + + + + +
Returns:the floor number
Return type:number
-
-
-map.setFloorNumber(floorNumber)
+
+
+map.setFloorNumber(floorNumber)

Sets the floor number for the currently-opened map. Floor numbers can be any number between -128 and 127 inclusive.

-
-
Arguments:
-
    -
  • floorNumber (number) – the floor number

  • + +++ + + + +
    Arguments:
      +
    • floorNumber (number) – the floor number
    - - +
- -
-

Tileset Functions

+
+
+

Tileset Functions

The following functions are related to tilesets and how they are rendered. The functions with “preview” in their name operate on a “fake” version of the palette colors. This means that changing these “preview” colors won’t affect the actual tileset colors in the project. A good use of the “preview” palettes would be Day/Night tints, for example.

All tileset functions are callable via the global map object.

-
-
-map.getPrimaryTileset()
+
+
+map.getPrimaryTileset()

Gets the name of the primary tileset for the currently-opened map.

-
-
Returns:
-

primary tileset name

-
-
Return type:
-

string

-
-
+ +++ + + + + + +
Returns:primary tileset name
Return type:string
-
-
-map.setPrimaryTileset(tileset)
+
+
+map.setPrimaryTileset(tileset)

Sets the primary tileset for the currently-opened map.

-
-
Arguments:
-
    -
  • tileset (string) – the tileset name

  • + +++ + + + +
    Arguments:
      +
    • tileset (string) – the tileset name
    - - +
-
-
-map.getSecondaryTileset()
+
+
+map.getSecondaryTileset()

Gets the name of the secondary tileset for the currently-opened map.

-
-
Returns:
-

secondary tileset name

-
-
Return type:
-

string

-
-
+ +++ + + + + + +
Returns:secondary tileset name
Return type:string
-
-
-map.setSecondaryTileset(tileset)
+
+
+map.setSecondaryTileset(tileset)

Sets the secondary tileset for the currently-opened map.

-
-
Arguments:
-
    -
  • tileset (string) – the tileset name

  • + +++ + + + +
    Arguments:
      +
    • tileset (string) – the tileset name
    - - +
-
-
-map.getNumPrimaryTilesetTiles()
+
+
+map.getNumPrimaryTilesetTiles()

Gets the number of tiles in the primary tileset for the currently-opened map.

-
-
Returns:
-

number of tiles

-
-
Return type:
-

number

-
-
+ +++ + + + + + +
Returns:number of tiles
Return type:number
-
-
-map.getNumSecondaryTilesetTiles()
+
+
+map.getNumSecondaryTilesetTiles()

Gets the number of tiles in the secondary tileset for the currently-opened map.

-
-
Returns:
-

number of tiles

-
-
Return type:
-

number

-
-
+ +++ + + + + + +
Returns:number of tiles
Return type:number
-
-
-map.getNumPrimaryTilesetMetatiles()
+
+
+map.getNumPrimaryTilesetMetatiles()

Gets the number of metatiles in the primary tileset for the currently-opened map.

-
-
Returns:
-

number of metatiles

-
-
Return type:
-

number

-
-
+ +++ + + + + + +
Returns:number of metatiles
Return type:number
-
-
-map.getNumSecondaryTilesetMetatiles()
+
+
+map.getNumSecondaryTilesetMetatiles()

Gets the number of metatiles in the secondary tileset for the currently-opened map.

-
-
Returns:
-

number of metatiles

-
-
Return type:
-

number

-
-
+ +++ + + + + + +
Returns:number of metatiles
Return type:number
-
-
-map.getPrimaryTilesetPalettePreview(paletteIndex)
+
+
+map.getPrimaryTilesetPalettePreview(paletteIndex)

Gets a palette from the primary tileset of the currently-opened map.

-
-
Arguments:
-
    -
  • paletteIndex (number) – the palette index

  • + +++ + + + + + + + +
    Arguments:
      +
    • paletteIndex (number) – the palette index
    - -
    Returns:
    -

    array of colors. Each color is a 3-element RGB array

    -
    -
    Return type:
    -

    array

    -
    - +
    Returns:

    array of colors. Each color is a 3-element RGB array

    +
    Return type:

    array

    +
-
-
-map.setPrimaryTilesetPalettePreview(paletteIndex, colors, forceRedraw = true)
+
+
+map.setPrimaryTilesetPalettePreview(paletteIndex, colors, forceRedraw = true)

Sets a palette in the primary tileset of the currently-opened map. This will NOT affect the true underlying colors–it only displays these colors in the map-editing area of Porymap.

-
-
Arguments:
-
    -
  • paletteIndex (number) – the palette index

  • -
  • colors (array) – array of colors. Each color is a 3-element RGB array

  • -
  • forceRedraw (boolean) – Redraw the elements with the updated palette. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.

  • + +++ + + + +
    Arguments:
      +
    • paletteIndex (number) – the palette index
    • +
    • colors (array) – array of colors. Each color is a 3-element RGB array
    • +
    • forceRedraw (boolean) – Redraw the elements with the updated palette. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.
    - - +
-
-
-map.getPrimaryTilesetPalettesPreview()
+
+
+map.getPrimaryTilesetPalettesPreview()

Gets all of the palettes from the primary tileset of the currently-opened map.

-
-
Returns:
-

array of arrays of colors. Each color is a 3-element RGB array

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:array of arrays of colors. Each color is a 3-element RGB array
Return type:array
-
-
-map.setPrimaryTilesetPalettesPreview(palettes, forceRedraw = true)
+
+
+map.setPrimaryTilesetPalettesPreview(palettes, forceRedraw = true)

Sets all of the palettes in the primary tileset of the currently-opened map. This will NOT affect the true underlying colors–it only displays these colors in the map-editing area of Porymap.

-
-
Arguments:
-
    -
  • palettes (array) – array of arrays of colors. Each color is a 3-element RGB array

  • -
  • forceRedraw (boolean) – Redraw the elements with the updated palettes. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.

  • + +++ + + + +
    Arguments:
      +
    • palettes (array) – array of arrays of colors. Each color is a 3-element RGB array
    • +
    • forceRedraw (boolean) – Redraw the elements with the updated palettes. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.
    - - +
-
-
-map.getSecondaryTilesetPalettePreview(paletteIndex)
+
+
+map.getSecondaryTilesetPalettePreview(paletteIndex)

Gets a palette from the secondary tileset of the currently-opened map.

-
-
Arguments:
-
    -
  • paletteIndex (number) – the palette index

  • + +++ + + + + + + + +
    Arguments:
      +
    • paletteIndex (number) – the palette index
    - -
    Returns:
    -

    array of colors. Each color is a 3-element RGB array

    -
    -
    Return type:
    -

    array

    -
    - +
    Returns:

    array of colors. Each color is a 3-element RGB array

    +
    Return type:

    array

    +
-
-
-map.setSecondaryTilesetPalettePreview(paletteIndex, colors, forceRedraw = true)
+
+
+map.setSecondaryTilesetPalettePreview(paletteIndex, colors, forceRedraw = true)

Sets a palette in the secondary tileset of the currently-opened map. This will NOT affect the true underlying colors–it only displays these colors in the map-editing area of Porymap.

-
-
Arguments:
-
    -
  • paletteIndex (number) – the palette index

  • -
  • colors (array) – array of colors. Each color is a 3-element RGB array

  • -
  • forceRedraw (boolean) – Redraw the elements with the updated palette. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.

  • + +++ + + + +
    Arguments:
      +
    • paletteIndex (number) – the palette index
    • +
    • colors (array) – array of colors. Each color is a 3-element RGB array
    • +
    • forceRedraw (boolean) – Redraw the elements with the updated palette. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.
    - - +
-
-
-map.getSecondaryTilesetPalettesPreview()
+
+
+map.getSecondaryTilesetPalettesPreview()

Gets all of the palettes from the secondary tileset of the currently-opened map.

-
-
Returns:
-

array of arrays of colors. Each color is a 3-element RGB array

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:array of arrays of colors. Each color is a 3-element RGB array
Return type:array
-
-
-map.setSecondaryTilesetPalettesPreview(palettes, forceRedraw = true)
+
+
+map.setSecondaryTilesetPalettesPreview(palettes, forceRedraw = true)

Sets all of the palettes in the secondary tileset of the currently-opened map. This will NOT affect the true underlying colors–it only displays these colors in the map-editing area of Porymap.

-
-
Arguments:
-
    -
  • palettes (array) – array of arrays of colors. Each color is a 3-element RGB array

  • -
  • forceRedraw (boolean) – Redraw the elements with the updated palettes. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.

  • + +++ + + + +
    Arguments:
      +
    • palettes (array) – array of arrays of colors. Each color is a 3-element RGB array
    • +
    • forceRedraw (boolean) – Redraw the elements with the updated palettes. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.
    - - +
-
-
-map.getPrimaryTilesetPalette(paletteIndex)
+
+
+map.getPrimaryTilesetPalette(paletteIndex)

Gets a palette from the primary tileset of the currently-opened map.

-
-
Arguments:
-
    -
  • paletteIndex (number) – the palette index

  • + +++ + + + + + + + +
    Arguments:
      +
    • paletteIndex (number) – the palette index
    - -
    Returns:
    -

    array of colors. Each color is a 3-element RGB array

    -
    -
    Return type:
    -

    array

    -
    - +
    Returns:

    array of colors. Each color is a 3-element RGB array

    +
    Return type:

    array

    +
-
-
-map.setPrimaryTilesetPalette(paletteIndex, colors, forceRedraw = true)
+
+
+map.setPrimaryTilesetPalette(paletteIndex, colors, forceRedraw = true)

Sets a palette in the primary tileset of the currently-opened map. This will permanently affect the palette and save the palette to disk.

-
-
Arguments:
-
    -
  • paletteIndex (number) – the palette index

  • -
  • colors (array) – array of colors. Each color is a 3-element RGB array

  • -
  • forceRedraw (boolean) – Redraw the elements with the updated palette. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.

  • + +++ + + + +
    Arguments:
      +
    • paletteIndex (number) – the palette index
    • +
    • colors (array) – array of colors. Each color is a 3-element RGB array
    • +
    • forceRedraw (boolean) – Redraw the elements with the updated palette. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.
    - - +
-
-
-map.getPrimaryTilesetPalettes()
+
+
+map.getPrimaryTilesetPalettes()

Gets all of the palettes from the primary tileset of the currently-opened map.

-
-
Returns:
-

array of arrays of colors. Each color is a 3-element RGB array

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:array of arrays of colors. Each color is a 3-element RGB array
Return type:array
-
-
-map.setPrimaryTilesetPalettes(palettes, forceRedraw = true)
+
+
+map.setPrimaryTilesetPalettes(palettes, forceRedraw = true)

Sets all of the palettes in the primary tileset of the currently-opened map. This will permanently affect the palettes and save the palettes to disk.

-
-
Arguments:
-
    -
  • palettes (array) – array of arrays of colors. Each color is a 3-element RGB array

  • -
  • forceRedraw (boolean) – Redraw the elements with the updated palettes. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.

  • + +++ + + + +
    Arguments:
      +
    • palettes (array) – array of arrays of colors. Each color is a 3-element RGB array
    • +
    • forceRedraw (boolean) – Redraw the elements with the updated palettes. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.
    - - +
-
-
-map.getSecondaryTilesetPalette(paletteIndex)
+
+
+map.getSecondaryTilesetPalette(paletteIndex)

Gets a palette from the secondary tileset of the currently-opened map.

-
-
Arguments:
-
    -
  • paletteIndex (number) – the palette index

  • + +++ + + + + + + + +
    Arguments:
      +
    • paletteIndex (number) – the palette index
    - -
    Returns:
    -

    array of colors. Each color is a 3-element RGB array

    -
    -
    Return type:
    -

    array

    -
    - +
    Returns:

    array of colors. Each color is a 3-element RGB array

    +
    Return type:

    array

    +
-
-
-map.setSecondaryTilesetPalette(paletteIndex, colors, forceRedraw = true)
+
+
+map.setSecondaryTilesetPalette(paletteIndex, colors, forceRedraw = true)

Sets a palette in the secondary tileset of the currently-opened map. This will permanently affect the palette and save the palette to disk.

-
-
Arguments:
-
    -
  • paletteIndex (number) – the palette index

  • -
  • colors (array) – array of colors. Each color is a 3-element RGB array

  • -
  • forceRedraw (boolean) – Redraw the elements with the updated palette. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.

  • + +++ + + + +
    Arguments:
      +
    • paletteIndex (number) – the palette index
    • +
    • colors (array) – array of colors. Each color is a 3-element RGB array
    • +
    • forceRedraw (boolean) – Redraw the elements with the updated palette. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.
    - - +
-
-
-map.getSecondaryTilesetPalettes()
+
+
+map.getSecondaryTilesetPalettes()

Gets all of the palettes from the secondary tileset of the currently-opened map.

-
-
Returns:
-

array of arrays of colors. Each color is a 3-element RGB array

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:array of arrays of colors. Each color is a 3-element RGB array
Return type:array
-
-
-map.setSecondaryTilesetPalettes(palettes, forceRedraw = true)
+
+
+map.setSecondaryTilesetPalettes(palettes, forceRedraw = true)

Sets all of the palettes in the secondary tileset of the currently-opened map. This will permanently affect the palettes and save the palettes to disk.

-
-
Arguments:
-
    -
  • palettes (array) – array of arrays of colors. Each color is a 3-element RGB array

  • -
  • forceRedraw (boolean) – Redraw the elements with the updated palettes. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.

  • + +++ + + + +
    Arguments:
      +
    • palettes (array) – array of arrays of colors. Each color is a 3-element RGB array
    • +
    • forceRedraw (boolean) – Redraw the elements with the updated palettes. Defaults to true. Redrawing the elements that use palettes is expensive, so it can be useful to batch together many calls to palette functions and only set redraw to true on the final call.
    - - +
-
-
-map.getMetatileLabel(metatileId)
+
+
+map.getMetatileLabel(metatileId)

Gets the label for the specified metatile.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • + +++ + + + + + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    - -
    Returns:
    -

    the label

    -
    -
    Return type:
    -

    string

    -
    - +
    Returns:

    the label

    +
    Return type:

    string

    +
-
-
-map.setMetatileLabel(metatileId, label)
+
+
+map.setMetatileLabel(metatileId, label)

Sets the label for the specified metatile. A label can only consist of letters, numbers, and underscores.

Warning: This function writes directly to the project. There is no undo for this.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • -
  • label (string) – the label

  • + +++ + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    • +
    • label (string) – the label
    - - +
-
-
-map.getMetatileLayerType(metatileId)
+
+
+map.getMetatileLayerType(metatileId)

Gets the layer type for the specified metatile. 0: Middle/Top, 1: Bottom/Middle, 2: Bottom/Top.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • + +++ + + + + + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    - -
    Returns:
    -

    the layer type

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the layer type

    +
    Return type:

    number

    +
-
-
-map.setMetatileLayerType(metatileId, layerType)
+
+
+map.setMetatileLayerType(metatileId, layerType)

Sets the layer type for the specified metatile. 0: Middle/Top, 1: Bottom/Middle, 2: Bottom/Top.

Warning: This function writes directly to the tileset. There is no undo for this.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • -
  • layerType (number) – the layer type

  • + +++ + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    • +
    • layerType (number) – the layer type
    - - +
-
-
-map.getMetatileEncounterType(metatileId)
+
+
+map.getMetatileEncounterType(metatileId)

Gets the encounter type for the specified metatile. 0: None, 1: Land, 2: Water

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • + +++ + + + + + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    - -
    Returns:
    -

    the encounter type

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the encounter type

    +
    Return type:

    number

    +
-
-
-map.setMetatileEncounterType(metatileId, encounterType)
+
+
+map.setMetatileEncounterType(metatileId, encounterType)

Sets the encounter type for the specified metatile. 0: None, 1: Land, 2: Water

Warning: This function writes directly to the tileset. There is no undo for this.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • -
  • encounterType (number) – the encounter type

  • + +++ + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    • +
    • encounterType (number) – the encounter type
    - - +
-
-
-map.getMetatileTerrainType(metatileId)
+
+
+map.getMetatileTerrainType(metatileId)

Gets the terrain type for the specified metatile. 0: None, 1: Grass, 2: Water, 3: Waterfall

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • + +++ + + + + + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    - -
    Returns:
    -

    the terrain type

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the terrain type

    +
    Return type:

    number

    +
-
-
-map.setMetatileTerrainType(metatileId, terrainType)
+
+
+map.setMetatileTerrainType(metatileId, terrainType)

Sets the terrain type for the specified metatile. 0: None, 1: Grass, 2: Water, 3: Waterfall

Warning: This function writes directly to the tileset. There is no undo for this.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • -
  • terrainType (number) – the terrain type

  • + +++ + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    • +
    • terrainType (number) – the terrain type
    - - +
-
-
-map.getMetatileBehavior(metatileId)
+
+
+map.getMetatileBehavior(metatileId)

Gets the behavior for the specified metatile.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • + +++ + + + + + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    - -
    Returns:
    -

    the behavior

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the behavior

    +
    Return type:

    number

    +
-
-
-map.setMetatileBehavior(metatileId, behavior)
+
+
+map.setMetatileBehavior(metatileId, behavior)

Sets the behavior for the specified metatile.

Warning: This function writes directly to the tileset. There is no undo for this.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • -
  • behavior (number) – the behavior

  • + +++ + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    • +
    • behavior (number) – the behavior
    - - +
-
-
-map.getMetatileAttributes(metatileId)
+
+
+map.getMetatileAttributes(metatileId)

Gets the raw attributes value for the specified metatile.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • + +++ + + + + + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    - -
    Returns:
    -

    the raw attributes value

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the raw attributes value

    +
    Return type:

    number

    +
-
-
-map.setMetatileAttributes(metatileId, attributes)
+
+
+map.setMetatileAttributes(metatileId, attributes)

Sets the raw attributes value for the specified metatile.

Warning: This function writes directly to the tileset. There is no undo for this. Porymap will not limit the value of existing attributes to their usual range.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • -
  • attributes (number) – the raw attributes value

  • + +++ + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    • +
    • attributes (number) – the raw attributes value
    - - +
-
-
-map.getMetatileTile(metatileId, tileIndex)
+
+
+map.getMetatileTile(metatileId, tileIndex)

Gets the tile at the specified index of the metatile.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • -
  • tileIndex (number) – index of the tile to get

  • + +++ + + + + + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    • +
    • tileIndex (number) – index of the tile to get
    - -
    Returns:
    -

    the tile

    -
    -
    Return type:
    -

    object ({tileId, xflip, yflip, palette})

    -
    - +
    Returns:

    the tile

    +
    Return type:

    object ({tileId, xflip, yflip, palette})

    +
-
-
-map.getMetatileTiles(metatileId, tileStart = 0, tileEnd = -1)
+
+
+map.getMetatileTiles(metatileId, tileStart = 0, tileEnd = -1)

Gets the tiles in the specified range of the metatile.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • -
  • tileStart (number) – index of the first tile to get. Defaults to 0 (the first tile)

  • -
  • tileEnd (number) – index of the last tile to get. Defaults to -1 (the last tile)

  • + +++ + + + + + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    • +
    • tileStart (number) – index of the first tile to get. Defaults to 0 (the first tile)
    • +
    • tileEnd (number) – index of the last tile to get. Defaults to -1 (the last tile)
    - -
    Returns:
    -

    array of tiles in the specified range. Each tile is an object of the form {tileId, xflip, yflip, palette}

    -
    -
    Return type:
    -

    array

    -
    - +
    Returns:

    array of tiles in the specified range. Each tile is an object of the form {tileId, xflip, yflip, palette}

    +
    Return type:

    array

    +
-
-
-map.setMetatileTile(metatileId, tileIndex, tileId, xflip, yflip, palette, forceRedraw = true)
+
+
+map.setMetatileTile(metatileId, tileIndex, tileId, xflip, yflip, palette, forceRedraw = true)

Sets the tile at the specified index of the metatile.

Warning: This function writes directly to the tileset. There is no undo for this.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • -
  • tileIndex (number) – index of the tile to set

  • -
  • tileId (number) – new tile’s value

  • -
  • xflip (boolean) – whether the new tile is flipped horizontally

  • -
  • yflip (boolean) – whether the new tile is flipped vertically

  • -
  • palette (number) – new tile’s palette number

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • + +++ + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    • +
    • tileIndex (number) – index of the tile to set
    • +
    • tileId (number) – new tile’s value
    • +
    • xflip (boolean) – whether the new tile is flipped horizontally
    • +
    • yflip (boolean) – whether the new tile is flipped vertically
    • +
    • palette (number) – new tile’s palette number
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    - - +
-
-
-map.setMetatileTile(metatileId, tileIndex, tile, forceRedraw = true)
+
+
+map.setMetatileTile(metatileId, tileIndex, tile, forceRedraw = true)

Sets the tile at the specified index of the metatile. This is an overloaded function that takes a single tile as a JavaScript object instead of each of the tile’s properties individually.

Warning: This function writes directly to the tileset. There is no undo for this.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • -
  • tileIndex (number) – index of the tile to set

  • -
  • tile (object) – the new tile. tile is an object with the properties {tileId, xflip, yflip, palette}

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • + +++ + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    • +
    • tileIndex (number) – index of the tile to set
    • +
    • tile (object) – the new tile. tile is an object with the properties {tileId, xflip, yflip, palette}
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    - - +
-
-
-map.setMetatileTiles(metatileId, tileId, xflip, yflip, palette, tileStart = 0, tileEnd = -1, forceRedraw = true)
+
+
+map.setMetatileTiles(metatileId, tileId, xflip, yflip, palette, tileStart = 0, tileEnd = -1, forceRedraw = true)

Sets the tiles in the specified range of the metatile. All tiles in the specified range will be set using the same given values.

Warning: This function writes directly to the tileset. There is no undo for this.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • -
  • tileId (number) – new tiles’ value

  • -
  • xflip (boolean) – whether the new tiles are flipped horizontally

  • -
  • yflip (boolean) – whether the new tiles are flipped vertically

  • -
  • palette (number) – new tiles’ palette number

  • -
  • tileStart (number) – index of the first tile to set. Defaults to 0 (the first tile)

  • -
  • tileEnd (number) – index of the last tile to set. Defaults to -1 (the last tile)

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • + +++ + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    • +
    • tileId (number) – new tiles’ value
    • +
    • xflip (boolean) – whether the new tiles are flipped horizontally
    • +
    • yflip (boolean) – whether the new tiles are flipped vertically
    • +
    • palette (number) – new tiles’ palette number
    • +
    • tileStart (number) – index of the first tile to set. Defaults to 0 (the first tile)
    • +
    • tileEnd (number) – index of the last tile to set. Defaults to -1 (the last tile)
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    - - +
-
-
-map.setMetatileTiles(metatileId, tiles, tileStart = 0, tileEnd = -1, forceRedraw = true)
+
+
+map.setMetatileTiles(metatileId, tiles, tileStart = 0, tileEnd = -1, forceRedraw = true)

Sets the tiles in the specified range of the metatile. This is an overloaded function that takes an array of tiles as JavaScript objects instead of each of the tile properties individually.

Warning: This function writes directly to the tileset. There is no undo for this.

-
-
Arguments:
-
    -
  • metatileId (number) – id of target metatile

  • -
  • tiles (array) – array of tiles to set. Each tile is an object of the form {tileId, xflip, yflip, palette}. If the array does not have sufficient objects to set all the tiles in the specified range then the remaining tiles will be set with all default values.

  • -
  • tileStart (number) – index of the first tile to set. Defaults to 0 (the first tile)

  • -
  • tileEnd (number) – index of the last tile to set. Defaults to -1 (the last tile)

  • -
  • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().

  • + +++ + + + +
    Arguments:
      +
    • metatileId (number) – id of target metatile
    • +
    • tiles (array) – array of tiles to set. Each tile is an object of the form {tileId, xflip, yflip, palette}. If the array does not have sufficient objects to set all the tiles in the specified range then the remaining tiles will be set with all default values.
    • +
    • tileStart (number) – index of the first tile to set. Defaults to 0 (the first tile)
    • +
    • tileEnd (number) – index of the last tile to set. Defaults to -1 (the last tile)
    • +
    • forceRedraw (boolean) – Force the map view to refresh. Defaults to true. Redrawing the map view is expensive, so set to false when making many consecutive map edits, and then redraw the map once using map.redraw().
    - - +
-
-
-map.getTilePixels(tileId)
+
+
+map.getTilePixels(tileId)

Gets the pixel data for the specified tile. The pixel data is an array of indexes indicating which palette color each pixel uses. Tiles are 8x8, so the pixel array will be 64 elements long.

-
-
Returns:
-

the pixel data

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:the pixel data
Return type:array
- -
-

Overlay Functions

+
+
+

Overlay Functions

The following functions are related to an overlay that is drawn on top of the map area. Text, images, and shapes can be drawn using these functions. Items can be drawn and manipulated on separate layers by specifiying a layer id. Items on higher layer ids will be drawn above those on lower layers. The visibility, opacity, position, rotation, and scale of each layer can be changed; by default all layers are visible, have an opacity of 100, are at position 0,0, an angle of 0, and a horizontal and vertical scale of 1.0.

All overlay functions are callable via the global overlay object.

-
-
-overlay.clear(layer)
+
+
+overlay.clear(layer)

Clears and erases all previously-added overlay items on the specified layer.

-
-
Arguments:
-
    -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • layer (number) – the layer id
    - - +
-
-
-overlay.clear()
+
+
+overlay.clear()

This is an overloaded function. Clears and erases all previously-added overlay items on every layer.

-
-
-overlay.hide(layer)
+
+
+overlay.hide(layer)

Hides all overlay items on the specified layer.

-
-
Arguments:
-
    -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • layer (number) – the layer id
    - - +
-
-
-overlay.hide()
+
+
+overlay.hide()

This is an overloaded function. Hides all overlay items on all active layers. Layers that have not been used yet will not be hidden.

-
-
-overlay.show(layer)
+
+
+overlay.show(layer)

Shows all overlay items on the specified layer.

-
-
Arguments:
-
    -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • layer (number) – the layer id
    - - +
-
-
-overlay.show()
+
+
+overlay.show()

This is an overloaded function. Shows all overlay items on all active layers.

-
-
-overlay.getVisibility(layer = 0)
+
+
+overlay.getVisibility(layer = 0)

Gets whether the specified overlay layer is currently showing or not.

-
-
Arguments:
-
    -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + + + + + +
    Arguments:
      +
    • layer (number) – the layer id. Defaults to 0
    - -
    Returns:
    -

    whether the layer is showing

    -
    -
    Return type:
    -

    boolean

    -
    - +
    Returns:

    whether the layer is showing

    +
    Return type:

    boolean

    +
-
-
-overlay.setVisibility(visible, layer)
+
+
+overlay.setVisibility(visible, layer)

Sets the visibility of the specified overlay layer.

-
-
Arguments:
-
    -
  • visible (boolean) – whether the layer should be showing

  • -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • visible (boolean) – whether the layer should be showing
    • +
    • layer (number) – the layer id
    - - +
-
-
-overlay.setVisibility(visible)
+
+
+overlay.setVisibility(visible)

This is an overloaded function. Sets the visibility of all active overlay layers.

-
-
Arguments:
-
    -
  • visible (boolean) – whether the layers should be showing

  • + +++ + + + +
    Arguments:
      +
    • visible (boolean) – whether the layers should be showing
    - - +
-
-
-overlay.getOpacity(layer = 0)
+
+
+overlay.getOpacity(layer = 0)

Gets the opacity of the specified overlay layer. Opacity ranges from 0 (invisible) to 100 (completely opaque).

-
-
Arguments:
-
    -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + + + + + +
    Arguments:
      +
    • layer (number) – the layer id. Defaults to 0
    - -
    Returns:
    -

    the opacity

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the opacity

    +
    Return type:

    number

    +
-
-
-overlay.setOpacity(opacity, layer)
+
+
+overlay.setOpacity(opacity, layer)

Sets the opacity of the specified overlay layer. Opacity ranges from 0 (invisible) to 100 (completely opaque).

-
-
Arguments:
-
    -
  • opacity (number) – the opacity

  • -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • opacity (number) – the opacity
    • +
    • layer (number) – the layer id
    - - +
-
-
-overlay.setOpacity(opacity)
+
+
+overlay.setOpacity(opacity)

This is an overloaded function. Sets the opacity of all active overlay layers. Layers that have not been used yet will not have their opacity changed. Opacity ranges from 0 (invisible) to 100 (completely opaque).

-
-
Arguments:
-
    -
  • opacity (number) – the opacity

  • + +++ + + + +
    Arguments:
      +
    • opacity (number) – the opacity
    - - +
-
-
-overlay.getHorizontalScale(layer = 0)
+
+
+overlay.getHorizontalScale(layer = 0)

Gets the horizontal scale of the specified overlay layer. 1.0 is normal size.

-
-
Arguments:
-
    -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + + + + + +
    Arguments:
      +
    • layer (number) – the layer id. Defaults to 0
    - -
    Returns:
    -

    the scale

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the scale

    +
    Return type:

    number

    +
-
-
-overlay.getVerticalScale(layer = 0)
+
+
+overlay.getVerticalScale(layer = 0)

Gets the vertical scale of the specified overlay layer. 1.0 is normal size.

-
-
Arguments:
-
    -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + + + + + +
    Arguments:
      +
    • layer (number) – the layer id. Defaults to 0
    - -
    Returns:
    -

    the scale

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the scale

    +
    Return type:

    number

    +
-
-
-overlay.setHorizontalScale(scale, layer)
+
+
+overlay.setHorizontalScale(scale, layer)

Sets the horizontal scale of the specified overlay layer. 1.0 is normal size.

-
-
Arguments:
-
    -
  • scale (number) – the scale to set

  • -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • scale (number) – the scale to set
    • +
    • layer (number) – the layer id
    - - +
-
-
-overlay.setHorizontalScale(scale)
+
+
+overlay.setHorizontalScale(scale)

This is an overloaded function. Sets the horizontal scale of all active overlay layers. Layers that have not been used yet will not have their scale changed. 1.0 is normal size.

-
-
Arguments:
-
    -
  • scale (number) – the scale to set

  • + +++ + + + +
    Arguments:
      +
    • scale (number) – the scale to set
    - - +
-
-
-overlay.setVerticalScale(scale, layer)
+
+
+overlay.setVerticalScale(scale, layer)

Sets the vertical scale of the specified overlay layer. 1.0 is normal size.

-
-
Arguments:
-
    -
  • scale (number) – the scale to set

  • -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • scale (number) – the scale to set
    • +
    • layer (number) – the layer id
    - - +
-
-
-overlay.setVerticalScale(scale)
+
+
+overlay.setVerticalScale(scale)

This is an overloaded function. Sets the vertical scale of all active overlay layers. Layers that have not been used yet will not have their scale changed. 1.0 is normal size.

-
-
Arguments:
-
    -
  • scale (number) – the scale to set

  • + +++ + + + +
    Arguments:
      +
    • scale (number) – the scale to set
    - - +
-
-
-overlay.setScale(hScale, vScale, layer)
+
+
+overlay.setScale(hScale, vScale, layer)

Sets the horizontal and vertical scale of the specified overlay layer. 1.0 is normal size.

-
-
Arguments:
-
    -
  • hScale (number) – the horizontal scale to set

  • -
  • vScale (number) – the vertical scale to set

  • -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • hScale (number) – the horizontal scale to set
    • +
    • vScale (number) – the vertical scale to set
    • +
    • layer (number) – the layer id
    - - +
-
-
-overlay.setScale(hScale, vScale)
+
+
+overlay.setScale(hScale, vScale)

This is an overloaded function. Sets the horizontal and vertical scale of all active overlay layers. Layers that have not been used yet will not have their scale changed. 1.0 is normal size.

-
-
Arguments:
-
    -
  • hScale (number) – the horizontal scale to set

  • -
  • vScale (number) – the vertical scale to set

  • + +++ + + + +
    Arguments:
      +
    • hScale (number) – the horizontal scale to set
    • +
    • vScale (number) – the vertical scale to set
    - - +
-
-
-overlay.getRotation(layer = 0)
+
+
+overlay.getRotation(layer = 0)

Gets the angle the specified overlay layer is rotated to.

-
-
Arguments:
-
    -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + + + + + +
    Arguments:
      +
    • layer (number) – the layer id. Defaults to 0
    - -
    Returns:
    -

    the angle the layer is rotated to

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the angle the layer is rotated to

    +
    Return type:

    number

    +
-
-
-overlay.setRotation(angle, layer)
+
+
+overlay.setRotation(angle, layer)

Sets the angle the specified overlay layer is rotated to.

-
-
Arguments:
-
    -
  • angle (number) – the angle to set

  • -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • angle (number) – the angle to set
    • +
    • layer (number) – the layer id
    - - +
-
-
-overlay.setRotation(angle)
+
+
+overlay.setRotation(angle)

This is an overloaded function. Sets the angle that all active overlay layers are rotated to. Layers that have not been used yet will not have their angle changed.

-
-
Arguments:
-
    -
  • angle (number) – the angle to set

  • + +++ + + + +
    Arguments:
      +
    • angle (number) – the angle to set
    - - +
-
-
-overlay.rotate(degrees, layer)
+
+
+overlay.rotate(degrees, layer)

Rotates the specified overlay layer. A positive number of degrees is clockwise rotation, a negative number of degrees is counterclockwise rotation.

-
-
Arguments:
-
    -
  • degrees (number) – the number of degrees to rotate

  • -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • degrees (number) – the number of degrees to rotate
    • +
    • layer (number) – the layer id
    - - +
-
-
-overlay.rotate(degrees)
+
+
+overlay.rotate(degrees)

This is an overloaded function. Rotates the all active overlay layers. Layers that have not been used yet will not be rotated. A positive number of degrees is clockwise rotation, a negative number of degrees is counterclockwise rotation.

-
-
Arguments:
-
    -
  • degrees (number) – the number of degrees to rotate

  • + +++ + + + +
    Arguments:
      +
    • degrees (number) – the number of degrees to rotate
    - - +
-
-
-overlay.getX(layer = 0)
+
+
+overlay.getX(layer = 0)

Gets the x position of the specified overlay layer.

-
-
Arguments:
-
    -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + + + + + +
    Arguments:
      +
    • layer (number) – the layer id. Defaults to 0
    - -
    Returns:
    -

    the pixel x coordinate

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the pixel x coordinate

    +
    Return type:

    number

    +
-
-
-overlay.getY(layer = 0)
+
+
+overlay.getY(layer = 0)

Gets the y position of the specified overlay layer.

-
-
Arguments:
-
    -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + + + + + +
    Arguments:
      +
    • layer (number) – the layer id. Defaults to 0
    - -
    Returns:
    -

    the pixel y coordinate

    -
    -
    Return type:
    -

    number

    -
    - +
    Returns:

    the pixel y coordinate

    +
    Return type:

    number

    +
-
-
-overlay.setX(x, layer)
+
+
+overlay.setX(x, layer)

Sets the x position of the specified overlay layer.

-
-
Arguments:
-
    -
  • x (number) – the pixel x coordinate

  • -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • x (number) – the pixel x coordinate
    • +
    • layer (number) – the layer id
    - - +
-
-
-overlay.setX(x)
+
+
+overlay.setX(x)

This is an overloaded function. Sets the x position of all active overlay layers. Layers that have not been used yet will not have their position changed.

-
-
Arguments:
-
    -
  • x (number) – the pixel x coordinate

  • + +++ + + + +
    Arguments:
      +
    • x (number) – the pixel x coordinate
    - - +
-
-
-overlay.setY(y, layer)
+
+
+overlay.setY(y, layer)

Sets the y position of the specified overlay layer.

-
-
Arguments:
-
    -
  • y (number) – the pixel y coordinate

  • -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • y (number) – the pixel y coordinate
    • +
    • layer (number) – the layer id
    - - +
-
-
-overlay.setY(y)
+
+
+overlay.setY(y)

This is an overloaded function. Sets the y position of all active overlay layers. Layers that have not been used yet will not have their position changed.

-
-
Arguments:
-
    -
  • y (number) – the pixel y coordinate

  • + +++ + + + +
    Arguments:
      +
    • y (number) – the pixel y coordinate
    - - +
-
-
-overlay.setClippingRect(x, y, width, height, layer)
+
+
+overlay.setClippingRect(x, y, width, height, layer)

Sets the rectangular clipping region for the specifieid overlay layer. A clipping region will cause the overlay’s rendering to be contained inside it. In other words, any content from the overlay layer will not be visible outside of the specified rectangle.

-
-
Arguments:
-
    -
  • x (number) – the rectangle’s pixel x coordinate, 0 is the left edge of the current map. A negative value is where the left map border’s region is

  • -
  • y (number) – the rectangle’s pixel y coordinate, 0 is the top edge of the current map. A negative value is where the top map border’s region is

  • -
  • width (number) – the rectangle’s pixel width

  • -
  • height (number) – the rectangle’s pixel height

  • -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • x (number) – the rectangle’s pixel x coordinate, 0 is the left edge of the current map. A negative value is where the left map border’s region is
    • +
    • y (number) – the rectangle’s pixel y coordinate, 0 is the top edge of the current map. A negative value is where the top map border’s region is
    • +
    • width (number) – the rectangle’s pixel width
    • +
    • height (number) – the rectangle’s pixel height
    • +
    • layer (number) – the layer id
    - - +
-
-
-overlay.setClippingRect(x, y, width, height)
+
+
+overlay.setClippingRect(x, y, width, height)

This is an overloaded function. Sets the rectangular clipping region for all overlay layers. A clipping region will cause the overlay’s rendering to be contained inside it. In other words, any content from the overlay layer will not be visible outside of the specified rectangle.

-
-
Arguments:
-
    -
  • x (number) – the rectangle’s pixel x coordinate, 0 is the left edge of the current map. A negative value is where the left map border’s region is

  • -
  • y (number) – the rectangle’s pixel y coordinate, 0 is the top edge of the current map. A negative value is where the top map border’s region is

  • -
  • width (number) – the rectangle’s pixel width

  • -
  • height (number) – the rectangle’s pixel height

  • + +++ + + + +
    Arguments:
      +
    • x (number) – the rectangle’s pixel x coordinate, 0 is the left edge of the current map. A negative value is where the left map border’s region is
    • +
    • y (number) – the rectangle’s pixel y coordinate, 0 is the top edge of the current map. A negative value is where the top map border’s region is
    • +
    • width (number) – the rectangle’s pixel width
    • +
    • height (number) – the rectangle’s pixel height
    - - +
-
-
-overlay.clearClippingRect(layer)
+
+
+overlay.clearClippingRect(layer)

Clears any clipping for the specified overlay layer. See setClippingRect for more info about clipping.

-
-
Arguments:
-
    -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • layer (number) – the layer id
    - - +
-
-
-overlay.clearClippingRect()
+
+
+overlay.clearClippingRect()

Clears any clipping for all overlay layers. See setClippingRect for more info about clipping.

-
-
-overlay.getPosition(layer = 0)
+
+
+overlay.getPosition(layer = 0)

Gets the position of the specified overlay layer.

-
-
Arguments:
-
    -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + + + + + +
    Arguments:
      +
    • layer (number) – the layer id. Defaults to 0
    - -
    Returns:
    -

    the layer’s pixel coordinates

    -
    -
    Return type:
    -

    object ({x, y})

    -
    - +
    Returns:

    the layer’s pixel coordinates

    +
    Return type:

    object ({x, y})

    +
-
-
-overlay.setPosition(x, y, layer)
+
+
+overlay.setPosition(x, y, layer)

Sets the position of the specified overlay layer.

-
-
Arguments:
-
    -
  • x (number) – the pixel x coordinate

  • -
  • y (number) – the pixel y coordinate

  • -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • x (number) – the pixel x coordinate
    • +
    • y (number) – the pixel y coordinate
    • +
    • layer (number) – the layer id
    - - +
-
-
-overlay.setPosition(x, y)
+
+
+overlay.setPosition(x, y)

This is an overloaded function. Sets the position of all active overlay layers. Layers that have not been used yet will not have their position changed.

-
-
Arguments:
-
    -
  • x (number) – the pixel x coordinate

  • -
  • y (number) – the pixel y coordinate

  • + +++ + + + +
    Arguments:
      +
    • x (number) – the pixel x coordinate
    • +
    • y (number) – the pixel y coordinate
    - - +
-
-
-overlay.move(deltaX, deltaY, layer)
+
+
+overlay.move(deltaX, deltaY, layer)

Moves the specified overlay layer.

-
-
Arguments:
-
    -
  • deltaX (number) – the number of pixels to move horizontally

  • -
  • deltaY (number) – the number of pixels to move vertically

  • -
  • layer (number) – the layer id

  • + +++ + + + +
    Arguments:
      +
    • deltaX (number) – the number of pixels to move horizontally
    • +
    • deltaY (number) – the number of pixels to move vertically
    • +
    • layer (number) – the layer id
    - - +
-
-
-overlay.move(deltaX, deltaY)
+
+
+overlay.move(deltaX, deltaY)

This is an overloaded function. Moves all active overlay layers. Layers that have not been used yet will not have their position changed.

-
-
Arguments:
-
    -
  • deltaX (number) – the number of pixels to move horizontally

  • -
  • deltaY (number) – the number of pixels to move vertically

  • + +++ + + + +
    Arguments:
      +
    • deltaX (number) – the number of pixels to move horizontally
    • +
    • deltaY (number) – the number of pixels to move vertically
    - - +
-
-
-overlay.addText(text, x, y, color = "#000000", size = 12, layer = 0)
+
+
+overlay.addText(text, x, y, color = "#000000", size = 12, layer = 0)

Adds a text item to the specified overlay layer. Text can be additionally formatted with a limited set of HTML tags. Note that only text can be displayed, so text decoration like underlines or table borders will not appear.

-
-
Arguments:
-
    -
  • text (string) – the text to display

  • -
  • x (number) – the x pixel coordinate of the text (relative to the layer’s position)

  • -
  • y (number) – the y pixel coordinate of the text (relative to the layer’s position)

  • -
  • color (string) – the color of the text. Can be specified as "#RRGGBB" or "#AARRGGBB". Defaults to black.

  • -
  • size (number) – the font size of the text. Defaults to 12.

  • -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + +
    Arguments:
      +
    • text (string) – the text to display
    • +
    • x (number) – the x pixel coordinate of the text (relative to the layer’s position)
    • +
    • y (number) – the y pixel coordinate of the text (relative to the layer’s position)
    • +
    • color (string) – the color of the text. Can be specified as "#RRGGBB" or "#AARRGGBB". Defaults to black.
    • +
    • size (number) – the font size of the text. Defaults to 12.
    • +
    • layer (number) – the layer id. Defaults to 0
    - - +
-
-
-overlay.addRect(x, y, width, height, borderColor = "#000000", fillColor = "", rounding = 0, layer = 0)
+
+
+overlay.addRect(x, y, width, height, borderColor = "#000000", fillColor = "", rounding = 0, layer = 0)

Adds a rectangle outline item to the specified overlay layer.

-
-
Arguments:
-
    -
  • x (number) – the x pixel coordinate of the rectangle’s top-left corner (relative to the layer’s position)

  • -
  • y (number) – the y pixel coordinate of the rectangle’s top-left corner (relative to the layer’s position)

  • -
  • width (number) – the pixel width of the rectangle

  • -
  • height (number) – the pixel height of the rectangle

  • -
  • borderColor (string) – the color of the rectangle’s border. Can be specified as "#RRGGBB" or "#AARRGGBB". Defaults to black.

  • -
  • fillColor (string) – the color of the area enclosed by the rectangle. Can be specified as "#RRGGBB" or "#AARRGGBB". Defaults to transparent.

  • -
  • rounding (number) – the percent degree the corners will be rounded. 0 is rectangular, 100 is elliptical. Defaults to 0

  • -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + +
    Arguments:
      +
    • x (number) – the x pixel coordinate of the rectangle’s top-left corner (relative to the layer’s position)
    • +
    • y (number) – the y pixel coordinate of the rectangle’s top-left corner (relative to the layer’s position)
    • +
    • width (number) – the pixel width of the rectangle
    • +
    • height (number) – the pixel height of the rectangle
    • +
    • borderColor (string) – the color of the rectangle’s border. Can be specified as "#RRGGBB" or "#AARRGGBB". Defaults to black.
    • +
    • fillColor (string) – the color of the area enclosed by the rectangle. Can be specified as "#RRGGBB" or "#AARRGGBB". Defaults to transparent.
    • +
    • rounding (number) – the percent degree the corners will be rounded. 0 is rectangular, 100 is elliptical. Defaults to 0
    • +
    • layer (number) – the layer id. Defaults to 0
    - - +
-
-
-overlay.addPath(coords, borderColor = "#000000", fillColor = "", layer = 0)
+
+
+overlay.addPath(coords, borderColor = "#000000", fillColor = "", layer = 0)

Draws a straight path on the specified layer by connecting the coordinate pairs in coords. The area enclosed by the path can be colored in, and will follow the “odd-even” fill rule.

-
-
Arguments:
-
    -
  • coords (array) – array of pixel coordinates to connect to create the path. Each element of the array should be an array containing an x and y pixel coordinate

  • -
  • borderColor (string) – the color of the path. Can be specified as "#RRGGBB" or "#AARRGGBB". Defaults to black.

  • -
  • fillColor (string) – the color of the area enclosed by the path. Can be specified as "#RRGGBB" or "#AARRGGBB". Defaults to transparent.

  • -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + +
    Arguments:
      +
    • coords (array) – array of pixel coordinates to connect to create the path. Each element of the array should be an array containing an x and y pixel coordinate
    • +
    • borderColor (string) – the color of the path. Can be specified as "#RRGGBB" or "#AARRGGBB". Defaults to black.
    • +
    • fillColor (string) – the color of the area enclosed by the path. Can be specified as "#RRGGBB" or "#AARRGGBB". Defaults to transparent.
    • +
    • layer (number) – the layer id. Defaults to 0
    - - +
-
-
-overlay.addPath(xCoords, yCoords, borderColor = "#000000", fillColor = "", layer = 0)
+
+
+overlay.addPath(xCoords, yCoords, borderColor = "#000000", fillColor = "", layer = 0)

This is an overloaded function. Draws a straight path on the specified layer by connecting the coordinates at (xCoords, yCoords). The area enclosed by the path can be colored in, and will follow the “odd-even” fill rule.

-
-
Arguments:
-
    -
  • xCoords (array) – array of x pixel coordinates to connect to create the path

  • -
  • yCoords (array) – array of y pixel coordinates to connect to create the path

  • -
  • borderColor (string) – the color of the path. Can be specified as "#RRGGBB" or "#AARRGGBB". Defaults to black.

  • -
  • fillColor (string) – the color of the area enclosed by the path. Can be specified as "#RRGGBB" or "#AARRGGBB". Defaults to transparent.

  • -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + +
    Arguments:
      +
    • xCoords (array) – array of x pixel coordinates to connect to create the path
    • +
    • yCoords (array) – array of y pixel coordinates to connect to create the path
    • +
    • borderColor (string) – the color of the path. Can be specified as "#RRGGBB" or "#AARRGGBB". Defaults to black.
    • +
    • fillColor (string) – the color of the area enclosed by the path. Can be specified as "#RRGGBB" or "#AARRGGBB". Defaults to transparent.
    • +
    • layer (number) – the layer id. Defaults to 0
    - - +
-
-
-overlay.addImage(x, y, filepath, layer = 0, useCache = true)
+
+
+overlay.addImage(x, y, filepath, layer = 0, useCache = true)

Adds an image item to the specified overlay layer.

-
-
Arguments:
-
    -
  • x (number) – the x pixel coordinate of the image’s top-left corner (relative to the layer’s position)

  • -
  • y (number) – the y pixel coordinate of the image’s top-left corner (relative to the layer’s position)

  • -
  • filepath (string) – the image’s filepath

  • -
  • layer (number) – the layer id. Defaults to 0

  • -
  • useCache (boolean) – whether the image should be saved/loaded using the cache. Defaults to true. Reading images from a file is slow. Setting useCache to true will save the image to memory so that the next time the filepath is encountered the image can be loaded from memory rather than the file.

  • + +++ + + + +
    Arguments:
      +
    • x (number) – the x pixel coordinate of the image’s top-left corner (relative to the layer’s position)
    • +
    • y (number) – the y pixel coordinate of the image’s top-left corner (relative to the layer’s position)
    • +
    • filepath (string) – the image’s filepath
    • +
    • layer (number) – the layer id. Defaults to 0
    • +
    • useCache (boolean) – whether the image should be saved/loaded using the cache. Defaults to true. Reading images from a file is slow. Setting useCache to true will save the image to memory so that the next time the filepath is encountered the image can be loaded from memory rather than the file.
    - - +
-
-
-overlay.createImage(x, y, filepath, width = -1, height = -1, xOffset = 0, yOffset = 0, hScale = 1, vScale = 1, paletteId = -1, setTransparency = false, layer = 0, useCache = true)
+
+
+overlay.createImage(x, y, filepath, width = -1, height = -1, xOffset = 0, yOffset = 0, hScale = 1, vScale = 1, paletteId = -1, setTransparency = false, layer = 0, useCache = true)

Creates an image item on the specified overlay layer. This differs from overlay.addImage by allowing the new image to be a transformation of the image file.

-
-
Arguments:
-
    -
  • x (number) – the x pixel coordinate of the image’s top-left corner (relative to the layer’s position)

  • -
  • y (number) – the y pixel coordinate of the image’s top-left corner (relative to the layer’s position)

  • -
  • filepath (string) – the image’s filepath

  • -
  • width (number) – the width in pixels of the area to read in the image. If -1, use the full width of the original image. Defaults to -1

  • -
  • height (number) – the height in pixels of the area to read in the image. If -1, use the full height of the original image. Defaults to -1

  • -
  • xOffset (number) – the x pixel coordinate on the original image where data should be read from. Defaults to 0

  • -
  • yOffset (number) – the y pixel coordinate on the original image where data should be read from. Defaults to 0

  • -
  • hScale (number) – the horizontal scale for the image. Negative values will be a horizontal flip of the original image. Defaults to 1

  • -
  • vScale (number) – the vertical scale for the image. Negative values will be a vertical flip of the original image. Defaults to 1

  • -
  • paletteId (number) – the id of which currently loaded tileset palette to use for the image. If -1, use the original image’s palette. Defaults to -1

  • -
  • setTransparency (boolean) – whether the color at index 0 should be overwritten with transparent pixels. Defaults to false

  • -
  • layer (number) – the layer id. Defaults to 0

  • -
  • useCache (boolean) – whether the image should be saved/loaded using the cache. Defaults to true. Reading images from a file is slow. Setting useCache to true will save the image to memory so that the next time the filepath is encountered the image can be loaded from memory rather than the file.

  • + +++ + + + +
    Arguments:
      +
    • x (number) – the x pixel coordinate of the image’s top-left corner (relative to the layer’s position)
    • +
    • y (number) – the y pixel coordinate of the image’s top-left corner (relative to the layer’s position)
    • +
    • filepath (string) – the image’s filepath
    • +
    • width (number) – the width in pixels of the area to read in the image. If -1, use the full width of the original image. Defaults to -1
    • +
    • height (number) – the height in pixels of the area to read in the image. If -1, use the full height of the original image. Defaults to -1
    • +
    • xOffset (number) – the x pixel coordinate on the original image where data should be read from. Defaults to 0
    • +
    • yOffset (number) – the y pixel coordinate on the original image where data should be read from. Defaults to 0
    • +
    • hScale (number) – the horizontal scale for the image. Negative values will be a horizontal flip of the original image. Defaults to 1
    • +
    • vScale (number) – the vertical scale for the image. Negative values will be a vertical flip of the original image. Defaults to 1
    • +
    • paletteId (number) – the id of which currently loaded tileset palette to use for the image. If -1, use the original image’s palette. Defaults to -1
    • +
    • setTransparency (boolean) – whether the color at index 0 should be overwritten with transparent pixels. Defaults to false
    • +
    • layer (number) – the layer id. Defaults to 0
    • +
    • useCache (boolean) – whether the image should be saved/loaded using the cache. Defaults to true. Reading images from a file is slow. Setting useCache to true will save the image to memory so that the next time the filepath is encountered the image can be loaded from memory rather than the file.
    - - +
-
-
-overlay.addTileImage(x, y, tileId, xflip, yflip, palette, setTransparency = false, layer = 0)
+
+
+overlay.addTileImage(x, y, tileId, xflip, yflip, palette, setTransparency = false, layer = 0)

Creates an image of a tile on the specified overlay layer.

-
-
Arguments:
-
    -
  • x (number) – the x pixel coordinate of the image’s top-left corner (relative to the layer’s position)

  • -
  • y (number) – the y pixel coordinate of the image’s top-left corner (relative to the layer’s position)

  • -
  • tileId (number) – tile value for the image

  • -
  • xflip (boolean) – whether the tile image is flipped horizontally

  • -
  • yflip (boolean) – whether the tile image is flipped vertically

  • -
  • palette (number) – palette number for the tile image

  • -
  • setTransparency (boolean) – whether the color at index 0 should be overwritten with transparent pixels. Defaults to false

  • -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + +
    Arguments:
      +
    • x (number) – the x pixel coordinate of the image’s top-left corner (relative to the layer’s position)
    • +
    • y (number) – the y pixel coordinate of the image’s top-left corner (relative to the layer’s position)
    • +
    • tileId (number) – tile value for the image
    • +
    • xflip (boolean) – whether the tile image is flipped horizontally
    • +
    • yflip (boolean) – whether the tile image is flipped vertically
    • +
    • palette (number) – palette number for the tile image
    • +
    • setTransparency (boolean) – whether the color at index 0 should be overwritten with transparent pixels. Defaults to false
    • +
    • layer (number) – the layer id. Defaults to 0
    - - +
-
-
-overlay.addTileImage(x, y, tile, setTransparency = false, layer = 0)
+
+
+overlay.addTileImage(x, y, tile, setTransparency = false, layer = 0)

Creates an image of a tile on the specified overlay layer. This is an overloaded function that takes a single tile as a JavaScript object instead of each of the tile’s properties individually.

-
-
Arguments:
-
    -
  • x (number) – the x pixel coordinate of the image’s top-left corner (relative to the layer’s position)

  • -
  • y (number) – the y pixel coordinate of the image’s top-left corner (relative to the layer’s position)

  • -
  • tile (object) – the tile to create an image of. tile is an object with the properties {tileId, xflip, yflip, palette}

  • -
  • setTransparency (boolean) – whether the color at index 0 should be overwritten with transparent pixels. Defaults to false

  • -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + +
    Arguments:
      +
    • x (number) – the x pixel coordinate of the image’s top-left corner (relative to the layer’s position)
    • +
    • y (number) – the y pixel coordinate of the image’s top-left corner (relative to the layer’s position)
    • +
    • tile (object) – the tile to create an image of. tile is an object with the properties {tileId, xflip, yflip, palette}
    • +
    • setTransparency (boolean) – whether the color at index 0 should be overwritten with transparent pixels. Defaults to false
    • +
    • layer (number) – the layer id. Defaults to 0
    - - +
-
-
-overlay.addMetatileImage(x, y, metatileId, setTransparency = false, layer = 0)
+
+
+overlay.addMetatileImage(x, y, metatileId, setTransparency = false, layer = 0)

Creates an image of a metatile on the specified overlay layer.

-
-
Arguments:
-
    -
  • x (number) – the x pixel coordinate of the image’s top-left corner (relative to the layer’s position)

  • -
  • y (number) – the y pixel coordinate of the image’s top-left corner (relative to the layer’s position)

  • -
  • metatileId (number) – id of the metatile to create an image of

  • -
  • setTransparency (boolean) – whether the color at index 0 should be overwritten with transparent pixels. Defaults to false

  • -
  • layer (number) – the layer id. Defaults to 0

  • + +++ + + + +
    Arguments:
      +
    • x (number) – the x pixel coordinate of the image’s top-left corner (relative to the layer’s position)
    • +
    • y (number) – the y pixel coordinate of the image’s top-left corner (relative to the layer’s position)
    • +
    • metatileId (number) – id of the metatile to create an image of
    • +
    • setTransparency (boolean) – whether the color at index 0 should be overwritten with transparent pixels. Defaults to false
    • +
    • layer (number) – the layer id. Defaults to 0
    - - +
- -
-

Settings Functions

+
+
+

Settings Functions

The following functions are related to settings.

All settings functions are callable via the global utility object.

-
-
-utility.getGridVisibility()
+
+
+utility.getGridVisibility()

Gets the visibility of the map grid overlay.

-
-
Returns:
-

grid visibility

-
-
Return type:
-

boolean

-
-
+ +++ + + + + + +
Returns:grid visibility
Return type:boolean
-
-
-utility.setGridVisibility(visible)
+
+
+utility.setGridVisibility(visible)

Sets the visibility of the map grid overlay.

-
-
Arguments:
-
    -
  • visible (boolean) – grid visibility

  • + +++ + + + +
    Arguments:
      +
    • visible (boolean) – grid visibility
    - - +
-
-
-utility.getBorderVisibility()
+
+
+utility.getBorderVisibility()

Gets the visibility of the map’s border.

-
-
Returns:
-

border visibility

-
-
Return type:
-

boolean

-
-
+ +++ + + + + + +
Returns:border visibility
Return type:boolean
-
-
-utility.setBorderVisibility(visible)
+
+
+utility.setBorderVisibility(visible)

Sets the visibility of the map’s border.

-
-
Arguments:
-
    -
  • visible (boolean) – border visibility

  • + +++ + + + +
    Arguments:
      +
    • visible (boolean) – border visibility
    - - +
-
-
-utility.getSmartPathsEnabled()
+
+
+utility.getSmartPathsEnabled()

Gets the toggle state of smart paths.

-
-
Returns:
-

smart paths enabled

-
-
Return type:
-

boolean

-
-
+ +++ + + + + + +
Returns:smart paths enabled
Return type:boolean
-
-
-utility.setSmartPathsEnabled(enabled)
+
+
+utility.setSmartPathsEnabled(enabled)

Sets the toggle state of smart paths.

-
-
Arguments:
-
    -
  • enabled (boolean) – smart paths enabled

  • + +++ + + + +
    Arguments:
      +
    • enabled (boolean) – smart paths enabled
    - - +
-
-
-utility.getCustomScripts()
+
+
+utility.getCustomScripts()

Gets the list of paths to custom scripts.

-
-
Returns:
-

string array of custom scripts paths

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:string array of custom scripts paths
Return type:array
-
-
-utility.getMainTab()
+
+
+utility.getMainTab()

Gets the index of the currently selected main tab. Tabs are indexed from left to right, starting at 0 (0: Map, 1: Events, 2: Header, 3: Connections, 4: Wild Pokemon).

-
-
Returns:
-

current main tab index

-
-
Return type:
-

number

-
-
+ +++ + + + + + +
Returns:current main tab index
Return type:number
-
-
-utility.setMainTab(tab)
+
+
+utility.setMainTab(tab)

Sets the currently selected main tab. Tabs are indexed from left to right, starting at 0 (0: Map, 1: Events, 2: Header, 3: Connections, 4: Wild Pokemon).

-
-
Arguments:
-
    -
  • tab (number) – index of the tab to select

  • + +++ + + + +
    Arguments:
      +
    • tab (number) – index of the tab to select
    - - +
-
-
-utility.getMapViewTab()
+
+
+utility.getMapViewTab()

Gets the index of the currently selected map view tab. Tabs are indexed from left to right, starting at 0 (0: Metatiles, 1: Collision, 2: Prefabs).

-
-
Returns:
-

current map view tab index

-
-
Return type:
-

number

-
-
+ +++ + + + + + +
Returns:current map view tab index
Return type:number
-
-
-utility.setMapViewTab(tab)
+
+
+utility.setMapViewTab(tab)

Sets the currently selected map view tab. Tabs are indexed from left to right, starting at 0 (0: Metatiles, 1: Collision, 2: Prefabs).

-
-
Arguments:
-
    -
  • tab (number) – index of the tab to select

  • + +++ + + + +
    Arguments:
      +
    • tab (number) – index of the tab to select
    - - +
-
-
-utility.getMetatileLayerOrder()
+
+
+utility.getMetatileLayerOrder()

Gets the order that metatile layers are rendered.

-
-
Returns:
-

array of layers. The bottom layer is represented as 0.

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:array of layers. The bottom layer is represented as 0.
Return type:array
-
-
-utility.setMetatileLayerOrder(order)
+
+
+utility.setMetatileLayerOrder(order)

Sets the order that metatile layers are rendered.

-
-
Arguments:
-
    -
  • order (array) – array of layers. The bottom layer is represented as 0.

  • + +++ + + + +
    Arguments:
      +
    • order (array) – array of layers. The bottom layer is represented as 0.
    - - +
-
-
-utility.getMetatileLayerOpacity()
+
+
+utility.getMetatileLayerOpacity()

Gets the opacities that metatile layers are rendered with.

-
-
Returns:
-

array of opacities for each layer. The bottom layer is the first element.

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:array of opacities for each layer. The bottom layer is the first element.
Return type:array
-
-
-utility.setMetatileLayerOpacity(opacities)
+
+
+utility.setMetatileLayerOpacity(opacities)

Sets the opacities that metatile layers are rendered with.

-
-
Arguments:
-
    -
  • opacities (array) – array of opacities for each layer. The bottom layer is the first element.

  • + +++ + + + +
    Arguments:
      +
    • opacities (array) – array of opacities for each layer. The bottom layer is the first element.
    - - +
- -
-

Utility Functions

+
+
+

Utility Functions

These are some miscellaneous functions that can be very useful when building custom scripts.

All utility functions are callable via the global utility object.

-
-
-utility.registerAction(functionName, actionName, shortcut = "")
+
+
+utility.registerAction(functionName, actionName, shortcut = "")

Registers a JavaScript function to an action that can be manually triggered in Porymap’s Tools menu. Optionally, a keyboard shortcut (e.g. "Ctrl+P") can also be specified, assuming it doesn’t collide with any existing shortcuts used by Porymap. The function specified by functionName must have the export keyword.

-
-
Arguments:
-
    -
  • functionName (string) – name of the JavaScript function

  • -
  • actionName (string) – name of the action that will be displayed in the Tools menu

  • -
  • shortcut (string) – optional keyboard shortcut

  • + +++ + + + +
    Arguments:
      +
    • functionName (string) – name of the JavaScript function
    • +
    • actionName (string) – name of the action that will be displayed in the Tools menu
    • +
    • shortcut (string) – optional keyboard shortcut
    - - +
-
-
-utility.registerToggleAction(functionName, actionName, shortcut = "", checked = false)
+
+
+utility.registerToggleAction(functionName, actionName, shortcut = "", checked = false)

Registers a JavaScript function to an action that can be manually triggered in Porymap’s Tools menu. Optionally, a keyboard shortcut (e.g. "Ctrl+P") can also be specified, assuming it doesn’t collide with any existing shortcuts used by Porymap. A check mark will be toggled next to the action name each time its activated. Whether the check mark is initially present can be set with checked. The function specified by functionName must have the export keyword.

-
-
Arguments:
-
    -
  • functionName (string) – name of the JavaScript function

  • -
  • actionName (string) – name of the action that will be displayed in the Tools menu

  • -
  • shortcut (string) – optional keyboard shortcut

  • -
  • checked (boolean) – whether the action initially has a check mark. Defaults to false.

  • + +++ + + + +
    Arguments:
      +
    • functionName (string) – name of the JavaScript function
    • +
    • actionName (string) – name of the action that will be displayed in the Tools menu
    • +
    • shortcut (string) – optional keyboard shortcut
    • +
    • checked (boolean) – whether the action initially has a check mark. Defaults to false.
    - - +
-
-
-utility.setTimeout(func, delayMs)
+
+
+utility.setTimeout(func, delayMs)

This behaves essentially the same as JavaScript’s setTimeout() that is used in web browsers or NodeJS. The func argument is a JavaScript function (NOT the name of a function) which will be executed after a delay. This is useful for creating animations or refreshing the overlay at constant intervals.

-
-
Arguments:
-
    -
  • func (function) – a JavaScript function that will be executed later

  • -
  • delayMs (number) – the number of milliseconds to wait before executing func

  • + +++ + + + +
    Arguments:
      +
    • func (function) – a JavaScript function that will be executed later
    • +
    • delayMs (number) – the number of milliseconds to wait before executing func
    - - +
-
-
-utility.log(message)
+
+
+utility.log(message)

Logs a message to the Porymap log file with the prefix [INFO]. This is useful for debugging custom scripts.

-
-
Arguments:
-
    -
  • message (string) – the message to log

  • + +++ + + + +
    Arguments:
      +
    • message (string) – the message to log
    - - +
-
-
-utility.warn(message)
+
+
+utility.warn(message)

Logs a message to the Porymap log file with the prefix [WARN].

-
-
Arguments:
-
    -
  • message (string) – the message to log

  • + +++ + + + +
    Arguments:
      +
    • message (string) – the message to log
    - - +
-
-
-utility.error(message)
+
+
+utility.error(message)

Logs a message to the Porymap log file with the prefix [ERROR].

-
-
Arguments:
-
    -
  • message (string) – the message to log

  • + +++ + + + +
    Arguments:
      +
    • message (string) – the message to log
    - - +
-
-
-utility.showMessage(text, informativeText, detailedText)
+
+
+utility.showMessage(text, informativeText, detailedText)

Displays a message box with an “Information” icon and an OK button. Execution stops while the window is open.

-
-
Arguments:
-
    -
  • text (string) – the main message text

  • -
  • informativeText (string) – smaller text below the main message. Defaults to ""

  • -
  • detailedText (string) – text hidden behind a “Show Details” box. Defaults to ""

  • + +++ + + + +
    Arguments:
      +
    • text (string) – the main message text
    • +
    • informativeText (string) – smaller text below the main message. Defaults to ""
    • +
    • detailedText (string) – text hidden behind a “Show Details” box. Defaults to ""
    - - +
-
-
-utility.showWarning(text, informativeText, detailedText)
+
+
+utility.showWarning(text, informativeText, detailedText)

Displays a message box with a “Warning” icon and an OK button. Execution stops while the window is open.

-
-
Arguments:
-
    -
  • text (string) – the main message text

  • -
  • informativeText (string) – smaller text below the main message. Defaults to ""

  • -
  • detailedText (string) – text hidden behind a “Show Details” box. Defaults to ""

  • + +++ + + + +
    Arguments:
      +
    • text (string) – the main message text
    • +
    • informativeText (string) – smaller text below the main message. Defaults to ""
    • +
    • detailedText (string) – text hidden behind a “Show Details” box. Defaults to ""
    - - +
-
-
-utility.showError(text, informativeText, detailedText)
+
+
+utility.showError(text, informativeText, detailedText)

Displays a message box with a “Critical” icon and an OK button. Execution stops while the window is open.

-
-
Arguments:
-
    -
  • text (string) – the main message text

  • -
  • informativeText (string) – smaller text below the main message. Defaults to ""

  • -
  • detailedText (string) – text hidden behind a “Show Details” box. Defaults to ""

  • + +++ + + + +
    Arguments:
      +
    • text (string) – the main message text
    • +
    • informativeText (string) – smaller text below the main message. Defaults to ""
    • +
    • detailedText (string) – text hidden behind a “Show Details” box. Defaults to ""
    - - +
-
-
-utility.showQuestion(text, informativeText, detailedText)
+
+
+utility.showQuestion(text, informativeText, detailedText)

Displays a message box with a “Question” icon and a Yes and a No button. Execution stops while the window is open.

-
-
Arguments:
-
    -
  • text (string) – the main message text

  • -
  • informativeText (string) – smaller text below the main message. Defaults to ""

  • -
  • detailedText (string) – text hidden behind a “Show Details” box. Defaults to ""

  • + +++ + + + + + + + +
    Arguments:
      +
    • text (string) – the main message text
    • +
    • informativeText (string) – smaller text below the main message. Defaults to ""
    • +
    • detailedText (string) – text hidden behind a “Show Details” box. Defaults to ""
    - -
    Returns:
    -

    true if Yes was selected, false if No was selected or if the window was closed without selection

    -
    -
    Return type:
    -

    boolean

    -
    - +
    Returns:

    true if Yes was selected, false if No was selected or if the window was closed without selection

    +
    Return type:

    boolean

    +
-
-
-utility.getInputText(title, label, default)
+
+
+utility.getInputText(title, label, default)

Displays a text input dialog with an OK and a Cancel button. Execution stops while the window is open.

-
-
Arguments:
-
    -
  • title (string) – the text in the window title bar

  • -
  • label (string) – the text adjacent to the input entry area

  • -
  • default (string) – the text in the input entry area when the window is opened. Defaults to ""

  • + +++ + + + + + + + +
    Arguments:
      +
    • title (string) – the text in the window title bar
    • +
    • label (string) – the text adjacent to the input entry area
    • +
    • default (string) – the text in the input entry area when the window is opened. Defaults to ""
    - -
    Returns:
    -

    input will be the input text and ok will be true if OK was selected. input will be "" and ok will be false if Cancel was selected or if the window was closed without selection.

    -
    -
    Return type:
    -

    object ({input, ok})

    -
    - +
    Returns:

    input will be the input text and ok will be true if OK was selected. input will be "" and ok will be false if Cancel was selected or if the window was closed without selection.

    +
    Return type:

    object ({input, ok})

    +
-
-
-utility.getInputNumber(title, label, default, min, max, decimals, step)
+
+
+utility.getInputNumber(title, label, default, min, max, decimals, step)

Displays a number input dialog with an OK and a Cancel button. Execution stops while the window is open.

-
-
Arguments:
-
    -
  • title (string) – the text in the window title bar

  • -
  • label (string) – the text adjacent to the input entry area

  • -
  • default (number) – the number in the input entry area when the window is opened. Defaults to 0

  • -
  • min (number) – the minimum allowable input value. Defaults to -2147483648

  • -
  • max (number) – the maximum allowable input value. Defaults to 2147483647

  • -
  • decimals (number) – the number of decimals used for the input number. Defaults to 0

  • -
  • step (number) – the increment by which the input number will change when the spinner is used. Defaults to 1

  • + +++ + + + + + + + +
    Arguments:
      +
    • title (string) – the text in the window title bar
    • +
    • label (string) – the text adjacent to the input entry area
    • +
    • default (number) – the number in the input entry area when the window is opened. Defaults to 0
    • +
    • min (number) – the minimum allowable input value. Defaults to -2147483648
    • +
    • max (number) – the maximum allowable input value. Defaults to 2147483647
    • +
    • decimals (number) – the number of decimals used for the input number. Defaults to 0
    • +
    • step (number) – the increment by which the input number will change when the spinner is used. Defaults to 1
    - -
    Returns:
    -

    input will be the input number and ok will be true if OK was selected. input will be default and ok will be false if Cancel was selected or if the window was closed without selection.

    -
    -
    Return type:
    -

    object ({input, ok})

    -
    - +
    Returns:

    input will be the input number and ok will be true if OK was selected. input will be default and ok will be false if Cancel was selected or if the window was closed without selection.

    +
    Return type:

    object ({input, ok})

    +
-
-
-utility.getInputItem(title, label, items, default, editable)
+
+
+utility.getInputItem(title, label, items, default, editable)

Displays a text input dialog with an items dropdown and an OK and a Cancel button. Execution stops while the window is open.

-
-
Arguments:
-
    -
  • title (string) – the text in the window title bar

  • -
  • label (string) – the text adjacent to the input entry area

  • -
  • items (array) – an array of text items that will populate the dropdown

  • -
  • default (number) – the index of the item to select by default. Defaults to 0

  • -
  • editable (boolean) – whether the user is allowed to enter their own text instead. Defaults to false

  • + +++ + + + + + + + +
    Arguments:
      +
    • title (string) – the text in the window title bar
    • +
    • label (string) – the text adjacent to the input entry area
    • +
    • items (array) – an array of text items that will populate the dropdown
    • +
    • default (number) – the index of the item to select by default. Defaults to 0
    • +
    • editable (boolean) – whether the user is allowed to enter their own text instead. Defaults to false
    - -
    Returns:
    -

    input will be the input text and ok will be true if OK was selected. input will be the text of the item at default and ok will be false if Cancel was selected or if the window was closed without selection.

    -
    -
    Return type:
    -

    object ({input, ok})

    -
    - +
    Returns:

    input will be the input text and ok will be true if OK was selected. input will be the text of the item at default and ok will be false if Cancel was selected or if the window was closed without selection.

    +
    Return type:

    object ({input, ok})

    +
-
-
-utility.getMapNames()
+
+
+utility.getMapNames()

Gets the list of map names.

-
-
Returns:
-

the list of map names

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:the list of map names
Return type:array
-
-
-utility.getTilesetNames()
+
+
+utility.getTilesetNames()

Gets the list of tileset names.

-
-
Returns:
-

the list of tileset names

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:the list of tileset names
Return type:array
-
-
-utility.getPrimaryTilesetNames()
+
+
+utility.getPrimaryTilesetNames()

Gets the list of primary tileset names.

-
-
Returns:
-

the list of primary tileset names

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:the list of primary tileset names
Return type:array
-
-
-utility.getSecondaryTilesetNames()
+
+
+utility.getSecondaryTilesetNames()

Gets the list of secondary tileset names.

-
-
Returns:
-

the list of secondary tileset names

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:the list of secondary tileset names
Return type:array
-
-
-utility.getMetatileBehaviorNames()
+
+
+utility.getMetatileBehaviorNames()

Gets the list of metatile behavior names.

-
-
Returns:
-

the list of metatile behavior names

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:the list of metatile behavior names
Return type:array
-
-
-utility.getSongNames()
+
+
+utility.getSongNames()

Gets the list of song names.

-
-
Returns:
-

the list of song names

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:the list of song names
Return type:array
-
-
-utility.getLocationNames()
+
+
+utility.getLocationNames()

Gets the list of map location names.

-
-
Returns:
-

the list of map location names

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:the list of map location names
Return type:array
-
-
-utility.getWeatherNames()
+
+
+utility.getWeatherNames()

Gets the list of weather names.

-
-
Returns:
-

the list of weather names

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:the list of weather names
Return type:array
-
-
-utility.getMapTypeNames()
+
+
+utility.getMapTypeNames()

Gets the list of map type names.

-
-
Returns:
-

the list of map type names

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:the list of map type names
Return type:array
-
-
-utility.getBattleSceneNames()
+
+
+utility.getBattleSceneNames()

Gets the list of battle scene names.

-
-
Returns:
-

the list of battle scene names

-
-
Return type:
-

array

-
-
+ +++ + + + + + +
Returns:the list of battle scene names
Return type:array
-
-
-utility.isPrimaryTileset(tilesetName)
+
+
+utility.isPrimaryTileset(tilesetName)

Gets whether the specified tileset is a primary tileset.

-
-
Arguments:
-
    -
  • tilesetName (string) – the tileset name

  • + +++ + + + + + + + +
    Arguments:
      +
    • tilesetName (string) – the tileset name
    - -
    Returns:
    -

    is a primary tileset

    -
    -
    Return type:
    -

    boolean

    -
    - +
    Returns:

    is a primary tileset

    +
    Return type:

    boolean

    +
-
-
-utility.isSecondaryTileset(tilesetName)
+
+
+utility.isSecondaryTileset(tilesetName)

Gets whether the specified tileset is a secondary tileset.

-
-
Arguments:
-
    -
  • tilesetName (string) – the tileset name

  • + +++ + + + + + + + +
    Arguments:
      +
    • tilesetName (string) – the tileset name
    - -
    Returns:
    -

    is a secondary tileset

    -
    -
    Return type:
    -

    boolean

    -
    - +
    Returns:

    is a secondary tileset

    +
    Return type:

    boolean

    +
- - -
-

Constants

+
+
+
+

Constants

Some constant values are provided for convenience. These are read-only properties guaranteed not to change unless a new project is opened or the current one is reloaded.

All constants are accessible via the global constants object.

-
-
-constants.max_primary_tiles
+
+
+constants.max_primary_tiles

The maximum number of tiles in a primary tileset.

-
-
-constants.max_secondary_tiles
+
+
+constants.max_secondary_tiles

The maximum number of tiles in a secondary tileset.

-
-
-constants.max_primary_metatiles
+
+
+constants.max_primary_metatiles

The maximum number of metatiles in a primary tileset.

-
-
-constants.max_secondary_metatiles
+
+
+constants.max_secondary_metatiles

The maximum number of metatiles in a secondary tileset.

-
-
-constants.layers_per_metatile
+
+
+constants.layers_per_metatile

The number of tile layers used in each metatile. This will either be 2 or 3, depending on the config setting enable_triple_layer_metatiles.

-
-
-constants.tiles_per_metatile
+
+
+constants.tiles_per_metatile

The number of tiles in each metatile. This will either be 8 or 12, depending on the config setting enable_triple_layer_metatiles.

-
-
-constants.base_game_version
+
+
+constants.base_game_version

The string value of the config setting base_game_version. This will either be pokeruby, pokefirered, or pokeemerald.

-
-
-constants.version.major
+
+
+constants.version.major

Porymap’s major version number. For example, for Porymap version 5.1.0 this will be 5.

-
-
-constants.version.minor
+
+
+constants.version.minor

Porymap’s minor version number. For example, for Porymap version 5.1.0 this will be 1.

-
-
-constants.version.patch
+
+
+constants.version.patch

Porymap’s patch version number. For example, for Porymap version 5.1.0 this will be 0.

- - - +
+
+ + - + + + - + + + + + + \ No newline at end of file diff --git a/docs/manual/settings-and-options.html b/docs/manual/settings-and-options.html index 00d1f340..f64a9475 100644 --- a/docs/manual/settings-and-options.html +++ b/docs/manual/settings-and-options.html @@ -1,49 +1,89 @@ - - - - - - Porymap Settings — porymap documentation - - - - - + + + + + + - - - - - + + + Porymap Settings — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
+ + - + + + + + + \ No newline at end of file diff --git a/docs/manual/shortcuts.html b/docs/manual/shortcuts.html index d1b92617..e415f2e8 100644 --- a/docs/manual/shortcuts.html +++ b/docs/manual/shortcuts.html @@ -1,49 +1,89 @@ - - - - - - Shortcuts — porymap documentation - - - - - + + + + + + - - - - - + + + Shortcuts — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
+ - + + + - + + + + + + \ No newline at end of file diff --git a/docs/manual/tileset-editor.html b/docs/manual/tileset-editor.html index a184be4f..23d3cb11 100644 --- a/docs/manual/tileset-editor.html +++ b/docs/manual/tileset-editor.html @@ -1,49 +1,89 @@ - - - - - - The Tileset Editor — porymap documentation - - - - - + + + + + + - - - - - + + + The Tileset Editor — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
+
+

Encounter Type

-

pokefirered exclusive

-
+
pokefirered exclusive

Used to determine which category of wild encounter to attempt.

- -
-

Terrain Type

+
+
+

Terrain Type

-

pokefirered exclusive

-
+
pokefirered exclusive

Used to determine certain attributes of metatiles. Can be useful in certain scenarios. For example, to determine if the player is facing water or standing in grass.

- -
-

Metatile Label

+
+
+

Metatile Label

-

optional

-
+
optional

A name can be given to metatiles so that they may be referenced in source code. These are defined in include/constants/metatile_labels.h.

For example, the metatile pictured above can be referenced using the define @@ -404,58 +462,54 @@ all of which use the same labels. 0x220 which will be used by any secondary tileset that’s paired with SecretBase. Labels like this will appear gray in the text box, and can’t be edited from within Porymap; they must be edited manually in metatile_labels.h.

- - -
-

Tools Menu

+
+ +
+

Tools Menu

The tileset editor provides users with several useful tools for making edits easier and more convenient.

-
-

Import Tiles Image…

+
+

Import Tiles Image…

Tool to automatically import a new tile image for a tileset. The tile image is an indexed png of 8x8 pixel tiles, which are used to form metatiles in the tileset editor.

-
-
-

Import Metatiles from Advance Map 1.92…

+
+
+

Import Metatiles from Advance Map 1.92…

Helpful for users converting projects from binary hacks. Metatile data exported from Advance Map 1.92 in a .bvd` file can be imported into porymap’s tileset editor. This saves a lot of time since metatiles will not have to be defined from scratch.

- -
-

Change Number of Metatiles

+
+
+

Change Number of Metatiles

The number of metatiles in both the current primary and current secondary tileset can be adjusted within the limits.

-

Note

-

You may need to change the Makefile rules for the number of tiles allowed +

Note

+

You may need to change the Makefile rules for the number of tiles allowed for the tileset in the file graphics_file_rules.mk. You can simply remove the -num_tiles= argument altogether.

- -
-

Other Tools

-
+
+
+

Other Tools

+
TSE Unused -
-

Displaying Unused Tiles

-
- +

Displaying Unused Tiles

+

There are also tools to count the number of metatile and tile usages across the entire project, which can be useful, for example, in determining whether a metatile can be deleted. The output of these operations is pictured above.

- - -
-

Palette Editor

+
+ +
+

Palette Editor

The palette editor is where the .pal files are modified for each tileset.

-
+
PE -
-

Palette Editor

-
-
+

Palette Editor

+

The current palette is indicated by the spinner at the top left. To switch between palettes, just change the spinner value. At the top right is a setting for the bit depth at which colors are displayed. @@ -467,38 +521,56 @@ which allows users to pick any color from the screen and add it to the palette.<

Entire palettes can also be imported from a variety of formats, including JASC, Adobe Color Table, Tile Layer Pro, and Advance PE. Each imported palette must contain 16 colors.

- - + + + - + + + - + + + + + + \ No newline at end of file diff --git a/docs/objects.inv b/docs/objects.inv index 5e0eeda5..90683b10 100644 Binary files a/docs/objects.inv and b/docs/objects.inv differ diff --git a/docs/reference/changelog.html b/docs/reference/changelog.html index 2db1f988..e6255782 100644 --- a/docs/reference/changelog.html +++ b/docs/reference/changelog.html @@ -1,49 +1,89 @@ - - - - - - Changelog — porymap documentation - - - - - + + + + + + - - - - - + + + Changelog — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
+
+

Fixed

    -
  • Add registerToggleAction to the scripting API

  • +
  • Fix text boxes in the Palette Editor calculating color incorrectly.
  • +
  • Fix metatile labels being sorted incorrectly for tileset names with multiple underscores.
  • +
  • Fix default object sprites retaining dimensions and transparency of the previous sprite.
  • +
  • Fix connections not being deleted when the map name text box is cleared.
  • +
  • Fix the map border not updating when a tileset is changed.
  • +
  • Improve the poor speed of the API functions setMetatileTile and setMetatileTiles.
  • +
  • Stop the Tileset Editor from scrolling to the initially selected metatile when saving.
  • +
  • Fix 0x0/NULL appearing more than once in the scripts dropdown.
  • +
  • Fix the selection outline sticking in single-tile mode on the Prefab tab.
  • +
  • Fix heal location data being cleared if certain spaces aren’t used in the table.
  • +
  • Fix bad URL color contrast on dark themes.
  • +
  • Fix some issues when too few/many pokémon are specified for a wild encounter group.
  • +
  • Fix Porymap reporting errors for macros it doesn’t use.
  • +
  • Fix painting on the Collision tab with the opacity slider at 0 painting metatiles.
  • +
  • Fix crashes when File->Reload Project fails.
  • +
  • Fix overworld sprite facing directions if spritesheet has vertical layout.
  • +
  • Stop reporting Error: Interrupted for custom scripts during project reopen
- -
-

Changed

+
+ +
+

5.1.1 - 2023-02-20

+
+

Added

    -
  • Change encounter tab copy and paste behavior.

  • -
  • A warning will appear if a custom script fails to load or an action fails to run.

  • +
  • Add registerToggleAction to the scripting API
- -
-

Fixed

+
+
+

Changed

    -
  • Fix null characters being unpredictably written to some JSON files.

  • -
  • Fix tilesets that share part of their name loading incorrectly.

  • -
  • Fix events being hidden behind connecting maps.

  • -
  • Metatile labels with values defined outside their tileset are no longer deleted.

  • -
  • Fix the Tileset Editor retaining edit history after changing tilesets.

  • -
  • Fix some minor visual issues on the Connections tab.

  • -
  • Fix bug which caused encounter configurator to crash if slots in fields containing groups were deleted.

  • -
  • Fix bug which caused encounter configurator to crash if last field was deleted.

  • -
  • Fix map render when collision view was active while map changed.

  • -
  • Fix the updated pokefirered region map graphics appearing in grayscale.

  • -
  • Fix the API function registerAction not correctly handling actions with the same name.

  • +
  • Change encounter tab copy and paste behavior.
  • +
  • A warning will appear if a custom script fails to load or an action fails to run.
- - -
-

5.1.0 - 2023-01-22

-
-

Added

+
+
+

Fixed

    -
  • Add new config options for reorganizing metatile attributes.

  • -
  • Add setScale to the scripting API.

  • -
  • Add option to turn off the checkerboard fill for new tilesets.

  • -
  • Add option to copy wild encounters from another encounters tab.

  • +
  • Fix null characters being unpredictably written to some JSON files.
  • +
  • Fix tilesets that share part of their name loading incorrectly.
  • +
  • Fix events being hidden behind connecting maps.
  • +
  • Metatile labels with values defined outside their tileset are no longer deleted.
  • +
  • Fix the Tileset Editor retaining edit history after changing tilesets.
  • +
  • Fix some minor visual issues on the Connections tab.
  • +
  • Fix bug which caused encounter configurator to crash if slots in fields containing groups were deleted.
  • +
  • Fix bug which caused encounter configurator to crash if last field was deleted.
  • +
  • Fix map render when collision view was active while map changed.
  • +
  • Fix the updated pokefirered region map graphics appearing in grayscale.
  • +
  • Fix the API function registerAction not correctly handling actions with the same name.
- -
-

Changed

+
+
+
+

5.1.0 - 2023-01-22

+
+

Added

    -
  • Double-clicking on a connecting map on the Map or Events tabs will now open that map.

  • -
  • Hovering on border metatiles with the mouse will now display their information in the bottom bar.

  • -
  • The last-used directory is now preserved in import/export file dialogs.

  • -
  • Encounter editing has been slightly modified in favor of a more performant ui.

  • -
  • Pokémon icons in the encounter editor have their transparency set.

  • +
  • Add new config options for reorganizing metatile attributes.
  • +
  • Add setScale to the scripting API.
  • +
  • Add option to turn off the checkerboard fill for new tilesets.
  • +
  • Add option to copy wild encounters from another encounters tab.
- -
-

Fixed

+
+
+

Changed

    -
  • Fix the Region Map Editor being opened by the Shortcuts Editor.

  • -
  • Fix New Map settings being preserved when switching projects.

  • -
  • Fix scripting API callback onMapResized not triggering.

  • -
  • Fix crash when importing AdvanceMap metatiles while enable_triple_layer_metatiles is enabled.

  • -
  • Fix File -> Open Project not resolving folder shortcuts.

  • -
  • Fix bug where “Requires Itemfinder” checkbox is being checked by wrong data.

  • -
  • Fix the map border not immediately reflecting Tileset Editor changes.

  • -
  • Fix pasting metatiles in the Tileset Editor not triggering the unsaved changes warning.

  • +
  • Double-clicking on a connecting map on the Map or Events tabs will now open that map.
  • +
  • Hovering on border metatiles with the mouse will now display their information in the bottom bar.
  • +
  • The last-used directory is now preserved in import/export file dialogs.
  • +
  • Encounter editing has been slightly modified in favor of a more performant ui.
  • +
  • Pokémon icons in the encounter editor have their transparency set.
- - -
-

5.0.0 - 2022-10-30

-
-

Breaking Changes

+
+
+

Fixed

    -
  • Proper support for pokefirered’s clone objects was added, which requires the changes made in pokefirered/#484.

  • -
  • Warp IDs are now treated as strings, which requires the change to mapjson made in pokeemerald/#1755. Additionally MAP_NONE was renamed to MAP_DYNAMIC. Both changes also apply to pokefirered and pokeruby.

  • -
  • Overhauled the region map editor, adding support for tilemaps, and significant customization. Also now supports pokefirered. Requires the changes made in pokeemerald/#1651, pokefirered/#500, or pokeruby/#842.

  • -
  • Many API functions which were previously accessible via the map object are now accessible via one of the new objects overlay, utility, or constants. Some functions were renamed accordingly. See porymap/#460 for a full list of API function name changes.

  • -
  • Arguments for the API function createImage have changed: xflip and yflip have been replaced with hScale and vScale, and offset has been replaced with xOffset and yOffset.

  • -
  • The API function addFilledRect has been removed; it’s been replaced by new arguments in addRect: color has been replaced with borderColor and fillColor, and a new rounding argument allows ellipses to be drawn.

  • +
  • Fix the Region Map Editor being opened by the Shortcuts Editor.
  • +
  • Fix New Map settings being preserved when switching projects.
  • +
  • Fix scripting API callback onMapResized not triggering.
  • +
  • Fix crash when importing AdvanceMap metatiles while enable_triple_layer_metatiles is enabled.
  • +
  • Fix File -> Open Project not resolving folder shortcuts.
  • +
  • Fix bug where “Requires Itemfinder” checkbox is being checked by wrong data.
  • +
  • Fix the map border not immediately reflecting Tileset Editor changes.
  • +
  • Fix pasting metatiles in the Tileset Editor not triggering the unsaved changes warning.
- -
-

Added

+
+
+
+

5.0.0 - 2022-10-30

+
+

Breaking Changes

    -
  • Add prefab support

  • -
  • Add Cut/Copy/Paste for metatiles in the Tileset Editor.

  • -
  • Add button to copy the full metatile label to the clipboard in the Tileset Editor.

  • -
  • Add ability to export an image of the primary or secondary tileset’s metatiles.

  • -
  • Add new config options for customizing how new maps are filled, setting default tilesets, and whether the most recent project should be opened on launch.

  • -
  • Add color picker to palette editor for taking colors from the screen.

  • -
  • Add new features to the scripting API, including the ability to display messages and user input windows, set the overlay’s opacity, rotation, scale, and clipping, interact with map header properties and the map border, read tile pixel data, and more.

  • +
  • Proper support for pokefirered’s clone objects was added, which requires the changes made in pokefirered/#484.
  • +
  • Warp IDs are now treated as strings, which requires the change to mapjson made in pokeemerald/#1755. Additionally MAP_NONE was renamed to MAP_DYNAMIC. Both changes also apply to pokefirered and pokeruby.
  • +
  • Overhauled the region map editor, adding support for tilemaps, and significant customization. Also now supports pokefirered. Requires the changes made in pokeemerald/#1651, pokefirered/#500, or pokeruby/#842.
  • +
  • Many API functions which were previously accessible via the map object are now accessible via one of the new objects overlay, utility, or constants. Some functions were renamed accordingly. See porymap/#460 for a full list of API function name changes.
  • +
  • Arguments for the API function createImage have changed: xflip and yflip have been replaced with hScale and vScale, and offset has been replaced with xOffset and yOffset.
  • +
  • The API function addFilledRect has been removed; it’s been replaced by new arguments in addRect: color has been replaced with borderColor and fillColor, and a new rounding argument allows ellipses to be drawn.
- -
-

Changed

+
+
+

Added

    -
  • Previous settings will be remembered in the New Map Options window.

  • -
  • The Custom Attributes table for map headers and events now supports types other than strings.

  • -
  • If an object event is inanimate, it will always render using its first frame.

  • -
  • Unused metatile attribute bits are preserved instead of being cleared.

  • -
  • The wild encounter editor is automatically disabled if the encounter JSON data cannot be read

  • -
  • Metatiles are always rendered accurately with 3 layers, and the unused layer is not assumed to be transparent.

  • -
  • object_event_graphics_info.h can now be parsed correctly if it uses structs with attributes.

  • -
  • Tileset data in headers, graphics, and metatiles can now be parsed if written in C.

  • -
  • The amount of time it takes to render the event panel has been reduced, which is most noticeable when selecting multiple events at once.

  • -
  • The selection is no longer reset when pasting events. The newly pasted events are selected instead.

  • -
  • The currently selected event for each event group will persist between tabs.

  • -
  • An object event’s sprite will now render if a number is specified instead of a graphics constant.

  • -
  • Palette editor ui is updated a bit to allow hex and rgb value input.

  • -
  • Heal location constants will no longer be deleted if they’re not used in the data tables.

  • -
  • The heal location prefixes SPAWN_ and HEAL_LOCATION_ may now be used interchangeably.

  • -
  • The number and order of entries in the heal location data tables can now be changed arbitrarily, and independently of each other.

  • -
  • The metatile behavior is now displayed in the bottom bar mouseover text.

  • -
  • Number values are now allowed in the Tileset Editor’s Metatile Behavior field.

  • -
  • Removed some unnecessary error logs from the scripting API and added new useful ones.

  • -
  • If any JSON data is the incorrect type Porymap will now attempt to convert it.

  • +
  • Add prefab support
  • +
  • Add Cut/Copy/Paste for metatiles in the Tileset Editor.
  • +
  • Add button to copy the full metatile label to the clipboard in the Tileset Editor.
  • +
  • Add ability to export an image of the primary or secondary tileset’s metatiles.
  • +
  • Add new config options for customizing how new maps are filled, setting default tilesets, and whether the most recent project should be opened on launch.
  • +
  • Add color picker to palette editor for taking colors from the screen.
  • +
  • Add new features to the scripting API, including the ability to display messages and user input windows, set the overlay’s opacity, rotation, scale, and clipping, interact with map header properties and the map border, read tile pixel data, and more.
- -
-

Fixed

+
+
+

Changed

    -
  • Fix events losing their assigned script when the script autocomplete is used.

  • -
  • Fix the unsaved changes indicator not disappearing when saving changes to events.

  • -
  • Fix copy and paste for events not including their custom attributes.

  • -
  • Fix cursor tile outline not updating at the end of a dragged selection.

  • -
  • Fix cursor tile and player view outlines exiting map bounds while painting.

  • -
  • Fix cursor tile and player view outlines not updating immediately when toggled in Collision view.

  • -
  • Fix selected space not updating while painting in Collision view.

  • -
  • Fix collision values of 2 or 3 not rendering properly.

  • -
  • Fix the map tree view arrows not displaying for custom themes.

  • -
  • Fix the map music dropdown being empty when importing a map from Advance Map.

  • -
  • Fix object events added by pasting ignoring the map event limit.

  • -
  • Fix a bug where saving the tileset editor would reselect the main editor’s first selected metatile.

  • -
  • Fix crashes / unexpected behavior if certain scripting API functions are given invalid palette or tile numbers.

  • -
  • Fix drawing large amounts of text with the scripting API causing a significant drop in performance.

  • -
  • Silence unnecessary error logging when parsing C defines Porymap doesn’t use.

  • -
  • Fix some windows like the Tileset Editor not raising to the front when reactivated.

  • -
  • Fix incorrect limits on Floor Number and Border Width/Height in the New Map Options window.

  • -
  • Fix Border Width/Height being set to 0 when creating a new map from an existing layout.

  • -
  • Fix certain UI elements not highlighting red on some platforms.

  • -
  • Fix Open Config Folder not responding

  • -
  • Properly update the minimum offset for a connection when the map is changed.

  • +
  • Previous settings will be remembered in the New Map Options window.
  • +
  • The Custom Attributes table for map headers and events now supports types other than strings.
  • +
  • If an object event is inanimate, it will always render using its first frame.
  • +
  • Unused metatile attribute bits are preserved instead of being cleared.
  • +
  • The wild encounter editor is automatically disabled if the encounter JSON data cannot be read
  • +
  • Metatiles are always rendered accurately with 3 layers, and the unused layer is not assumed to be transparent.
  • +
  • object_event_graphics_info.h can now be parsed correctly if it uses structs with attributes.
  • +
  • Tileset data in headers, graphics, and metatiles can now be parsed if written in C.
  • +
  • The amount of time it takes to render the event panel has been reduced, which is most noticeable when selecting multiple events at once.
  • +
  • The selection is no longer reset when pasting events. The newly pasted events are selected instead.
  • +
  • The currently selected event for each event group will persist between tabs.
  • +
  • An object event’s sprite will now render if a number is specified instead of a graphics constant.
  • +
  • Palette editor ui is updated a bit to allow hex and rgb value input.
  • +
  • Heal location constants will no longer be deleted if they’re not used in the data tables.
  • +
  • The heal location prefixes SPAWN_ and HEAL_LOCATION_ may now be used interchangeably.
  • +
  • The number and order of entries in the heal location data tables can now be changed arbitrarily, and independently of each other.
  • +
  • The metatile behavior is now displayed in the bottom bar mouseover text.
  • +
  • Number values are now allowed in the Tileset Editor’s Metatile Behavior field.
  • +
  • Removed some unnecessary error logs from the scripting API and added new useful ones.
  • +
  • If any JSON data is the incorrect type Porymap will now attempt to convert it.
- - -
-

4.5.0 - 2021-12-26

-
-

Added

+
+
+

Fixed

    -
  • WSL project paths are now supported. (For example, \wsl$\Ubuntu-20.04\home\huderlem\pokeemerald)

  • -
  • Add ability to export map timelapse animated GIFs with File -> Export Map Timelapse Image....

  • -
  • Add tool to count the times each metatile or tile is used in the tileset editor.

  • -
  • Events, current metatile selections, and map images can now be copied and pasted, including between windows.

  • -
  • The grid and map border visibility are now saved as config options.

  • -
  • Add ~60 new scripting API functions, including new features like reading/writing metatile data, layering, moving, and hiding items in the overlay, creating modified images and tile/metatile images, reading tileset sizes, logging warnings and errors, and more.

  • -
  • Add 7 new scripting API callbacks.

  • -
  • Porymap is now compatible with Qt6.

  • +
  • Fix events losing their assigned script when the script autocomplete is used.
  • +
  • Fix the unsaved changes indicator not disappearing when saving changes to events.
  • +
  • Fix copy and paste for events not including their custom attributes.
  • +
  • Fix cursor tile outline not updating at the end of a dragged selection.
  • +
  • Fix cursor tile and player view outlines exiting map bounds while painting.
  • +
  • Fix cursor tile and player view outlines not updating immediately when toggled in Collision view.
  • +
  • Fix selected space not updating while painting in Collision view.
  • +
  • Fix collision values of 2 or 3 not rendering properly.
  • +
  • Fix the map tree view arrows not displaying for custom themes.
  • +
  • Fix the map music dropdown being empty when importing a map from Advance Map.
  • +
  • Fix object events added by pasting ignoring the map event limit.
  • +
  • Fix a bug where saving the tileset editor would reselect the main editor’s first selected metatile.
  • +
  • Fix crashes / unexpected behavior if certain scripting API functions are given invalid palette or tile numbers.
  • +
  • Fix drawing large amounts of text with the scripting API causing a significant drop in performance.
  • +
  • Silence unnecessary error logging when parsing C defines Porymap doesn’t use.
  • +
  • Fix some windows like the Tileset Editor not raising to the front when reactivated.
  • +
  • Fix incorrect limits on Floor Number and Border Width/Height in the New Map Options window.
  • +
  • Fix Border Width/Height being set to 0 when creating a new map from an existing layout.
  • +
  • Fix certain UI elements not highlighting red on some platforms.
  • +
  • Fix Open Config Folder not responding
  • +
  • Properly update the minimum offset for a connection when the map is changed.
- -
-

Changed

+
+
+
+

4.5.0 - 2021-12-26

+
+

Added

    -
  • New events will be placed in the center of the current view of the map.

  • -
  • Scripting API errors are more detailed and logged in more situations.

  • -
  • Add new optional arguments to 5 existing API functions.

  • -
  • Top-level UI elements now render above the scripting overlay.

  • -
  • The onBlockChanged script callback is now called for blocks changed by Undo/Redo.

  • +
  • WSL project paths are now supported. (For example, \wsl$\Ubuntu-20.04\home\huderlem\pokeemerald)
  • +
  • Add ability to export map timelapse animated GIFs with File -> Export Map Timelapse Image....
  • +
  • Add tool to count the times each metatile or tile is used in the tileset editor.
  • +
  • Events, current metatile selections, and map images can now be copied and pasted, including between windows.
  • +
  • The grid and map border visibility are now saved as config options.
  • +
  • Add ~60 new scripting API functions, including new features like reading/writing metatile data, layering, moving, and hiding items in the overlay, creating modified images and tile/metatile images, reading tileset sizes, logging warnings and errors, and more.
  • +
  • Add 7 new scripting API callbacks.
  • +
  • Porymap is now compatible with Qt6.
- -
-

Fixed

+
+
+

Changed

    -
  • Fix % operator in C defines not being evaluated

  • -
  • Fix tileset palette editor crash that could occur when switching maps or tilesets with it open.

  • -
  • The metatile selection is no longer reset if it becomes invalid by changing the tileset. Invalid metatiles in the selection will be temporarily replaced with metatile 0.

  • -
  • Loading wild encounters will now properly preserve the original order, so saving the file will not give huge diffs.

  • -
  • Fix bug where the tile selection cursor could be toggld on in the Events tab.

  • +
  • New events will be placed in the center of the current view of the map.
  • +
  • Scripting API errors are more detailed and logged in more situations.
  • +
  • Add new optional arguments to 5 existing API functions.
  • +
  • Top-level UI elements now render above the scripting overlay.
  • +
  • The onBlockChanged script callback is now called for blocks changed by Undo/Redo.
- - -
-

4.4.0 - 2020-12-20

-
-

Added

+
+
+

Fixed

    -
  • Add undoable edit history for Events tab.

  • -
  • Add keyboard shortcut for DEL key to delete the currently selected event(s).

  • -
  • Disable ui while there is no open project to prevent crashing.

  • -
  • Add “Straight Paths” feature for drawing straight lines while holding Ctrl.

  • -
  • The New Map dialog now gives an option to specify the “Show Location Name” field.

  • -
  • Some new shortcuts were added in porymap/#290.

  • -
  • All plain text boxes now have a clear button to delete the text.

  • -
  • The window sizes and positions of the tileset editor, palette editor, and region map editor are now stored in porymap.cfg.

  • -
  • Add ruler tool for measuring metatile distance in events tab (Right-click to turn on/off, left-click to lock in place).

  • -
  • Add delete button to wild pokemon encounters tab.

  • -
  • Add shortcut customization via Options -> Edit Shortcuts.

  • -
  • Add custom text editor commands in Options -> Edit Preferences, a tool-button next to the Script combo-box, and Tools -> Open Project in Text Editor. The tool-button will open the containing file to the cooresponding script.

  • +
  • Fix % operator in C defines not being evaluated
  • +
  • Fix tileset palette editor crash that could occur when switching maps or tilesets with it open.
  • +
  • The metatile selection is no longer reset if it becomes invalid by changing the tileset. Invalid metatiles in the selection will be temporarily replaced with metatile 0.
  • +
  • Loading wild encounters will now properly preserve the original order, so saving the file will not give huge diffs.
  • +
  • Fix bug where the tile selection cursor could be toggld on in the Events tab.
- -
-

Changed

+
+
+
+

4.4.0 - 2020-12-20

+
+

Added

    -
  • Holding shift now toggles “Smart Path” drawing; when the “Smart Paths” checkbox is checked, holding shift will temporarily disable it.

  • +
  • Add undoable edit history for Events tab.
  • +
  • Add keyboard shortcut for DEL key to delete the currently selected event(s).
  • +
  • Disable ui while there is no open project to prevent crashing.
  • +
  • Add “Straight Paths” feature for drawing straight lines while holding Ctrl.
  • +
  • The New Map dialog now gives an option to specify the “Show Location Name” field.
  • +
  • Some new shortcuts were added in porymap/#290.
  • +
  • All plain text boxes now have a clear button to delete the text.
  • +
  • The window sizes and positions of the tileset editor, palette editor, and region map editor are now stored in porymap.cfg.
  • +
  • Add ruler tool for measuring metatile distance in events tab (Right-click to turn on/off, left-click to lock in place).
  • +
  • Add delete button to wild pokemon encounters tab.
  • +
  • Add shortcut customization via Options -> Edit Shortcuts.
  • +
  • Add custom text editor commands in Options -> Edit Preferences, a tool-button next to the Script combo-box, and Tools -> Open Project in Text Editor. The tool-button will open the containing file to the cooresponding script.
- -
-

Fixed

+
+
+

Changed

    -
  • Fix a bug with the current metatile selection zoom.

  • -
  • Fix bug preventing the status bar from updating the current position while dragging events.

  • -
  • Fix porymap icon not showing on window or panel on Linux.

  • -
  • The main window can now be resized to fit on lower resolution displays.

  • -
  • Zooming the map in/out will now focus on the cursor.

  • -
  • Fix bug where object event sprites whose name contained a 0 character would display the placeholder “N” picture.

  • +
  • Holding shift now toggles “Smart Path” drawing; when the “Smart Paths” checkbox is checked, holding shift will temporarily disable it.
- - -
-

4.3.1 - 2020-07-17

-
-

Added

+
+
+

Fixed

    -
  • Add keyboard shortcut Ctrl + D for duplicating map events.

  • -
  • Add keyboard shortcut Ctrl + Shift + Z for “redo” in the tileset editor.

  • -
  • Add scripting api to reorder metatile layers and draw them with opacity.

  • +
  • Fix a bug with the current metatile selection zoom.
  • +
  • Fix bug preventing the status bar from updating the current position while dragging events.
  • +
  • Fix porymap icon not showing on window or panel on Linux.
  • +
  • The main window can now be resized to fit on lower resolution displays.
  • +
  • Zooming the map in/out will now focus on the cursor.
  • +
  • Fix bug where object event sprites whose name contained a 0 character would display the placeholder “N” picture.
- -
-

Changed

+
+
+
+

4.3.1 - 2020-07-17

+
+

Added

    -
  • The tileset editor now syncs its metatile selection with the map’s metatile selector.

  • -
  • The number of object events per map is now limited to OBJECT_EVENT_TEMPLATES_COUNT

  • -
  • The tileset editor can now flip selections that were taken from an existing metatile.

  • +
  • Add keyboard shortcut Ctrl + D for duplicating map events.
  • +
  • Add keyboard shortcut Ctrl + Shift + Z for “redo” in the tileset editor.
  • +
  • Add scripting api to reorder metatile layers and draw them with opacity.
- -
-

Fixed

+
+
+

Changed

    -
  • Fix bug where editing a metatile layer would have no effect.

  • -
  • Fix a crash that occured when creating a new tileset using triple layer mode.

  • -
  • Fix crash when reducing number of metatiles past current selection.

  • -
  • Fix various methods of selecting invalid metatiles.

  • -
  • Fix sprite transparency not updating when changing object event graphics.

  • -
  • Fix dropdown menu item selection when using the arrow keys.

  • +
  • The tileset editor now syncs its metatile selection with the map’s metatile selector.
  • +
  • The number of object events per map is now limited to OBJECT_EVENT_TEMPLATES_COUNT
  • +
  • The tileset editor can now flip selections that were taken from an existing metatile.
- - -
-

4.3.0 - 2020-06-27

-
-

Added

+
+
+

Fixed

    -
  • Add triple-layer metatiles support.

  • +
  • Fix bug where editing a metatile layer would have no effect.
  • +
  • Fix a crash that occured when creating a new tileset using triple layer mode.
  • +
  • Fix crash when reducing number of metatiles past current selection.
  • +
  • Fix various methods of selecting invalid metatiles.
  • +
  • Fix sprite transparency not updating when changing object event graphics.
  • +
  • Fix dropdown menu item selection when using the arrow keys.
- -
-

Changed

+
+
+
+

4.3.0 - 2020-06-27

+
+

Added

    -
  • The “Open Scripts” button will fall back to scripts.inc if scripts.pory doesn’t exist.

  • +
  • Add triple-layer metatiles support.
- -
-

Fixed

+
+
+

Changed

    -
  • Fix bug where exported tileset images could be horizontally or vertically flipped.

  • -
  • Fix bug where the map list wasn’t filtered properly after switching filter types.

  • -
  • Don’t zoom in map when mouse middle button is pressed.

  • +
  • The “Open Scripts” button will fall back to scripts.inc if scripts.pory doesn’t exist.
- - -
-

4.2.0 - 2020-06-06

-
-

Added

+
+
+

Fixed

    -
  • Add more project-specific configs to better support porting features from different projects.

  • -
  • Add metatile label names to the status bar when hovering over metatiles in the map editor tab.

  • -
  • Add mouse coordinates to the status bar when hovering in the events tab.

  • +
  • Fix bug where exported tileset images could be horizontally or vertically flipped.
  • +
  • Fix bug where the map list wasn’t filtered properly after switching filter types.
  • +
  • Don’t zoom in map when mouse middle button is pressed.
- -
-

Changed

+
+
+
+

4.2.0 - 2020-06-06

+
+

Added

    -
  • metatile_labels.h is now watched for changes.

  • +
  • Add more project-specific configs to better support porting features from different projects.
  • +
  • Add metatile label names to the status bar when hovering over metatiles in the map editor tab.
  • +
  • Add mouse coordinates to the status bar when hovering in the events tab.
- -
-

Fixed

+
+
+

Changed

    -
  • Reduce time it takes to load maps and save in the tileset editor.

  • -
  • Fix crash that could occur when parsing unknown symbols when evaluating define expressions.

  • +
  • metatile_labels.h is now watched for changes.
- - -
-

4.1.0 - 2020-05-18

-
-

Added

+
+
+

Fixed

    -
  • Add scripting capabilities, which allows the user to add custom behavior to Porymap using JavaScript scripts.

  • -
  • Add ability to import FRLG tileset .bvd files from Advance Map 1.92.

  • +
  • Reduce time it takes to load maps and save in the tileset editor.
  • +
  • Fix crash that could occur when parsing unknown symbols when evaluating define expressions.
- -
-

Changed

+
+
+
+

4.1.0 - 2020-05-18

+
+

Added

    -
  • Edit modes are no longer shared between the Map and Events tabs. Pencil is default for Map tab, and Pointer is default for Events tab.

  • +
  • Add scripting capabilities, which allows the user to add custom behavior to Porymap using JavaScript scripts.
  • +
  • Add ability to import FRLG tileset .bvd files from Advance Map 1.92.
- -
-

Fixed

+
+
+

Changed

    -
  • Disallow drawing new heal locations in the events tab.

  • -
  • Fix issue where the metatile selection window was not resizable.

  • -
  • Show warning when closing project with unsaved wild Pokémon changes.

  • -
  • Fix bug where negative object event coordinates were saved as “0”.

  • -
  • Fix maximum map dimension limits.

  • -
  • Fix crash when using the Pencil tool to create an event on a map with no existing events.

  • +
  • Edit modes are no longer shared between the Map and Events tabs. Pencil is default for Map tab, and Pointer is default for Events tab.
- - -
-

4.0.0 - 2020-04-28

-
-

Breaking Changes

+
+
+

Fixed

    -
  • If you are using pokeemerald or pokeruby, there were changes made in pokeemerald/#1010 and pokeruby/#776 that you will need to integrate in order to use this version of porymap.

  • +
  • Disallow drawing new heal locations in the events tab.
  • +
  • Fix issue where the metatile selection window was not resizable.
  • +
  • Show warning when closing project with unsaved wild Pokémon changes.
  • +
  • Fix bug where negative object event coordinates were saved as “0”.
  • +
  • Fix maximum map dimension limits.
  • +
  • Fix crash when using the Pencil tool to create an event on a map with no existing events.
- -
-

Added

+
+
+
+

4.0.0 - 2020-04-28

+
+

Breaking Changes

    -
  • Support for pokefirered. Kanto fans rejoice! At long last porymap supports the FRLG decompilation project.

  • -
  • Add ability to export map stitches with File -> Export Map Stitch Image....

  • -
  • Add new project config option use_custom_border_size.

  • -
  • Add ability to toggle project settings in Options menu.

  • -
  • Add file monitoring, so Porymap will prompt the user to reload the project if certain project files are modified outside of Porymap.

  • -
  • Add ability to reload project.

  • -
  • Add Pencil, Move, and Map Shift tools to the Events tab.

  • +
  • If you are using pokeemerald or pokeruby, there were changes made in pokeemerald/#1010 and pokeruby/#776 that you will need to integrate in order to use this version of porymap.
- -
-

Changed

+
+
+

Added

    -
  • Porymap now saves map and encounter json data in an order consistent with the upstream repos. This will provide more comprehensible diffs when files are saved.

  • -
  • Update Porymap icon.

  • -
  • The “Map” and “Events” tabs now render using the same view, so jumping between them is smooth.

  • -
  • Extend connection min and max offsets to player’s view boundary, rather than the map’s boundary.

  • +
  • Support for pokefirered. Kanto fans rejoice! At long last porymap supports the FRLG decompilation project.
  • +
  • Add ability to export map stitches with File -> Export Map Stitch Image....
  • +
  • Add new project config option use_custom_border_size.
  • +
  • Add ability to toggle project settings in Options menu.
  • +
  • Add file monitoring, so Porymap will prompt the user to reload the project if certain project files are modified outside of Porymap.
  • +
  • Add ability to reload project.
  • +
  • Add Pencil, Move, and Map Shift tools to the Events tab.
- -
-

Fixed

+
+
+

Changed

    -
  • Fix bug where pressing TAB key did not navigate through widgets in the wild encounter tables.

  • -
  • Fix bug that allowed selecting an invalid metatile in the metatile selector.

  • -
  • Don’t allow . or - characters in new tileset names.

  • -
  • Fix regression that prevented selecting empty region map squares

  • +
  • Porymap now saves map and encounter json data in an order consistent with the upstream repos. This will provide more comprehensible diffs when files are saved.
  • +
  • Update Porymap icon.
  • +
  • The “Map” and “Events” tabs now render using the same view, so jumping between them is smooth.
  • +
  • Extend connection min and max offsets to player’s view boundary, rather than the map’s boundary.
- - -
-

3.0.1 - 2020-03-04

-
-

Fixed

+
+
+

Fixed

    -
  • Fix bug on Mac where tileset images were corrupted when saving.

  • +
  • Fix bug where pressing TAB key did not navigate through widgets in the wild encounter tables.
  • +
  • Fix bug that allowed selecting an invalid metatile in the metatile selector.
  • +
  • Don’t allow . or - characters in new tileset names.
  • +
  • Fix regression that prevented selecting empty region map squares
- - -
-

3.0.0 - 2020-03-04

-
-

Breaking Changes

+
+
+
+

3.0.1 - 2020-03-04

+
+

Fixed

    -
  • pokeemerald and pokeruby both underwent a naming consistency update with respect to “object events”. As such, these naming changes break old versions of Porymap.

    -
      -
    • pokeemerald object event PR: https://github.com/pret/pokeemerald/pull/910

    • -
    • pokeruby object event PR: https://github.com/pret/pokeruby/pull/768

    • +
    • Fix bug on Mac where tileset images were corrupted when saving.
    • +
    +
+
+
+

3.0.0 - 2020-03-04

+
+

Breaking Changes

+
    +
  • pokeemerald and pokeruby both underwent a naming consistency update with respect to “object events”. As such, these naming changes break old versions of Porymap.
      +
    • pokeemerald object event PR: https://github.com/pret/pokeemerald/pull/910
    • +
    • pokeruby object event PR: https://github.com/pret/pokeruby/pull/768
- -
-

Added

+
+
+

Added

    -
  • Add optional support for Poryscript script files via the use_poryscript config option.

  • -
  • Selecting a group of metatiles from the map area now also copies the collision properties, too.

  • -
  • Add keyboard shortcut Ctrl + G for toggling the map grid.

  • +
  • Add optional support for Poryscript script files via the use_poryscript config option.
  • +
  • Selecting a group of metatiles from the map area now also copies the collision properties, too.
  • +
  • Add keyboard shortcut Ctrl + G for toggling the map grid.
- -
-

Changed

+
+
+

Changed

    -
  • Draw map connections with the current map’s tilesets to more accurately mimic their appearance in-game.

  • +
  • Draw map connections with the current map’s tilesets to more accurately mimic their appearance in-game.
- -
-

Fixed

+
+
+

Fixed

    -
  • Fix index-out-of-bounds crash when deleting the last event in an event type group.

  • -
  • Fix bug where exporting tileset images could add an extra row of junk at the end.

  • -
  • Fix crashes when encountering an error opening a project or map.

  • -
  • Fix bug where comboboxes and wild pokemon data could grow large when opening projects multiple times during the same porymap session.

  • -
  • Fix bug where dragging the metatile selector would visually extend beyond map boundary.

  • +
  • Fix index-out-of-bounds crash when deleting the last event in an event type group.
  • +
  • Fix bug where exporting tileset images could add an extra row of junk at the end.
  • +
  • Fix crashes when encountering an error opening a project or map.
  • +
  • Fix bug where comboboxes and wild pokemon data could grow large when opening projects multiple times during the same porymap session.
  • +
  • Fix bug where dragging the metatile selector would visually extend beyond map boundary.
- - -
-

2.0.0 - 2019-10-16

-
-

Breaking Changes

+
+
+
+

2.0.0 - 2019-10-16

+
+

Breaking Changes

- -
-

Added

+
+
+

Added

- -
-

Changed

+
+
+

Changed

    -
  • Exporting map images is now more configurable. Events, connections, collision, etc. can be toggled on and off before exporting the image.

  • -
  • The entire Tileset Editor selection is now conveniently flipped when selecting x-flip or y-flip.

  • -
  • Autocomplete for porymap’s comboboxes no longer require typing the full string prefix.

  • +
  • Exporting map images is now more configurable. Events, connections, collision, etc. can be toggled on and off before exporting the image.
  • +
  • The entire Tileset Editor selection is now conveniently flipped when selecting x-flip or y-flip.
  • +
  • Autocomplete for porymap’s comboboxes no longer require typing the full string prefix.
- -
-

Fixed

+
+
+

Fixed

    -
  • Fix bug where map group names were hardcoded when creating a new map.

  • -
  • Fix bug in Tileset Editor where multi-tile selections weren’t properly painted when clicking on the bottom row of the metatile layers.

  • -
  • Fix bug where line breaks in C headers were not parsed properly.

  • -
  • Fix bug when exporting tileset images using palettes with duplicate colors.

  • -
  • Fix bug where creating new maps from existing layouts created an empty layout folder.

  • -
  • Fix bug where exported tile images did not contain the last row of tiles.

  • +
  • Fix bug where map group names were hardcoded when creating a new map.
  • +
  • Fix bug in Tileset Editor where multi-tile selections weren’t properly painted when clicking on the bottom row of the metatile layers.
  • +
  • Fix bug where line breaks in C headers were not parsed properly.
  • +
  • Fix bug when exporting tileset images using palettes with duplicate colors.
  • +
  • Fix bug where creating new maps from existing layouts created an empty layout folder.
  • +
  • Fix bug where exported tile images did not contain the last row of tiles.
- - -
-

1.2.2 - 2019-05-16

-
-

Added

+
+
+
+

1.2.2 - 2019-05-16

+
+

Added

    -
  • Add region map editor

  • -
  • Add ability to add new tilesets

  • -
  • Add official Porymap documentation website: https://huderlem.github.io/porymap/

  • +
  • Add region map editor
  • +
  • Add ability to add new tilesets
  • +
  • Add official Porymap documentation website: https://huderlem.github.io/porymap/
- -
-

Changed

+
+
+

Changed

    -
  • Event sprites now display as facing the direction of their movement type.

  • -
  • Default values for newly-created events now use valid values from the project, rather than hardcoded values.

  • -
  • Deleting events will stay in the same events tab for easier bulk deletions.

  • -
  • Double-clicking on a secret base event will open the corresponding secret base map.

  • -
  • Selected events are now rendered above other events.

  • -
  • Default values for new events are now more sensible and guaranteed to be valid.

  • +
  • Event sprites now display as facing the direction of their movement type.
  • +
  • Default values for newly-created events now use valid values from the project, rather than hardcoded values.
  • +
  • Deleting events will stay in the same events tab for easier bulk deletions.
  • +
  • Double-clicking on a secret base event will open the corresponding secret base map.
  • +
  • Selected events are now rendered above other events.
  • +
  • Default values for new events are now more sensible and guaranteed to be valid.
- -
-

Fixed

+
+
+

Fixed

    -
  • Fix bug in zoomed metatile selector where a large selection rectangle was being rendered.

  • -
  • Fix bug where edited map icons were not rendered properly.

  • -
  • Fix bug where right-click copying a tile from the tileset editor’s metatile layers wouldn’t copy the x/y flip status.

  • -
  • Parsing project data is now more resilient to crashing, and it reports more informative errors.

  • +
  • Fix bug in zoomed metatile selector where a large selection rectangle was being rendered.
  • +
  • Fix bug where edited map icons were not rendered properly.
  • +
  • Fix bug where right-click copying a tile from the tileset editor’s metatile layers wouldn’t copy the x/y flip status.
  • +
  • Parsing project data is now more resilient to crashing, and it reports more informative errors.
- - -
-

1.2.1 - 2019-02-16

-
-

Added

+
+
+
+

1.2.1 - 2019-02-16

+
+

Added

    -
  • Add ability to zoom in and out the map metatile selector via a slider at the bottom of the metatile selector window.

  • +
  • Add ability to zoom in and out the map metatile selector via a slider at the bottom of the metatile selector window.
- -
-

Fixed

+
+
+

Fixed

    -
  • Fix crash when creating a new map from a layout that has no pre-existing maps that use it.

  • -
  • Fix bug where var_value, trainer_type and trainer_sight_or_berry_tree_id JSON fields were being interpreted as integers.

  • +
  • Fix crash when creating a new map from a layout that has no pre-existing maps that use it.
  • +
  • Fix bug where var_value, trainer_type and trainer_sight_or_berry_tree_id JSON fields were being interpreted as integers.
- - -
-

1.2.0 - 2019-02-04

-
-

Breaking Changes

+
+
+
+

1.2.0 - 2019-02-04

+
+

Breaking Changes

- -
-

Added

+
+
+

Added

    -
  • Add “magic fill” mode to fill tool (hold down CTRL key). This fills all matching metatiles on the map, rather than only the contiguous region.

  • -
  • Add ability to import tileset palettes (JASC, .pal, .tpl, .gpl, .act).

  • -
  • Add ability to export tileset tiles as indexed .png images. The currently-selected palette is used.

  • -
  • Restore window sizes the next time the application is opened.

  • -
  • Add ability to import metatiles from Advance Map 1.92 (.bvd files).

  • -
  • Add About window that contains porymap information and changelog. (Found in file menu Help > About Porymap)

  • -
  • Add option to show player’s in-game view when hovering the mouse on the map.

  • -
  • Add option to show an outline around the currently-hovered map tile. Its size depends on the size of the current metatile selection.

  • -
  • Add ability to define custom fields for map header and all events.

  • +
  • Add “magic fill” mode to fill tool (hold down CTRL key). This fills all matching metatiles on the map, rather than only the contiguous region.
  • +
  • Add ability to import tileset palettes (JASC, .pal, .tpl, .gpl, .act).
  • +
  • Add ability to export tileset tiles as indexed .png images. The currently-selected palette is used.
  • +
  • Restore window sizes the next time the application is opened.
  • +
  • Add ability to import metatiles from Advance Map 1.92 (.bvd files).
  • +
  • Add About window that contains porymap information and changelog. (Found in file menu Help > About Porymap)
  • +
  • Add option to show player’s in-game view when hovering the mouse on the map.
  • +
  • Add option to show an outline around the currently-hovered map tile. Its size depends on the size of the current metatile selection.
  • +
  • Add ability to define custom fields for map header and all events.
- -
-

Changed

+
+
+

Changed

    -
  • Collapse the map list by default.

  • -
  • Collision view now has a transparency slider to help make it easier to view the underlying metatiles.

  • -
  • When importing tileset tiles from an image that is not indexed, the user can also provide a palette for the image. This is for the scenario where the user exports tiles and a palette from Advance Map.

  • -
  • When creating a new map, the user specifies all of the map properties in a new window prompt.

  • -
  • New maps can be created using existing layouts by right-clicking on an existing layout folder in the map list panel when sorted by “Layout”.

  • -
  • The map list panel now has “expand-all” and “collapse-all” buttons.

  • -
  • Events without sprites are now partially transparent so the underlying metatile can be seen. (Warps, signs, etc.)

  • -
  • Changed the Trainer checkbox to a combobox, since there are actually 3 valid values for the trainer type.

  • -
  • Multiline comments are now respected when parsing C defines.

  • -
  • The tiles image in the tileset editor will no longer flip according to the x/y flip checkboxes. The individual tile selection still flips, though.

  • +
  • Collapse the map list by default.
  • +
  • Collision view now has a transparency slider to help make it easier to view the underlying metatiles.
  • +
  • When importing tileset tiles from an image that is not indexed, the user can also provide a palette for the image. This is for the scenario where the user exports tiles and a palette from Advance Map.
  • +
  • When creating a new map, the user specifies all of the map properties in a new window prompt.
  • +
  • New maps can be created using existing layouts by right-clicking on an existing layout folder in the map list panel when sorted by “Layout”.
  • +
  • The map list panel now has “expand-all” and “collapse-all” buttons.
  • +
  • Events without sprites are now partially transparent so the underlying metatile can be seen. (Warps, signs, etc.)
  • +
  • Changed the Trainer checkbox to a combobox, since there are actually 3 valid values for the trainer type.
  • +
  • Multiline comments are now respected when parsing C defines.
  • +
  • The tiles image in the tileset editor will no longer flip according to the x/y flip checkboxes. The individual tile selection still flips, though.
- -
-

Fixed

+
+
+

Fixed

    -
  • Fix bug where smart paths could be auto-enabled, despite the checkbox being disabled.

  • -
  • Fix crash that could occur when changing the palette id in the tileset palette editor.

  • -
  • Fix crash that could occur when shrinking the number of metatiles in a tileset.

  • -
  • Fix bug where exported tile images from Advance Map were not handled correctly due to Advance Map using incorrect file extensions.

  • +
  • Fix bug where smart paths could be auto-enabled, despite the checkbox being disabled.
  • +
  • Fix crash that could occur when changing the palette id in the tileset palette editor.
  • +
  • Fix crash that could occur when shrinking the number of metatiles in a tileset.
  • +
  • Fix bug where exported tile images from Advance Map were not handled correctly due to Advance Map using incorrect file extensions.
- - -
-

1.1.0 - 2018-12-27

-
-

Breaking Changes

+
+
+
+

1.1.0 - 2018-12-27

+
+

Breaking Changes

- -
-

Added

+
+
+

Added

    -
  • Add porymap.project.cfg config file to project repos, in order to house project-specific settings, such as base_game_version=pokeemerald.

  • -
  • Write all logs to porymap.log file, so users can view any errors that porymap hits.

  • -
  • Changelog

  • +
  • Add porymap.project.cfg config file to project repos, in order to house project-specific settings, such as base_game_version=pokeemerald.
  • +
  • Write all logs to porymap.log file, so users can view any errors that porymap hits.
  • +
  • Changelog
- -
-

Changed

+
+
+

Changed

    -
  • Add porymap.cfg base config file, rather than using built-in system settings (e.g. registry on Windows).

  • -
  • Properly read/write map headers for pokeemerald.

  • -
  • Overhauled event editing pane, which now contains tabs for each different event. Events of the same type can be iterated through using the spinner at the top of the tab. This makes it possible to edit events that are outside the viewing window.

  • +
  • Add porymap.cfg base config file, rather than using built-in system settings (e.g. registry on Windows).
  • +
  • Properly read/write map headers for pokeemerald.
  • +
  • Overhauled event editing pane, which now contains tabs for each different event. Events of the same type can be iterated through using the spinner at the top of the tab. This makes it possible to edit events that are outside the viewing window.
- -
-

Fixed

+
+
+

Fixed

    -
  • Creating new hidden-item events now uses a valid default flag value.

  • -
  • Fix bug where tilesets were sometimes not displaying their bottom row of metatiles.

  • -
  • Fix bug where porymap crashes on startup due to missing map headers.

  • -
  • Fix tileset editor crash that only happened on macOS.

  • -
  • Fix minor bug when parsing C defines.

  • -
  • Write MAP_GROUPS_COUNT define to maps.h.

  • -
  • Fix bug where opening multiple projects and saving would cause junk to be written to layouts_table.inc.

  • -
  • Fix porymap icon on macOS.

  • +
  • Creating new hidden-item events now uses a valid default flag value.
  • +
  • Fix bug where tilesets were sometimes not displaying their bottom row of metatiles.
  • +
  • Fix bug where porymap crashes on startup due to missing map headers.
  • +
  • Fix tileset editor crash that only happened on macOS.
  • +
  • Fix minor bug when parsing C defines.
  • +
  • Write MAP_GROUPS_COUNT define to maps.h.
  • +
  • Fix bug where opening multiple projects and saving would cause junk to be written to layouts_table.inc.
  • +
  • Fix porymap icon on macOS.
- - -
-

1.0.0 - 2018-10-26

+
+
+
+

1.0.0 - 2018-10-26

This was the initial release.

- - +
+ + - + + + - + + + + + + \ No newline at end of file diff --git a/docs/reference/related-projects.html b/docs/reference/related-projects.html index 76c59042..344dfa06 100644 --- a/docs/reference/related-projects.html +++ b/docs/reference/related-projects.html @@ -1,48 +1,88 @@ - - - - - - Related Projects — porymap documentation - - - - - + + + + + + - - - - - + + + Related Projects — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
- + + + + + + \ No newline at end of file diff --git a/docs/search.html b/docs/search.html index 5c4abd8e..6234d1ad 100644 --- a/docs/search.html +++ b/docs/search.html @@ -1,49 +1,88 @@ + + - + + - - - Search — porymap documentation - - - - - - + - - - - - - - + + + Search — porymap documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
+ -
+ + - - - + diff --git a/docs/searchindex.js b/docs/searchindex.js index bb52c880..e2d870f6 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["index", "manual/creating-new-maps", "manual/editing-map-collisions", "manual/editing-map-connections", "manual/editing-map-events", "manual/editing-map-header", "manual/editing-map-tiles", "manual/editing-wild-encounters", "manual/introduction", "manual/navigation", "manual/project-files", "manual/region-map-editor", "manual/scripting-capabilities", "manual/settings-and-options", "manual/shortcuts", "manual/tileset-editor", "reference/changelog", "reference/related-projects"], "filenames": ["index.rst", "manual\\creating-new-maps.rst", "manual\\editing-map-collisions.rst", "manual\\editing-map-connections.rst", "manual\\editing-map-events.rst", "manual\\editing-map-header.rst", "manual\\editing-map-tiles.rst", "manual\\editing-wild-encounters.rst", "manual\\introduction.rst", "manual\\navigation.rst", "manual\\project-files.rst", "manual\\region-map-editor.rst", "manual\\scripting-capabilities.rst", "manual\\settings-and-options.rst", "manual\\shortcuts.rst", "manual\\tileset-editor.rst", "reference\\changelog.md", "reference\\related-projects.rst"], "titles": ["Porymap Documentation", "Creating New Maps", "Editing Map Collisions", "Editing Map Connections", "Editing Map Events", "Editing Map Headers", "Editing Map Tiles", "Editing Wild Encounters", "Introduction", "Navigation", "Project Files", "The Region Map Editor", "Scripting Capabilities", "Porymap Settings", "Shortcuts", "The Tileset Editor", "Changelog", "Related Projects"], "terms": {"If": [0, 2, 3, 4, 6, 7, 11, 12, 14, 16], "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "t": [0, 2, 3, 6, 8, 9, 10, 12, 14, 15, 16], "find": [0, 10], "what": [0, 2, 4, 5, 6, 9, 11], "re": [0, 4, 8, 12, 16], "look": [0, 4, 8, 9, 11], "feel": 0, "someth": [0, 2, 4, 7, 11], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "miss": [0, 16], "pleas": 0, "reach": 0, "out": [0, 4, 6, 7, 9, 11, 12, 14, 16], "github": [0, 13, 16], "http": [0, 13, 16], "com": [0, 13, 16], "huderlem": [0, 16], "introduct": 0, "about": [0, 12, 16], "get": [0, 6, 12], "start": [0, 2, 6, 12], "navig": [0, 3, 4, 7, 8, 11, 16], "map": [0, 7, 8, 10, 13, 16, 17], "list": [0, 1, 4, 6, 10, 11, 12, 13, 14, 16], "main": [0, 6, 7, 8, 11, 12, 16], "window": [0, 1, 4, 5, 6, 7, 8, 11, 12, 13, 15, 16], "tileset": [0, 1, 8, 10, 11, 13, 16], "editor": [0, 4, 8, 12, 13, 16, 17], "region": [0, 1, 5, 6, 8, 12, 16], "edit": [0, 8, 9, 10, 11, 13, 14, 15, 16], "tile": [0, 2, 4, 8, 9, 10, 11, 12, 16], "visual": [0, 2, 16], "option": [0, 4, 9, 10, 11, 12, 13, 14, 15, 16], "select": [0, 3, 4, 7, 8, 9, 11, 12, 14, 15, 16], "metatil": [0, 1, 2, 4, 8, 9, 10, 12, 13, 14, 16], "pencil": [0, 4, 8, 14, 16], "tool": [0, 1, 2, 8, 11, 12, 16], "pointer": [0, 4, 14, 16], "bucket": [0, 12, 14], "fill": [0, 2, 12, 13, 14, 16], "shift": [0, 3, 4, 12, 14, 16], "smart": [0, 2, 12, 14, 16], "path": [0, 2, 10, 11, 12, 14, 16], "straight": [0, 12, 14, 16], "chang": [0, 1, 3, 4, 7, 8, 9, 11, 12, 13], "border": [0, 1, 4, 10, 12, 13, 16], "undo": [0, 2, 4, 8, 11, 12, 14, 16], "redo": [0, 2, 4, 8, 11, 14, 16], "prefab": [0, 12, 13, 16], "collis": [0, 4, 6, 8, 9, 12, 13, 16], "type": [0, 1, 4, 5, 9, 11, 12, 13, 16], "paint": [0, 6, 8, 9, 11, 12, 14, 16], "event": [0, 1, 3, 8, 9, 12, 13, 14, 16], "ad": [0, 12, 13], "delet": [0, 3, 11, 14, 15, 16], "posit": [0, 6, 11, 12, 16], "object": [0, 2, 6, 9, 12, 13, 16], "clone": [0, 13, 16], "warp": [0, 9, 15, 16], "trigger": [0, 9, 12, 13, 16], "weather": [0, 5, 9, 10, 12, 13], "sign": [0, 16], "hidden": [0, 6, 12, 13, 16], "item": [0, 5, 10, 12, 13, 16], "secret": [0, 13, 16], "base": [0, 1, 6, 7, 11, 13, 16], "heal": [0, 1, 13, 16], "locat": [0, 1, 5, 6, 8, 10, 11, 12, 13, 16], "healspot": 0, "open": [0, 3, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16], "script": [0, 9, 10, 13, 16, 17], "button": [0, 3, 6, 7, 8, 9, 11, 12, 13, 15, 16], "ruler": [0, 16], "header": [0, 9, 10, 13, 16], "connect": [0, 4, 6, 8, 9, 12, 16], "dive": 0, "emerg": 0, "mirror": 0, "follow": [0, 6, 8, 12], "wild": [0, 9, 12, 13, 15, 16], "encount": [0, 12, 13, 16], "new": [0, 2, 3, 4, 6, 9, 10, 11, 12, 13, 14, 15, 16], "group": [0, 1, 6, 9, 13, 14, 16], "configur": [0, 6, 11, 12, 13, 16], "field": [0, 4, 5, 6, 11, 13, 16], "creat": [0, 4, 6, 7, 9, 11, 12, 13, 15, 16], "The": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13, 16], "background": [0, 5, 9, 12, 15], "imag": [0, 4, 6, 10, 12, 16], "tab": [0, 2, 3, 4, 6, 7, 9, 12, 16], "layout": [0, 1, 9, 10, 16], "entri": [0, 12, 16], "properti": [0, 2, 4, 5, 8, 9, 11, 12, 16], "menu": [0, 3, 7, 12, 13, 16], "palett": [0, 10, 11, 12, 16], "capabl": [0, 16], "write": [0, 8, 10, 16], "custom": [0, 1, 5, 6, 11, 13, 14, 16], "regist": 0, "action": [0, 6, 14, 16], "api": [0, 16], "project": [0, 1, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15, 16], "file": [0, 3, 4, 6, 8, 9, 11, 12, 13, 15, 16], "shortcut": [0, 2, 6, 8, 11, 12, 16], "set": [0, 4, 6, 7, 9, 11, 14, 15, 16], "changelog": 0, "unreleas": 0, "5": [0, 12], "1": [0, 2, 4, 8, 12, 13, 17], "0": [0, 2, 4, 11, 12, 13, 14], "2023": 0, "01": 0, "22": 0, "2022": 0, "10": [0, 12], "30": [0, 13], "4": [0, 2, 9, 12, 13], "2021": 0, "12": [0, 12], "26": 0, "2020": 0, "20": [0, 13], "3": [0, 2, 8, 12, 13], "07": 0, "17": 0, "06": 0, "27": 0, "2": [0, 2, 12, 13, 14, 17], "05": 0, "18": 0, "04": 0, "28": [0, 13], "03": 0, "2019": 0, "16": [0, 11, 12, 15], "02": 0, "2018": 0, "relat": [0, 10, 12], "porymap": [1, 3, 4, 6, 7, 9, 10, 11, 12, 14, 15, 16], "easi": [1, 4, 6], "just": [1, 2, 6, 7, 15], "click": [1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16], "altern": [1, 4], "ani": [1, 2, 4, 6, 9, 11, 12, 13, 15, 16], "sort": [1, 9, 13, 16], "mode": [1, 9, 14, 16], "right": [1, 2, 3, 4, 6, 7, 9, 11, 12, 14, 15, 16], "folder": [1, 8, 9, 16], "order": [1, 4, 7, 12, 13, 16], "add": [1, 3, 4, 7, 10, 11, 12, 13, 15, 16], "For": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16], "exampl": [1, 2, 3, 4, 5, 6, 10, 11, 12, 15, 16], "when": [1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15, 16], "pokemon": [1, 7, 9, 10, 12, 16], "center": [1, 4, 6, 9, 16], "from": [1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17], "exist": [1, 4, 6, 8, 11, 12, 16], "popup": [1, 5, 11], "displai": [1, 4, 6, 7, 8, 11, 12, 13, 15, 16], "some": [1, 2, 4, 6, 8, 9, 12, 13, 16], "your": [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14], "see": [1, 4, 6, 7, 8, 9, 12, 13, 16], "mai": [1, 4, 7, 13, 15, 16], "differ": [1, 2, 4, 6, 9, 11, 12, 15, 16], "depend": [1, 6, 12, 13, 16], "thei": [1, 3, 4, 5, 6, 9, 12, 14, 15, 16], "ar": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16], "name": [1, 4, 5, 6, 7, 9, 10, 11, 12, 15, 16], "thi": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 15, 16], "cannot": [1, 4, 5, 14, 16], "which": [1, 2, 3, 5, 6, 7, 9, 11, 12, 15, 16], "bele": 1, "width": [1, 11, 12, 16], "height": [1, 11, 12, 16], "block": [1, 2, 12, 16], "primari": [1, 6, 8, 10, 12, 13, 15, 16], "": [1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "secondari": [1, 6, 10, 12, 13, 15, 16], "whether": [1, 2, 5, 12, 13, 15, 16], "an": [1, 2, 3, 4, 6, 7, 11, 12, 15, 16], "indoor": 1, "outdoor": 1, "section": [1, 4, 5, 6, 9, 11], "fly": [1, 4], "To": [1, 3, 4, 6, 7, 9, 11, 12, 15], "show": [1, 5, 6, 8, 9, 12, 14, 15, 16], "hide": [1, 5, 12, 16], "enter": [1, 2, 4, 5, 9, 11, 12, 14], "allow": [1, 2, 4, 5, 6, 7, 8, 9, 12, 13, 15, 16], "run": [1, 5, 12, 13, 16], "player": [1, 2, 3, 4, 6, 9, 11, 14, 15, 16], "sprint": 1, "bike": [1, 5, 12, 13], "us": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17], "escap": [1, 5, 12, 13], "rope": [1, 5, 12, 13], "user": [1, 2, 6, 8, 10, 11, 12, 13, 15, 16], "floor": [1, 5, 12, 13, 16], "number": [1, 2, 4, 5, 7, 12, 13, 16], "associ": [1, 2, 4, 11, 15], "elev": [1, 2, 4, 12, 13], "second": [2, 8, 9, 13], "half": 2, "determin": [2, 4, 11, 13, 15], "walk": [2, 3, 4, 9], "surf": 2, "each": [2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 15, 16], "dure": [2, 4, 16], "gameplai": [2, 4, 9], "whenev": [2, 6, 12, 15], "need": [2, 3, 4, 5, 6, 11, 15, 16], "updat": [2, 3, 6, 12, 16], "appropri": 2, "typic": [2, 4], "first": [2, 4, 6, 7, 8, 9, 11, 12, 13, 16], "after": [2, 4, 6, 8, 12, 16], "finish": [2, 11], "flow": [2, 6], "veri": [2, 3, 4, 6, 12], "similar": [2, 3, 7], "Then": [2, 6, 7, 12], "onto": [2, 6, 9, 11, 12], "selector": [2, 6, 11, 16], "next": [2, 4, 7, 8, 9, 12, 13, 15, 16], "It": [2, 4, 6, 7, 8, 9, 12, 13, 16], "featur": [2, 3, 8, 9, 11, 16], "32": [2, 11], "total": [2, 7], "left": [2, 4, 6, 8, 9, 11, 12, 14, 15, 16], "column": 2, "through": [2, 3, 16], "These": [2, 3, 6, 7, 12, 15], "denot": 2, "white": [2, 4, 6], "text": [2, 4, 9, 12, 13, 15, 16], "impass": [2, 12], "red": [2, 7, 16], "transpar": [2, 12, 16], "slider": [2, 6, 11, 15, 16], "abov": [2, 4, 6, 8, 9, 11, 12, 15, 16], "control": [2, 4, 5, 8], "view": [2, 3, 4, 5, 6, 9, 11, 12, 14, 16], "unlik": 2, "onli": [2, 3, 4, 6, 7, 9, 10, 12, 15, 16], "one": [2, 3, 6, 7, 9, 11, 12, 16], "time": [2, 4, 6, 7, 8, 9, 12, 13, 15, 16], "A": [2, 3, 4, 6, 8, 11, 12, 13, 15, 16, 17], "either": [2, 6, 9, 12, 15], "also": [2, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16], "area": [2, 4, 6, 8, 9, 11, 12, 16], "like": [2, 4, 6, 9, 12, 15, 16], "would": [2, 10, 12, 16], "process": [2, 4], "nearli": 2, "ident": [2, 6], "same": [2, 4, 6, 8, 12, 14, 15, 16], "except": [2, 4], "histori": [2, 12, 14, 16], "includ": [2, 4, 6, 7, 9, 10, 11, 15, 16], "modif": 2, "too": [2, 16], "now": [2, 6, 7, 8, 12, 16], "we": [2, 4, 5, 6, 7, 8, 9, 12], "ll": [2, 4, 5, 7, 8, 12], "go": [2, 4, 5, 6, 9, 14], "over": [2, 4, 5, 6, 9, 16], "along": 2, "import": [2, 6, 12, 13, 16], "concept": 2, "row": [2, 16], "repres": [2, 7, 12], "why": 2, "most": [2, 8, 9, 11, 13, 16], "have": [2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16], "hexadecim": 2, "them": [2, 3, 4, 5, 6, 7, 12, 16], "d": [2, 4, 14, 16], "e": [2, 4, 6, 12, 14, 16], "f": 2, "special": [2, 4], "purpos": [2, 9], "how": [2, 4, 6, 8, 9, 12, 16], "game": [2, 4, 5, 6, 7, 8, 9, 11, 12, 16, 17], "level": [2, 7, 10, 16, 17], "els": [2, 4], "commonli": 2, "make": [2, 4, 6, 8, 11, 12, 15, 16], "sure": [2, 3, 8], "off": [2, 6, 12, 16], "top": [2, 3, 4, 11, 12, 15, 16], "side": [2, 3, 6, 8, 9, 15], "mountain": [2, 6], "current": [2, 4, 6, 7, 8, 9, 11, 12, 14, 15, 16], "try": [2, 12], "won": [2, 12], "let": [2, 4, 6, 7, 8, 9, 11, 12, 17], "direct": [2, 3, 4, 6, 16], "In": [2, 6, 7, 8, 12, 14], "below": [2, 4, 6, 7, 12, 16], "rout": [2, 3], "114": 2, "unabl": 2, "north": 2, "grass": [2, 8, 12, 15], "becaus": [2, 4, 9], "cliff": 2, "undertand": 2, "basic": [2, 6, 8, 9], "explor": 2, "transit": [2, 4], "move": [2, 3, 4, 5, 12, 14, 16], "between": [2, 3, 4, 9, 11, 12, 15, 16], "common": 2, "case": [2, 4], "stair": 2, "alwai": [2, 4, 16], "abl": [2, 4, 11, 12], "doesn": [2, 6, 12, 16], "count": [2, 15, 16], "particular": 2, "mean": [2, 3, 4, 12], "signpost": [2, 4], "interact": [2, 4, 9, 12, 16], "all": [2, 3, 4, 6, 7, 9, 11, 12, 14, 15, 16], "should": [2, 4, 6, 7, 8, 10, 11, 12, 13, 16], "gener": [2, 8, 10, 12, 14], "version": [2, 4, 5, 6, 8, 12, 16], "true": [2, 12], "hop": 2, "land": [2, 12], "multi": [2, 16], "bridg": 2, "rememb": [2, 12, 16], "previou": [2, 16], "maintain": [2, 10], "long": [2, 12, 16], "continu": [2, 6], "leav": 2, "he": 2, "ha": [2, 3, 4, 5, 9, 11, 12, 13, 14, 15, 16], "befor": [2, 6, 8, 12, 16], "wa": [2, 12, 13, 16], "here": [2, 12, 14, 15], "119": 2, "illustr": [2, 6], "abil": [2, 4, 12, 16], "south": 2, "under": [2, 11], "while": [2, 4, 6, 12, 14, 16], "being": [2, 8, 16], "east": [2, 3], "west": [2, 3], "togeth": [3, 4, 6, 12, 14], "so": [3, 4, 6, 8, 9, 12, 13, 15, 16], "seamlessli": 3, "offset": [3, 11, 16], "destin": [3, 4], "press": [3, 4, 6, 8, 9, 16], "plu": [3, 4], "vertic": [3, 12, 16], "horizont": [3, 12, 16], "easiest": 3, "drag": [3, 4, 6, 11, 14, 16], "desir": [3, 6, 9], "hm": [3, 5], "don": [3, 16], "simpli": [3, 4, 6, 9, 11, 15], "valu": [3, 4, 5, 6, 11, 12, 15, 16], "dropdown": [3, 6, 12, 15, 16], "extrem": 3, "checkbox": [3, 6, 16], "corner": [3, 12], "wai": [3, 4, 6, 12], "must": [3, 4, 6, 7, 8, 12, 15], "keep": [3, 5, 13, 16], "two": [3, 6, 9, 11, 15], "sync": [3, 16], "petalburg": [3, 8], "citi": [3, 8], "104": 3, "enabl": [3, 6, 12, 13, 16], "automat": [3, 4, 5, 12, 13, 15, 16], "both": [3, 6, 15, 16], "Be": 3, "save": [3, 6, 7, 8, 12, 14, 15, 16], "ctrl": [3, 4, 6, 8, 9, 11, 12, 14, 16], "sinc": [3, 8, 12, 15, 16], "doubl": [3, 4, 9, 11, 16], "bring": [4, 6, 7, 9, 11], "life": [4, 6], "npc": [4, 13], "more": [4, 6, 8, 9, 11, 12, 14, 15, 16], "dissect": 4, "visibl": [4, 6, 12, 16], "detail": [4, 6, 9, 11, 12, 16], "close": [4, 12, 16], "woman": 4, "pok\u00e9mon": [4, 6, 9, 16], "pink": 4, "around": [4, 6, 9, 11, 13, 16], "spinner": [4, 12, 15, 16], "multipl": [4, 6, 7, 11, 12, 14, 16], "hold": [4, 6, 14, 16], "anoth": [4, 6, 7, 9, 11, 16], "id": [4, 12, 13, 15, 16], "There": [4, 8, 11, 12, 13, 15], "function": [4, 8, 11, 16], "git": [4, 8], "green": [4, 7], "choos": [4, 6, 7, 8, 9, 12], "small": 4, "arrow": [4, 16], "duplic": [4, 14, 16], "x": [4, 6, 11, 12, 16], "y": [4, 6, 11, 12, 14, 16], "coordin": [4, 11, 12, 16], "known": 4, "z": [4, 6, 11, 14, 16], "explain": 4, "cover": [4, 9, 15], "non": [4, 11], "charact": [4, 16], "technic": [4, 12], "sprite": [4, 10, 16], "assign": [4, 7, 16], "dynam": 4, "blue": 4, "squar": [4, 11, 16], "n": [4, 6, 8, 14, 16], "rival": 4, "berri": 4, "tree": [4, 6, 16], "local": 4, "specifi": [4, 12, 16], "command": [4, 13, 14, 16], "applymov": 4, "movement": [4, 16], "normal": [4, 6, 12, 15], "radiu": [4, 6, 13], "involv": 4, "bound": [4, 16], "ensur": 4, "within": [4, 9, 14, 15], "rang": [4, 12], "its": [4, 6, 12, 15, 16], "origin": [4, 12, 16], "execut": [4, 12, 13], "flag": [4, 10, 16], "equal": 4, "invis": [4, 12], "trainer": [4, 10, 16], "trainer_type_norm": 4, "spot": 4, "line": [4, 6, 16], "sight": 4, "mani": [4, 8, 9, 11, 12, 14, 15, 16], "battl": [4, 5, 12], "global": [4, 10, 12, 13], "uniqu": [4, 11], "inherit": 4, "load": [4, 8, 9, 12, 13, 16], "adjac": [4, 12], "target": [4, 12], "doe": [4, 6, 8, 12], "graphic": [4, 5, 10, 16], "instead": [4, 12, 16], "exclus": [4, 5, 15], "pokefir": [4, 5, 6, 8, 11, 12, 13, 15, 16], "code": [4, 12, 15], "pokeemerald": [4, 6, 8, 10, 11, 12, 13, 16], "pokerubi": [4, 6, 8, 10, 12, 13, 16], "actual": [4, 12, 16], "read": [4, 8, 10, 11, 12, 13, 16], "other": [4, 6, 9, 11, 12, 13, 16, 17], "build": [4, 6, 8, 12], "howev": [4, 6, 12], "variabl": [4, 13], "onc": [4, 6, 12, 16], "never": 4, "again": [4, 6], "longer": [4, 16], "match": [4, 6, 16], "anyth": [4, 6], "AND": 4, "var": [4, 10], "specif": [4, 13, 16], "overworld": 4, "unavail": 4, "were": [4, 6, 16], "dummi": 4, "simpl": [4, 7], "thing": [4, 5, 6, 7, 8, 9], "front": [4, 16], "face": [4, 15, 16], "requir": [4, 5, 12, 13, 16], "certain": [4, 10, 12, 15, 16], "three": [4, 11], "bg": [4, 15], "pick": [4, 15], "up": [4, 6, 7, 8, 9, 11, 14, 16], "receiv": 4, "quantiti": [4, 13], "itemfind": [4, 13, 16], "check": [4, 6, 7, 9, 12, 16], "stand": [4, 15], "mark": [4, 12], "entranc": 4, "unfortun": 4, "hardcod": [4, 16], "engin": [4, 5, 13], "ssecretbaseentrancemetatil": 4, "src": [4, 10, 11], "secret_bas": [4, 10], "c": [4, 6, 10, 11, 14, 16], "do": [4, 6, 8, 9, 12], "where": [4, 6, 11, 12, 15, 16], "arriv": 4, "littl": 4, "respawn": [4, 13], "setwhiteoutrespawnwarpandhealernpc": 4, "heal_loc": [4, 10], "g": [4, 12, 14, 16], "insid": [4, 12], "pok\u00e9cent": 4, "default": [4, 6, 7, 9, 10, 11, 12, 13, 14, 16], "noth": [4, 12], "happen": [4, 12, 16], "inc": [4, 10, 13, 16], "extens": [4, 12, 16], "pori": [4, 10, 13, 16], "porycript": 4, "addition": [4, 6, 12, 16], "goto": 4, "prefer": [4, 14, 16], "appear": [4, 6, 9, 11, 12, 15, 16], "combo": [4, 13, 16], "box": [4, 7, 11, 12, 13, 15, 16], "contain": [4, 9, 12, 13, 15, 16], "directli": [4, 12], "found": [4, 8, 10, 15, 16], "extend": [4, 16], "few": [4, 6, 8, 9], "describ": [4, 7], "brief": 4, "descript": [4, 13], "anim": [4, 12, 16], "avail": [4, 6, 7, 8, 9, 11], "behav": [4, 12, 16], "standard": 4, "cursor": [4, 6, 11, 13, 14, 16], "draw": [4, 8, 11, 12, 14, 15, 16], "return": [4, 12], "give": [4, 6, 7, 9, 16], "access": [4, 12, 13, 16], "provid": [4, 6, 7, 8, 12, 15, 16], "conveni": [4, 6, 12, 15, 16], "measur": [4, 16], "distanc": [4, 16], "particularli": 4, "With": [4, 12], "activ": [4, 7, 12, 16], "mous": [4, 6, 11, 12, 16], "deactiv": 4, "lock": [4, 6, 16], "place": [4, 6, 8, 11, 12, 16], "unlock": 4, "collect": 5, "miscellan": [5, 12], "belong": 5, "mostli": 5, "self": 5, "explanatori": 5, "song": [5, 10, 12], "music": [5, 9, 16, 17], "plai": 5, "flash": [5, 12], "limit": [5, 12, 15, 16], "vision": 5, "expand": [5, 9, 16], "variou": [5, 6, 8, 9, 16], "rubi": 5, "shoe": 5, "map_type_indoor": 5, "scene": [5, 12], "dig": [5, 12, 13], "append": [5, 10], "neg": [5, 11, 12, 16], "prefix": [5, 12, 16], "b": [5, 6, 14], "basement": 5, "127": [5, 12], "rooftop": 5, "support": [5, 6, 8, 11, 12, 13, 14, 16], "addit": [5, 8, 12, 15], "note": [5, 10, 12], "take": [6, 7, 8, 9, 11, 12, 16], "laid": 6, "grid": [6, 12, 14, 16], "call": [6, 12, 16], "awar": 6, "easier": [6, 11, 15, 16], "toolbar": [6, 8], "surround": [6, 9], "toggl": [6, 12, 13, 14, 16], "zoom": [6, 11, 14, 16], "wheel": 6, "scroll": 6, "down": [6, 7, 8, 16], "By": [6, 9, 11], "indic": [6, 12, 15, 16], "outlin": [6, 12, 14, 16], "hover": [6, 13, 16], "disabl": [6, 7, 16], "icon": [6, 10, 12, 16], "rectangl": [6, 12, 13, 16], "v": [6, 11, 14], "pane": [6, 9, 11, 15, 16], "bottom": [6, 12, 15, 16], "preview": [6, 12], "exactli": 6, "than": [6, 12, 16], "entir": [6, 11, 12, 15, 16], "eyedropp": [6, 14, 15], "power": [6, 12], "even": [6, 12, 14], "copi": [6, 7, 15, 16], "gif": [6, 16], "demonstr": 6, "quick": 6, "method": [6, 16], "learn": [6, 8, 9], "bread": 6, "butter": 6, "bigger": 6, "portion": 6, "snap": 6, "simplifi": 6, "larg": [6, 16], "p": [6, 12, 14], "without": [6, 11, 12, 16], "work": [6, 8, 9, 15, 16], "think": [6, 8], "contigu": [6, 16], "pattern": [6, 12, 13], "middl": [6, 12, 14, 15, 16], "kei": [6, 14, 16], "rather": [6, 12, 16], "resiz": [6, 16], "though": [6, 16], "accomplish": 6, "wrap": 6, "perform": [6, 12, 16], "pathwai": 6, "pond": 6, "format": [6, 11, 12, 15, 16, 17], "help": [6, 15, 16], "3x3": 6, "temporarili": [6, 16], "regular": 6, "axi": 6, "conjunct": 6, "chain": 6, "releas": [6, 8, 16], "modifi": [6, 9, 11, 12, 15, 16], "dimens": [6, 11, 12, 16], "adjust": [6, 7, 15], "via": [6, 12, 13, 16], "size": [6, 11, 12, 13, 16], "use_custom_border_s": [6, 12, 13, 16], "cfg": [6, 10, 12, 13, 14, 16], "everi": [6, 11, 12, 15], "picker": [6, 16], "fix": 6, "mistak": [6, 11], "back": [6, 16], "prefabr": 6, "optim": 6, "workflow": [6, 8, 12], "defin": [6, 10, 11, 12, 15, 16], "pre": [6, 16], "built": [6, 16], "larger": [6, 9], "pok\u00e9": 6, "mart": 6, "partial": [6, 16], "prompt": [6, 13, 14, 16], "those": [6, 8, 12], "individu": [6, 12, 15, 16], "creation": 6, "design": 6, "whichev": 6, "As": [6, 16], "incompat": 6, "data": [6, 7, 8, 10, 11, 12, 13, 15, 16], "json": [6, 7, 10, 11, 13, 16], "project_root": [6, 13], "config": [6, 10, 12, 13, 16], "prefabs_filepath": [6, 13], "empti": [7, 8, 16], "screen": [7, 8, 13, 15, 16], "pictur": [7, 15, 16], "otherwis": [7, 10, 12], "popul": [7, 11, 12, 15], "given": [7, 12, 15, 16], "therefor": [7, 8], "want": [7, 10, 11, 12, 13], "pretti": 7, "straightforward": 7, "minimum": [7, 12, 16], "maximum": [7, 12, 16], "rate": 7, "speci": 7, "ui": [7, 16], "singl": [7, 9, 11, 12], "vanilla": 7, "alter": 7, "cave": 7, "sever": [7, 12, 13, 15], "reason": [7, 15], "might": [7, 12], "drop": [7, 16], "uniq": 7, "enforc": 7, "One": [7, 12], "possibl": [7, 12, 16], "implement": 7, "dai": [7, 12], "ratio": 7, "index": [7, 12, 15, 16], "manipul": [7, 12], "awai": 7, "slot": [7, 16], "chanc": 7, "headbutt_mon": 7, "our": [7, 8, 12], "four": 7, "accept": 7, "made": [7, 16], "disk": [7, 12], "until": 7, "cross": 8, "platform": [8, 13, 16], "gen": [8, 17], "pret": [8, 13, 14, 16], "decompil": [8, 16, 17], "Its": [8, 16], "download": 8, "mac": [8, 16], "linux": [8, 16], "sourc": [8, 15], "familiar": 8, "tradit": 8, "binari": [8, 11, 15], "rom": 8, "hack": [8, 15], "advanc": [8, 16, 17], "equival": 8, "shouldn": 8, "much": 8, "difficulti": 8, "usabl": 8, "improv": 8, "notabl": [8, 16], "highli": 8, "recommend": 8, "setup": 8, "respect": [8, 16], "instal": 8, "md": 8, "successfulli": [8, 12], "compil": 8, "launch": [8, 12, 13, 16], "greet": 8, "o": [8, 14], "dialog": [8, 9, 12, 14, 16], "pop": 8, "flower": 8, "panel": [8, 15, 16], "0x4": 8, "floweri": 8, "That": 8, "great": 8, "final": [8, 12], "result": 8, "nodep": 8, "ignor": [8, 16], "seem": 9, "daunt": 9, "briefli": 9, "part": [9, 16], "applic": [9, 13, 14, 16], "hierarch": 9, "situat": [9, 16], "switch": [9, 12, 15, 16], "patient": 9, "organ": 9, "collaps": [9, 16], "filter": [9, 16], "oper": [9, 12, 15, 16], "context": [9, 15], "quickli": 9, "summar": 9, "m": [9, 11, 14], "fullest": 9, "reli": 10, "integr": [10, 16], "probabl": [10, 12], "good": [10, 12], "idea": 10, "yourself": [10, 14], "unless": [10, 12], "filepath": [10, 11, 12, 13], "expect": 10, "overridden": 10, "overrid": 10, "tabl": [10, 12, 13, 15, 16], "begin": 10, "renam": [10, 16], "constant": [10, 11, 15, 16], "h": [10, 11, 15, 16], "stuff": 10, "constants_item": 10, "ye": [10, 12, 13], "data_map_fold": 10, "label": [10, 11, 12, 13, 16], "data_scripts_fold": 10, "event_script": 10, "data_event_script": 10, "end": [10, 16], "map_group": 10, "json_map_group": 10, "json_layout": 10, "bin": 10, "data_layouts_fold": 10, "tilesets_head": 10, "tilesets_graph": 10, "tilesets_metatil": 10, "tilesets_headers_asm": 10, "tilesets_graphics_asm": 10, "tilesets_metatiles_asm": 10, "data_tilesets_fold": 10, "wild_encount": 10, "json_wild_encount": 10, "object_ev": 10, "object_event_graphics_info_point": 10, "data_obj_event_gfx_point": 10, "object_event_graphics_info": [10, 16], "data_obj_event_gfx_info": 10, "object_event_pic_t": 10, "data_obj_event_pic_t": 10, "object_event_graph": 10, "data_obj_event_gfx": 10, "data_pokemon_gfx": 10, "data_heal_loc": 10, "region_map": [10, 11], "region_map_sect": [10, 11], "json_region_map_entri": 10, "porymap_config": 10, "json_region_porymap_cfg": 10, "constants_glob": 10, "object_event_templates_count": 10, "constants_map_group": 10, "oppon": 10, "constants_oppon": 10, "max": [10, 12, 16], "constants_flag": 10, "constants_var": 10, "constants_weath": 10, "constants_song": 10, "constants_heal_loc": 10, "constants_pokemon": 10, "min": [10, 12, 16], "map_typ": 10, "constants_map_typ": 10, "trainer_typ": [10, 16], "constants_trainer_typ": 10, "constants_secret_bas": 10, "event_object_mov": 10, "constants_obj_event_mov": 10, "event_object": 10, "constants_obj_ev": 10, "event_bg": 10, "constants_event_bg": 10, "constants_region_map_sect": 10, "metatile_label": [10, 15, 16], "constants_metatile_label": 10, "metatile_behavior": [10, 15], "constants_metatile_behavior": 10, "fieldmap": 10, "constants_fieldmap": 10, "initial_facing_t": 10, "ginitialmovementtypefacingdirect": 10, "pokemon_icon": 10, "pokemon_icon_t": 10, "gmonicont": 10, "tilemap": [11, 16, 17], "arrai": [11, 12], "keyboard": [11, 12, 14, 16], "suffici": [11, 12], "scratch": [11, 15], "explan": 11, "restrict": 11, "alia": 11, "distinguish": 11, "valid": [11, 16], "string": [11, 12, 16], "plain": [11, 16], "4bpp": 11, "8bpp": 11, "64": [11, 12], "128": [11, 12], "correspond": [11, 16], "rel": [11, 12], "root": [11, 13], "pal": [11, 15, 16], "uncheck": 11, "integ": [11, 16], "ok": [11, 12], "combobox": [11, 16], "notic": [11, 16], "unhappi": 11, "done": [11, 15], "flip": [11, 12, 16], "clear": [11, 12, 16], "rme": 11, "higlight": 11, "coupl": 11, "simultan": 11, "mapsec_non": 11, "swap": 11, "exchang": 11, "replac": [11, 16], "instanc": 11, "reset": [11, 14, 16], "span": 11, "head": 11, "store": [11, 13, 14, 16], "spinbox": 11, "javascript": [12, 16], "ecmascript": 12, "enhanc": 12, "fork": 12, "itself": 12, "endless": 12, "night": 12, "brush": 12, "detect": 12, "error": [12, 16], "diagonist": 12, "inform": [12, 16], "procedur": 12, "random": 12, "cumbersom": 12, "manual": [12, 13, 15], "patch": 12, "overwrit": [12, 14], "my_script": 12, "j": 12, "directori": [12, 16], "custom_script": [12, 13], "separ": 12, "comma": 12, "occur": [12, 16], "interest": 12, "onblockchang": [12, 16], "export": [12, 15, 16], "prevblock": 12, "newblock": 12, "logic": 12, "goe": 12, "setmetatileid": 12, "rest": 12, "randint": 12, "math": 12, "ceil": 12, "const": 12, "grasstil": 12, "0x8": 12, "0x9": 12, "0x10": 12, "0x11": 12, "indexof": 12, "metatileid": 12, "length": 12, "test": 12, "insert": 12, "nice": 12, "implicitli": 12, "demand": 12, "usual": 12, "applynighttint": 12, "appli": [12, 15, 16], "tint": 12, "onprojectopen": 12, "projectpath": 12, "registeract": [12, 16], "could": [12, 16], "overview": 12, "document": [12, 16], "argument": [12, 15, 16], "onprojectclos": 12, "onmapopen": 12, "mapnam": 12, "state": 12, "shape": 12, "rawvalu": 12, "onbordermetatilechang": 12, "prevmetatileid": 12, "newmetatileid": 12, "onblockhoverchang": 12, "onblockhoverclear": 12, "exit": [12, 16], "onmapres": [12, 16], "oldwidth": 12, "oldheight": 12, "newwidth": 12, "newheight": 12, "onborderres": 12, "onmapshift": 12, "xdelta": 12, "ydelta": 12, "ontilesetupd": 12, "tilesetnam": 12, "onmaintabchang": 12, "oldtab": 12, "newtab": 12, "bar": [12, 16], "previous": [12, 16], "newli": [12, 16], "onmapviewtabchang": 12, "onbordervisibilitytoggl": 12, "boolean": 12, "retriev": 12, "callabl": 12, "getblock": 12, "setblock": 12, "forceredraw": 12, "commitchang": 12, "passabl": 12, "forc": [12, 13], "refresh": 12, "redraw": 12, "expens": 12, "fals": 12, "consecut": 12, "commit": [12, 13, 16], "overload": 12, "raw": 12, "bit": [12, 15, 16], "9": 12, "11": 12, "15": [12, 15], "getmetatileid": 12, "getbordermetatileid": 12, "setbordermetatileid": 12, "getcollis": 12, "setcollis": 12, "getelev": 12, "setelev": 12, "setblocksfromselect": 12, "initi": [12, 16], "bucketfil": 12, "bucketfillfromselect": 12, "magicfil": 12, "magic": [12, 14, 16], "magicfillfromselect": 12, "getdimens": 12, "getwidth": 12, "getheight": 12, "getborderdimens": 12, "getborderwidth": 12, "getborderheight": 12, "setdimens": 12, "setwidth": 12, "setheight": 12, "setborderdimens": 12, "setborderwidth": 12, "setborderheight": 12, "delai": 12, "uncommit": 12, "getsong": 12, "setsong": 12, "getloc": 12, "setloc": 12, "getrequiresflash": 12, "setrequiresflash": 12, "getweath": 12, "setweath": 12, "gettyp": 12, "settyp": 12, "getbattlescen": 12, "setbattlescen": 12, "battlescen": 12, "getshowlocationnam": 12, "shown": 12, "setshowlocationnam": 12, "getallowrun": 12, "setallowrun": 12, "getallowbik": 12, "setallowbik": 12, "getallowescap": 12, "setallowescap": 12, "getfloornumb": 12, "setfloornumb": 12, "floornumb": 12, "inclus": 12, "render": [12, 16], "fake": 12, "color": [12, 13, 15, 16, 17], "affect": 12, "getprimarytileset": 12, "setprimarytileset": 12, "getsecondarytileset": 12, "setsecondarytileset": 12, "getnumprimarytilesettil": 12, "getnumsecondarytilesettil": 12, "getnumprimarytilesetmetatil": 12, "getnumsecondarytilesetmetatil": 12, "getprimarytilesetpalettepreview": 12, "paletteindex": 12, "element": [12, 16], "rgb": [12, 16], "setprimarytilesetpalettepreview": 12, "NOT": 12, "underli": [12, 16], "batch": 12, "getprimarytilesetpalettespreview": 12, "setprimarytilesetpalettespreview": 12, "getsecondarytilesetpalettepreview": 12, "setsecondarytilesetpalettepreview": 12, "getsecondarytilesetpalettespreview": 12, "setsecondarytilesetpalettespreview": 12, "getprimarytilesetpalett": 12, "setprimarytilesetpalett": 12, "perman": 12, "getsecondarytilesetpalett": 12, "setsecondarytilesetpalett": 12, "getmetatilelabel": 12, "setmetatilelabel": 12, "consist": [12, 16], "letter": 12, "underscor": 12, "warn": [12, 16], "getmetatilelayertyp": 12, "layer": [12, 13, 16], "setmetatilelayertyp": 12, "layertyp": 12, "getmetatileencountertyp": 12, "none": 12, "water": [12, 15], "setmetatileencountertyp": 12, "encountertyp": 12, "getmetatileterraintyp": 12, "terrain": [12, 13], "waterfal": 12, "setmetatileterraintyp": 12, "terraintyp": 12, "getmetatilebehavior": 12, "behavior": [12, 13, 16], "setmetatilebehavior": 12, "getmetatileattribut": 12, "attribut": [12, 13, 15, 16], "setmetatileattribut": 12, "getmetatiletil": 12, "tileindex": 12, "tileid": 12, "xflip": [12, 16], "yflip": [12, 16], "tilestart": 12, "tileend": 12, "last": [12, 16], "form": [12, 15], "setmetatiletil": 12, "remain": 12, "gettilepixel": 12, "pixel": [12, 15, 16], "8x8": [12, 15], "drawn": [12, 16], "specifii": 12, "higher": 12, "lower": [12, 16], "opac": [12, 13, 16], "rotat": [12, 16], "scale": [12, 13, 14, 16], "100": 12, "angl": 12, "eras": 12, "been": [12, 16], "yet": 12, "getvis": 12, "setvis": 12, "getopac": 12, "complet": 12, "opaqu": 12, "setopac": 12, "gethorizontalscal": 12, "getverticalscal": 12, "sethorizontalscal": 12, "setverticalscal": 12, "setscal": [12, 16], "hscale": [12, 16], "vscale": [12, 16], "getrot": 12, "setrot": 12, "degre": 12, "clockwis": 12, "counterclockwis": 12, "getx": 12, "geti": 12, "setx": 12, "seti": 12, "setclippingrect": 12, "rectangular": 12, "clip": [12, 16], "specifieid": 12, "caus": [12, 16], "word": 12, "content": 12, "outsid": [12, 15, 16], "edg": 12, "clearclippingrect": 12, "info": 12, "getposit": 12, "setposit": 12, "deltax": 12, "deltai": 12, "addtext": 12, "000000": 12, "html": 12, "tag": 12, "decor": 12, "underlin": 12, "rrggbb": 12, "aarrggbb": 12, "black": 12, "font": 12, "addrect": [12, 16], "bordercolor": [12, 16], "fillcolor": [12, 16], "round": [12, 16], "enclos": 12, "percent": 12, "ellipt": 12, "addpath": 12, "coord": 12, "pair": [12, 15], "odd": 12, "rule": [12, 15], "xcoord": 12, "ycoord": 12, "addimag": 12, "usecach": 12, "cach": 12, "slow": 12, "memori": 12, "createimag": [12, 16], "xoffset": [12, 16], "yoffset": [12, 16], "paletteid": 12, "settranspar": 12, "transform": 12, "full": [12, 16], "overwritten": 12, "addtileimag": 12, "addmetatileimag": 12, "getgridvis": 12, "setgridvis": 12, "getbordervis": 12, "setbordervis": 12, "getsmartpathsen": 12, "setsmartpathsen": 12, "getcustomscript": 12, "getmaintab": 12, "setmaintab": 12, "getmapviewtab": 12, "setmapviewtab": 12, "getmetatilelayerord": 12, "setmetatilelayerord": 12, "getmetatilelayeropac": 12, "setmetatilelayeropac": 12, "functionnam": 12, "actionnam": 12, "assum": [12, 16], "collid": 12, "keyword": 12, "settimeout": 12, "func": 12, "delaym": 12, "essenti": 12, "web": 12, "browser": 12, "nodej": 12, "interv": 12, "later": 12, "millisecond": 12, "wait": 12, "log": [12, 16], "messag": [12, 16], "debug": 12, "showmessag": 12, "informativetext": 12, "detailedtext": 12, "stop": 12, "smaller": 12, "behind": [12, 16], "showwarn": 12, "showerror": 12, "critic": 12, "showquest": 12, "question": 12, "No": 12, "getinputtext": 12, "titl": 12, "input": [12, 16], "cancel": [12, 14], "getinputnumb": 12, "decim": 12, "step": 12, "2147483648": 12, "2147483647": 12, "increment": 12, "getinputitem": 12, "own": 12, "getmapnam": 12, "gettilesetnam": 12, "getprimarytilesetnam": 12, "getsecondarytilesetnam": 12, "getmetatilebehaviornam": 12, "getsongnam": 12, "getlocationnam": 12, "getweathernam": 12, "getmaptypenam": 12, "getbattlescenenam": 12, "isprimarytileset": 12, "issecondarytileset": 12, "guarante": [12, 16], "reload": [12, 16], "max_primary_til": 12, "max_secondary_til": 12, "max_primary_metatil": 12, "max_secondary_metatil": 12, "layers_per_metatil": 12, "enable_triple_layer_metatil": [12, 13, 16], "tiles_per_metatil": 12, "8": 12, "base_game_vers": [12, 13, 16], "major": [12, 16], "minor": [12, 16], "app": 13, "appdata": [13, 14], "librari": [13, 14], "maco": [13, 14, 16], "gitignor": 13, "recent_project": 13, "reopen_on_launch": 13, "recent": [13, 16], "recent_map": 13, "pretty_cursor": 13, "crosshair": 13, "map_sort_ord": 13, "window_geometri": 13, "restor": [13, 14, 16], "window_st": 13, "map_splitter_st": 13, "main_splitter_st": 13, "collision_opac": 13, "50": 13, "overlai": [13, 16], "metatiles_zoom": 13, "show_player_view": 13, "gba": [13, 15], "show_cursor_til": 13, "monitor_fil": 13, "monitor": [13, 16], "tileset_checkerboard_fil": 13, "checkerboard": [13, 16], "theme": [13, 16], "widget": [13, 16], "text_editor_goto_lin": 13, "text_editor_open_directori": 13, "repo": [13, 16], "use_encounter_json": 13, "use_poryscript": [13, 16], "enable_event_weather_trigg": 13, "enable_event_secret_bas": 13, "enable_event_clone_object": 13, "enable_hidden_item_quant": 13, "enable_hidden_item_requires_itemfind": 13, "enable_heal_location_respawn_data": 13, "enable_floor_numb": 13, "enable_map_allow_flag": 13, "create_map_text_fil": 13, "tripl": [13, 16], "wiki": 13, "new_map_metatil": 13, "new_map_elev": 13, "new_map_border_metatil": 13, "468": 13, "469": 13, "476": 13, "477": 13, "21": 13, "29": 13, "2x2": 13, "default_primary_tileset": 13, "gtileset_gener": 13, "default_secondary_tileset": 13, "gtileset_petalburg": 13, "gtileset_pallettown": 13, "prefabs_import_prompt": 13, "track": 13, "tilesets_have_callback": 13, "callback": [13, 16], "tilesets_have_is_compress": 13, "iscompress": 13, "metatile_attributes_s": 13, "byte": 13, "metatile_behavior_mask": 13, "0xff": 13, "0x1ff": 13, "mask": 13, "metatile_encounter_type_mask": 13, "0x0": 13, "0x7000000": 13, "metatile_layer_type_mask": 13, "0xf000": 13, "0x60000000": 13, "metatile_terrain_type_mask": 13, "0x3e00": 13, "per": [14, 16], "alreadi": 14, "old": [14, 16], "refer": 14, "comprehens": [14, 16], "toolbutton": [14, 15], "del": [14, 16], "combin": 15, "split": 15, "varieti": 15, "ic": 15, "tall": 15, "effect": [15, 16], "categori": 15, "attempt": [15, 16], "scenario": [15, 16], "referenc": 15, "metatile_id": [], "macro": [], "plain_grass": [], "png": [15, 16], "convert": [15, 16], "bvd": [15, 16], "lot": 15, "makefil": 15, "graphics_file_rul": 15, "mk": 15, "remov": [15, 16], "num_til": 15, "altogeth": 15, "unus": [15, 16], "usag": 15, "across": 15, "output": 15, "At": [15, 16], "depth": [15, 16], "24": 15, "hardwar": 15, "realist": 15, "hex": [15, 16], "jasc": [15, 16], "adob": 15, "pro": 15, "pe": 15, "somewhat": 16, "adher": 16, "semant": 16, "bump": 16, "properli": 16, "date": 16, "improperli": 16, "reorgan": 16, "turn": 16, "preserv": 16, "slightli": 16, "favor": 16, "crash": 16, "advancemap": 16, "resolv": 16, "bug": 16, "wrong": 16, "immedi": 16, "reflect": 16, "past": 16, "unsav": 16, "proper": 16, "484": 16, "treat": 16, "mapjson": 16, "1755": 16, "map_non": 16, "map_dynam": 16, "overhaul": 16, "signific": 16, "1651": 16, "500": 16, "842": 16, "util": 16, "accordingli": 16, "460": 16, "addfilledrect": 16, "ellips": 16, "cut": 16, "clipboard": 16, "inanim": 16, "frame": 16, "accur": 16, "pars": 16, "correctli": 16, "struct": 16, "written": 16, "amount": 16, "reduc": 16, "persist": 16, "spawn_": 16, "heal_location_": 16, "interchang": 16, "arbitrarili": 16, "independ": 16, "mouseov": 16, "unnecessari": 16, "ones": 16, "incorrect": 16, "lose": 16, "autocomplet": 16, "disappear": 16, "space": 16, "reselect": 16, "unexpect": 16, "invalid": 16, "silenc": 16, "rais": 16, "reactiv": 16, "highlight": 16, "respond": 16, "wsl": 16, "ubuntu": 16, "home": 16, "timelaps": 16, "60": 16, "7": 16, "compat": 16, "qt6": 16, "evalu": 16, "becom": 16, "huge": 16, "diff": 16, "toggld": 16, "undoabl": 16, "prevent": 16, "290": 16, "coorespond": 16, "statu": 16, "fit": 16, "resolut": 16, "focu": 16, "whose": 16, "placehold": 16, "reorder": 16, "_": 16, "templat": 16, "taken": 16, "fall": 16, "wasn": 16, "better": 16, "port": 16, "watch": 16, "unknown": 16, "symbol": 16, "express": 16, "frlg": 16, "92": 16, "share": 16, "disallow": 16, "issu": 16, "1010": 16, "776": 16, "kanto": 16, "fan": 16, "rejoic": 16, "stitch": 16, "upstream": 16, "jump": 16, "smooth": 16, "boundari": 16, "did": 16, "regress": 16, "corrupt": 16, "underw": 16, "pr": 16, "pull": 16, "910": 16, "768": 16, "poryscript": [16, 17], "mimic": 16, "extra": 16, "junk": 16, "grow": 16, "session": 16, "beyond": 16, "accomod": 16, "explicitli": 16, "introduc": 16, "cdae0c1444bed98e652c87dc3e3edcecacfef8b": 16, "0e8ccfc4fd3544001f4c25fafd401f7558bdefba": 16, "adb0a444577b59eb02788c782a3d04bc285be0ba": 16, "c73de8bed752ca538d90cfc93c4a9e8c7965f8c9": 16, "dark": 16, "ad365a35c1536740cbcbc10bee66e5dd908c39e7": 16, "c68ba9f4e8e260f2e3389eccd15f6ee5f4bdcd3": 16, "etc": 16, "weren": 16, "offici": 16, "websit": 16, "io": 16, "stai": 16, "bulk": 16, "sensibl": 16, "wouldn": 16, "resili": 16, "report": 16, "var_valu": 16, "trainer_sight_or_berry_tree_id": 16, "interpret": 16, "82abc164dc9f6a74fdf0c535cc1621b7ed05318b": 16, "a0ba1b7c6353f7e4f3066025514c05b323a0123d": 16, "tpl": 16, "gpl": 16, "act": 16, "seen": 16, "multilin": 16, "comment": 16, "accord": 16, "still": 16, "auto": 16, "despit": 16, "shrink": 16, "handl": 16, "due": 16, "a1ea3b5e394bc115ba9b86348c161094a00dcca7": 16, "hous": 16, "hit": 16, "system": 16, "registri": 16, "iter": 16, "sometim": [15, 16], "startup": 16, "map_groups_count": 16, "layouts_t": 16, "polish": 17, "pokecryst": 17, "poker": 17, "disassembli": 17, "high": 17, "languag": 17, "meant": 17, "vg": 17, "studio": 17, "program": 17, "listen": 17, "popular": 17, "video": 17, "boi": 17, "incorrectli": 16, "grayscal": 16, "registertoggleact": [12, 16], "present": 12, "metatile_general_plain_grass": 15, "secretbas": 15, "metatile_secretbase_pc": 15, "0x220": 15, "grai": 15, "calcul": 16, "fail": 16, "null": 16, "unpredict": 16, "retain": 16, "someclass": [], "sdf": [], "foo": [], "paramet": [], "xxx": [], "int": []}, "objects": {"constants": [[12, 0, 1, "", "base_game_version"], [12, 0, 1, "", "layers_per_metatile"], [12, 0, 1, "", "max_primary_metatiles"], [12, 0, 1, "", "max_primary_tiles"], [12, 0, 1, "", "max_secondary_metatiles"], [12, 0, 1, "", "max_secondary_tiles"], [12, 0, 1, "", "tiles_per_metatile"]], "constants.version": [[12, 0, 1, "", "major"], [12, 0, 1, "", "minor"], [12, 0, 1, "", "patch"]], "map": [[12, 1, 1, "", "bucketFill"], [12, 1, 1, "", "bucketFillFromSelection"], [12, 1, 1, "", "commit"], [12, 1, 1, "", "getAllowBiking"], [12, 1, 1, "", "getAllowEscaping"], [12, 1, 1, "", "getAllowRunning"], [12, 1, 1, "", "getBattleScene"], [12, 1, 1, "", "getBlock"], [12, 1, 1, "", "getBorderDimensions"], [12, 1, 1, "", "getBorderHeight"], [12, 1, 1, "", "getBorderMetatileId"], [12, 1, 1, "", "getBorderWidth"], [12, 1, 1, "", "getCollision"], [12, 1, 1, "", "getDimensions"], [12, 1, 1, "", "getElevation"], [12, 1, 1, "", "getFloorNumber"], [12, 1, 1, "", "getHeight"], [12, 1, 1, "", "getLocation"], [12, 1, 1, "", "getMetatileAttributes"], [12, 1, 1, "", "getMetatileBehavior"], [12, 1, 1, "", "getMetatileEncounterType"], [12, 1, 1, "", "getMetatileId"], [12, 1, 1, "", "getMetatileLabel"], [12, 1, 1, "", "getMetatileLayerType"], [12, 1, 1, "", "getMetatileTerrainType"], [12, 1, 1, "", "getMetatileTile"], [12, 1, 1, "", "getMetatileTiles"], [12, 1, 1, "", "getNumPrimaryTilesetMetatiles"], [12, 1, 1, "", "getNumPrimaryTilesetTiles"], [12, 1, 1, "", "getNumSecondaryTilesetMetatiles"], [12, 1, 1, "", "getNumSecondaryTilesetTiles"], [12, 1, 1, "", "getPrimaryTileset"], [12, 1, 1, "", "getPrimaryTilesetPalette"], [12, 1, 1, "", "getPrimaryTilesetPalettePreview"], [12, 1, 1, "", "getPrimaryTilesetPalettes"], [12, 1, 1, "", "getPrimaryTilesetPalettesPreview"], [12, 1, 1, "", "getRequiresFlash"], [12, 1, 1, "", "getSecondaryTileset"], [12, 1, 1, "", "getSecondaryTilesetPalette"], [12, 1, 1, "", "getSecondaryTilesetPalettePreview"], [12, 1, 1, "", "getSecondaryTilesetPalettes"], [12, 1, 1, "", "getSecondaryTilesetPalettesPreview"], [12, 1, 1, "", "getShowLocationName"], [12, 1, 1, "", "getSong"], [12, 1, 1, "", "getTilePixels"], [12, 1, 1, "", "getType"], [12, 1, 1, "", "getWeather"], [12, 1, 1, "", "getWidth"], [12, 1, 1, "", "magicFill"], [12, 1, 1, "", "magicFillFromSelection"], [12, 1, 1, "", "redraw"], [12, 1, 1, "", "setAllowBiking"], [12, 1, 1, "", "setAllowEscaping"], [12, 1, 1, "", "setAllowRunning"], [12, 1, 1, "", "setBattleScene"], [12, 1, 1, "id0", "setBlock"], [12, 1, 1, "", "setBlocksFromSelection"], [12, 1, 1, "", "setBorderDimensions"], [12, 1, 1, "", "setBorderHeight"], [12, 1, 1, "", "setBorderMetatileId"], [12, 1, 1, "", "setBorderWidth"], [12, 1, 1, "", "setCollision"], [12, 1, 1, "", "setDimensions"], [12, 1, 1, "", "setElevation"], [12, 1, 1, "", "setFloorNumber"], [12, 1, 1, "", "setHeight"], [12, 1, 1, "", "setLocation"], [12, 1, 1, "", "setMetatileAttributes"], [12, 1, 1, "", "setMetatileBehavior"], [12, 1, 1, "", "setMetatileEncounterType"], [12, 1, 1, "", "setMetatileId"], [12, 1, 1, "", "setMetatileLabel"], [12, 1, 1, "", "setMetatileLayerType"], [12, 1, 1, "", "setMetatileTerrainType"], [12, 1, 1, "id1", "setMetatileTile"], [12, 1, 1, "id2", "setMetatileTiles"], [12, 1, 1, "", "setPrimaryTileset"], [12, 1, 1, "", "setPrimaryTilesetPalette"], [12, 1, 1, "", "setPrimaryTilesetPalettePreview"], [12, 1, 1, "", "setPrimaryTilesetPalettes"], [12, 1, 1, "", "setPrimaryTilesetPalettesPreview"], [12, 1, 1, "", "setRequiresFlash"], [12, 1, 1, "", "setSecondaryTileset"], [12, 1, 1, "", "setSecondaryTilesetPalette"], [12, 1, 1, "", "setSecondaryTilesetPalettePreview"], [12, 1, 1, "", "setSecondaryTilesetPalettes"], [12, 1, 1, "", "setSecondaryTilesetPalettesPreview"], [12, 1, 1, "", "setShowLocationName"], [12, 1, 1, "", "setSong"], [12, 1, 1, "", "setType"], [12, 1, 1, "", "setWeather"], [12, 1, 1, "", "setWidth"], [12, 1, 1, "", "shift"]], "": [[12, 1, 1, "", "onBlockChanged"], [12, 1, 1, "", "onBlockHoverChanged"], [12, 1, 1, "", "onBlockHoverCleared"], [12, 1, 1, "", "onBorderMetatileChanged"], [12, 1, 1, "", "onBorderResized"], [12, 1, 1, "", "onBorderVisibilityToggled"], [12, 1, 1, "", "onMainTabChanged"], [12, 1, 1, "", "onMapOpened"], [12, 1, 1, "", "onMapResized"], [12, 1, 1, "", "onMapShifted"], [12, 1, 1, "", "onMapViewTabChanged"], [12, 1, 1, "", "onProjectClosed"], [12, 1, 1, "", "onProjectOpened"], [12, 1, 1, "", "onTilesetUpdated"]], "overlay": [[12, 1, 1, "", "addImage"], [12, 1, 1, "", "addMetatileImage"], [12, 1, 1, "id19", "addPath"], [12, 1, 1, "", "addRect"], [12, 1, 1, "", "addText"], [12, 1, 1, "id21", "addTileImage"], [12, 1, 1, "id3", "clear"], [12, 1, 1, "id16", "clearClippingRect"], [12, 1, 1, "", "createImage"], [12, 1, 1, "", "getHorizontalScale"], [12, 1, 1, "", "getOpacity"], [12, 1, 1, "", "getPosition"], [12, 1, 1, "", "getRotation"], [12, 1, 1, "", "getVerticalScale"], [12, 1, 1, "", "getVisibility"], [12, 1, 1, "", "getX"], [12, 1, 1, "", "getY"], [12, 1, 1, "id4", "hide"], [12, 1, 1, "id18", "move"], [12, 1, 1, "id12", "rotate"], [12, 1, 1, "id15", "setClippingRect"], [12, 1, 1, "id8", "setHorizontalScale"], [12, 1, 1, "id7", "setOpacity"], [12, 1, 1, "id17", "setPosition"], [12, 1, 1, "id11", "setRotation"], [12, 1, 1, "id10", "setScale"], [12, 1, 1, "id9", "setVerticalScale"], [12, 1, 1, "id6", "setVisibility"], [12, 1, 1, "id13", "setX"], [12, 1, 1, "id14", "setY"], [12, 1, 1, "id5", "show"]], "utility": [[12, 1, 1, "", "error"], [12, 1, 1, "", "getBattleSceneNames"], [12, 1, 1, "", "getBorderVisibility"], [12, 1, 1, "", "getCustomScripts"], [12, 1, 1, "", "getGridVisibility"], [12, 1, 1, "", "getInputItem"], [12, 1, 1, "", "getInputNumber"], [12, 1, 1, "", "getInputText"], [12, 1, 1, "", "getLocationNames"], [12, 1, 1, "", "getMainTab"], [12, 1, 1, "", "getMapNames"], [12, 1, 1, "", "getMapTypeNames"], [12, 1, 1, "", "getMapViewTab"], [12, 1, 1, "", "getMetatileBehaviorNames"], [12, 1, 1, "", "getMetatileLayerOpacity"], [12, 1, 1, "", "getMetatileLayerOrder"], [12, 1, 1, "", "getPrimaryTilesetNames"], [12, 1, 1, "", "getSecondaryTilesetNames"], [12, 1, 1, "", "getSmartPathsEnabled"], [12, 1, 1, "", "getSongNames"], [12, 1, 1, "", "getTilesetNames"], [12, 1, 1, "", "getWeatherNames"], [12, 1, 1, "", "isPrimaryTileset"], [12, 1, 1, "", "isSecondaryTileset"], [12, 1, 1, "", "log"], [12, 1, 1, "", "registerAction"], [12, 1, 1, "", "registerToggleAction"], [12, 1, 1, "", "setBorderVisibility"], [12, 1, 1, "", "setGridVisibility"], [12, 1, 1, "", "setMainTab"], [12, 1, 1, "", "setMapViewTab"], [12, 1, 1, "", "setMetatileLayerOpacity"], [12, 1, 1, "", "setMetatileLayerOrder"], [12, 1, 1, "", "setSmartPathsEnabled"], [12, 1, 1, "", "setTimeout"], [12, 1, 1, "", "showError"], [12, 1, 1, "", "showMessage"], [12, 1, 1, "", "showQuestion"], [12, 1, 1, "", "showWarning"], [12, 1, 1, "", "warn"]]}, "objtypes": {"0": "js:attribute", "1": "js:function"}, "objnames": {"0": ["js", "attribute", "JavaScript attribute"], "1": ["js", "function", "JavaScript function"]}, "titleterms": {"porymap": [0, 8, 13], "document": 0, "user": 0, "manual": 0, "refer": 0, "creat": 1, "new": [1, 7], "map": [1, 2, 3, 4, 5, 6, 9, 11, 12, 14, 15], "option": [1, 6], "edit": [2, 3, 4, 5, 6, 7, 12], "collis": 2, "select": [2, 6], "type": [2, 15], "paint": 2, "connect": 3, "dive": 3, "emerg": 3, "warp": [3, 4], "mirror": 3, "follow": 3, "event": 4, "ad": [4, 7, 16], "delet": 4, "posit": 4, "object": 4, "clone": 4, "trigger": 4, "weather": 4, "sign": 4, "hidden": 4, "item": 4, "secret": 4, "base": 4, "heal": 4, "locat": 4, "healspot": 4, "open": 4, "script": [4, 12], "tool": [4, 6, 15], "button": 4, "ruler": 4, "header": [5, 12], "tile": [6, 15], "visual": 6, "metatil": [6, 15], "pencil": 6, "pointer": 6, "bucket": 6, "fill": 6, "shift": 6, "smart": 6, "path": 6, "straight": 6, "chang": [6, 15, 16], "border": 6, "tileset": [6, 9, 12, 14, 15], "undo": 6, "redo": 6, "prefab": 6, "wild": 7, "encount": [7, 15], "group": 7, "configur": 7, "field": 7, "introduct": 8, "about": 8, "get": 8, "start": 8, "navig": 9, "list": 9, "main": [9, 14], "window": [9, 14], "editor": [9, 11, 14, 15], "region": [9, 11, 14], "project": [10, 17], "file": 10, "The": [11, 15], "background": 11, "imag": [11, 15], "tab": 11, "layout": 11, "entri": 11, "capabl": 12, "write": 12, "custom": 12, "regist": 12, "action": 12, "api": 12, "callback": 12, "function": 12, "overlai": 12, "set": [12, 13], "util": 12, "constant": 12, "shortcut": 14, "properti": 15, "layer": 15, "behavior": 15, "terrain": 15, "label": 15, "menu": 15, "import": 15, "from": 15, "advanc": 15, "1": [15, 16], "92": 15, "number": 15, "other": 15, "palett": 15, "changelog": 16, "unreleas": 16, "5": 16, "0": 16, "2023": 16, "01": 16, "22": 16, "fix": 16, "2022": 16, "10": 16, "30": 16, "break": 16, "4": 16, "2021": 16, "12": 16, "26": 16, "2020": 16, "20": 16, "3": 16, "07": 16, "17": 16, "06": 16, "27": 16, "2": 16, "05": 16, "18": 16, "04": 16, "28": 16, "03": 16, "2019": 16, "16": 16, "02": 16, "2018": 16, "relat": 17}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"Porymap Documentation": [[0, "porymap-documentation"]], "User Manual": [[0, null]], "Reference": [[0, null]], "Creating New Maps": [[1, "creating-new-maps"]], "New Map Options": [[1, "new-map-options"]], "Editing Map Collisions": [[2, "editing-map-collisions"]], "Selecting Collision Types": [[2, "selecting-collision-types"]], "Painting Collisions": [[2, "painting-collisions"]], "Collision Types": [[2, "collision-types"]], "Editing Map Connections": [[3, "editing-map-connections"]], "Dive & Emerge Warps": [[3, "dive-emerge-warps"]], "Mirror Connections": [[3, "mirror-connections"]], "Follow Connections": [[3, "follow-connections"]], "Editing Map Events": [[4, "editing-map-events"]], "Adding & Deleting Events": [[4, "adding-deleting-events"]], "Event Positions": [[4, "event-positions"]], "Object Events": [[4, "object-events"]], "Clone Object Events": [[4, "clone-object-events"]], "Warp Events": [[4, "warp-events"]], "Trigger Events": [[4, "trigger-events"]], "Weather Trigger Events": [[4, "weather-trigger-events"]], "Sign Event": [[4, "sign-event"]], "Hidden Item Event": [[4, "hidden-item-event"]], "Secret Base Event": [[4, "secret-base-event"]], "Heal Location / Healspots": [[4, "heal-location-healspots"]], "Open Map Scripts": [[4, "open-map-scripts"]], "Tool Buttons": [[4, "tool-buttons"]], "Ruler Tool": [[4, "ruler-tool"]], "Editing Map Headers": [[5, "editing-map-headers"]], "Editing Map Tiles": [[6, "editing-map-tiles"]], "Visual Options": [[6, "visual-options"]], "Selecting Metatiles": [[6, "selecting-metatiles"]], "Pencil Tool": [[6, "pencil-tool"]], "Pointer Tool": [[6, "pointer-tool"]], "Bucket Fill Tool": [[6, "bucket-fill-tool"]], "Map Shift Tool": [[6, "map-shift-tool"]], "Smart Paths": [[6, "smart-paths"]], "Straight Paths": [[6, "straight-paths"]], "Change Map Border": [[6, "change-map-border"]], "Change Map Tilesets": [[6, "change-map-tilesets"]], "Undo & Redo": [[6, "undo-redo"]], "Prefabs": [[6, "prefabs"]], "Editing Wild Encounters": [[7, "editing-wild-encounters"]], "Adding New Encounter Groups": [[7, "adding-new-encounter-groups"]], "Configuring the Wild Encounter Fields": [[7, "configuring-the-wild-encounter-fields"]], "Introduction": [[8, "introduction"]], "About Porymap": [[8, "about-porymap"]], "Getting Started": [[8, "getting-started"]], "Navigation": [[9, "navigation"]], "Map List": [[9, "map-list"]], "Main Window": [[9, "main-window"], [14, "main-window"]], "Tileset Editor": [[9, "tileset-editor"], [14, "tileset-editor"]], "Region Map Editor": [[9, "region-map-editor"], [14, "region-map-editor"]], "Project Files": [[10, "project-files"]], "The Region Map Editor": [[11, "the-region-map-editor"]], "Background Image Tab": [[11, "background-image-tab"]], "Map Layout Tab": [[11, "map-layout-tab"]], "Map Entries Tab": [[11, "map-entries-tab"]], "Scripting Capabilities": [[12, "scripting-capabilities"]], "Writing a Custom Script": [[12, "writing-a-custom-script"]], "Registering Script Actions": [[12, "registering-script-actions"]], "Scripting API": [[12, "scripting-api"]], "Callbacks": [[12, "callbacks"]], "Functions": [[12, "functions"]], "Map Editing Functions": [[12, "map-editing-functions"]], "Map Header Editing Functions": [[12, "map-header-editing-functions"]], "Tileset Functions": [[12, "tileset-functions"]], "Overlay Functions": [[12, "overlay-functions"]], "Settings Functions": [[12, "settings-functions"]], "Utility Functions": [[12, "utility-functions"]], "Constants": [[12, "constants"]], "Porymap Settings": [[13, "porymap-settings"]], "Shortcuts": [[14, "shortcuts"]], "The Tileset Editor": [[15, "the-tileset-editor"]], "Metatile Properties": [[15, "metatile-properties"]], "Layer Type": [[15, "layer-type"]], "Metatile Behavior": [[15, "metatile-behavior"]], "Encounter Type": [[15, "encounter-type"]], "Terrain Type": [[15, "terrain-type"]], "Metatile Label": [[15, "metatile-label"]], "Tools Menu": [[15, "tools-menu"]], "Import Tiles Image\u2026": [[15, "import-tiles-image"]], "Import Metatiles from Advance Map 1.92\u2026": [[15, "import-metatiles-from-advance-map-1-92"]], "Change Number of Metatiles": [[15, "change-number-of-metatiles"]], "Other Tools": [[15, "other-tools"]], "Palette Editor": [[15, "palette-editor"]], "Changelog": [[16, "changelog"]], "Unreleased": [[16, "unreleased"]], "Changed": [[16, "changed"], [16, "id2"], [16, "id6"], [16, "id10"], [16, "id14"], [16, "id18"], [16, "id22"], [16, "id26"], [16, "id30"], [16, "id34"], [16, "id39"], [16, "id46"], [16, "id51"], [16, "id55"], [16, "id63"], [16, "id68"]], "Fixed": [[16, "fixed"], [16, "id3"], [16, "id7"], [16, "id11"], [16, "id15"], [16, "id19"], [16, "id23"], [16, "id27"], [16, "id31"], [16, "id35"], [16, "id40"], [16, "id42"], [16, "id47"], [16, "id52"], [16, "id56"], [16, "id59"], [16, "id64"], [16, "id69"]], "5.1.1 - 2023-02-20": [[16, "id1"]], "Added": [[16, "added"], [16, "id5"], [16, "id9"], [16, "id13"], [16, "id17"], [16, "id21"], [16, "id25"], [16, "id29"], [16, "id33"], [16, "id38"], [16, "id45"], [16, "id50"], [16, "id54"], [16, "id58"], [16, "id62"], [16, "id67"]], "5.1.0 - 2023-01-22": [[16, "id4"]], "5.0.0 - 2022-10-30": [[16, "id8"]], "Breaking Changes": [[16, "breaking-changes"], [16, "id37"], [16, "id44"], [16, "id49"], [16, "id61"], [16, "id66"]], "4.5.0 - 2021-12-26": [[16, "id12"]], "4.4.0 - 2020-12-20": [[16, "id16"]], "4.3.1 - 2020-07-17": [[16, "id20"]], "4.3.0 - 2020-06-27": [[16, "id24"]], "4.2.0 - 2020-06-06": [[16, "id28"]], "4.1.0 - 2020-05-18": [[16, "id32"]], "4.0.0 - 2020-04-28": [[16, "id36"]], "3.0.1 - 2020-03-04": [[16, "id41"]], "3.0.0 - 2020-03-04": [[16, "id43"]], "2.0.0 - 2019-10-16": [[16, "id48"]], "1.2.2 - 2019-05-16": [[16, "id53"]], "1.2.1 - 2019-02-16": [[16, "id57"]], "1.2.0 - 2019-02-04": [[16, "id60"]], "1.1.0 - 2018-12-27": [[16, "id65"]], "1.0.0 - 2018-10-26": [[16, "id70"]], "Related Projects": [[17, "related-projects"]]}, "indexentries": {"constants.base_game_version (constants attribute)": [[12, "constants.base_game_version"]], "constants.layers_per_metatile (constants attribute)": [[12, "constants.layers_per_metatile"]], "constants.max_primary_metatiles (constants attribute)": [[12, "constants.max_primary_metatiles"]], "constants.max_primary_tiles (constants attribute)": [[12, "constants.max_primary_tiles"]], "constants.max_secondary_metatiles (constants attribute)": [[12, "constants.max_secondary_metatiles"]], "constants.max_secondary_tiles (constants attribute)": [[12, "constants.max_secondary_tiles"]], "constants.tiles_per_metatile (constants attribute)": [[12, "constants.tiles_per_metatile"]], "constants.version.major (constants.version attribute)": [[12, "constants.version.major"]], "constants.version.minor (constants.version attribute)": [[12, "constants.version.minor"]], "constants.version.patch (constants.version attribute)": [[12, "constants.version.patch"]], "map.bucketfill() (map method)": [[12, "map.bucketFill"]], "map.bucketfillfromselection() (map method)": [[12, "map.bucketFillFromSelection"]], "map.commit() (map method)": [[12, "map.commit"]], "map.getallowbiking() (map method)": [[12, "map.getAllowBiking"]], "map.getallowescaping() (map method)": [[12, "map.getAllowEscaping"]], "map.getallowrunning() (map method)": [[12, "map.getAllowRunning"]], "map.getbattlescene() (map method)": [[12, "map.getBattleScene"]], "map.getblock() (map method)": [[12, "map.getBlock"]], "map.getborderdimensions() (map method)": [[12, "map.getBorderDimensions"]], "map.getborderheight() (map method)": [[12, "map.getBorderHeight"]], "map.getbordermetatileid() (map method)": [[12, "map.getBorderMetatileId"]], "map.getborderwidth() (map method)": [[12, "map.getBorderWidth"]], "map.getcollision() (map method)": [[12, "map.getCollision"]], "map.getdimensions() (map method)": [[12, "map.getDimensions"]], "map.getelevation() (map method)": [[12, "map.getElevation"]], "map.getfloornumber() (map method)": [[12, "map.getFloorNumber"]], "map.getheight() (map method)": [[12, "map.getHeight"]], "map.getlocation() (map method)": [[12, "map.getLocation"]], "map.getmetatileattributes() (map method)": [[12, "map.getMetatileAttributes"]], "map.getmetatilebehavior() (map method)": [[12, "map.getMetatileBehavior"]], "map.getmetatileencountertype() (map method)": [[12, "map.getMetatileEncounterType"]], "map.getmetatileid() (map method)": [[12, "map.getMetatileId"]], "map.getmetatilelabel() (map method)": [[12, "map.getMetatileLabel"]], "map.getmetatilelayertype() (map method)": [[12, "map.getMetatileLayerType"]], "map.getmetatileterraintype() (map method)": [[12, "map.getMetatileTerrainType"]], "map.getmetatiletile() (map method)": [[12, "map.getMetatileTile"]], "map.getmetatiletiles() (map method)": [[12, "map.getMetatileTiles"]], "map.getnumprimarytilesetmetatiles() (map method)": [[12, "map.getNumPrimaryTilesetMetatiles"]], "map.getnumprimarytilesettiles() (map method)": [[12, "map.getNumPrimaryTilesetTiles"]], "map.getnumsecondarytilesetmetatiles() (map method)": [[12, "map.getNumSecondaryTilesetMetatiles"]], "map.getnumsecondarytilesettiles() (map method)": [[12, "map.getNumSecondaryTilesetTiles"]], "map.getprimarytileset() (map method)": [[12, "map.getPrimaryTileset"]], "map.getprimarytilesetpalette() (map method)": [[12, "map.getPrimaryTilesetPalette"]], "map.getprimarytilesetpalettepreview() (map method)": [[12, "map.getPrimaryTilesetPalettePreview"]], "map.getprimarytilesetpalettes() (map method)": [[12, "map.getPrimaryTilesetPalettes"]], "map.getprimarytilesetpalettespreview() (map method)": [[12, "map.getPrimaryTilesetPalettesPreview"]], "map.getrequiresflash() (map method)": [[12, "map.getRequiresFlash"]], "map.getsecondarytileset() (map method)": [[12, "map.getSecondaryTileset"]], "map.getsecondarytilesetpalette() (map method)": [[12, "map.getSecondaryTilesetPalette"]], "map.getsecondarytilesetpalettepreview() (map method)": [[12, "map.getSecondaryTilesetPalettePreview"]], "map.getsecondarytilesetpalettes() (map method)": [[12, "map.getSecondaryTilesetPalettes"]], "map.getsecondarytilesetpalettespreview() (map method)": [[12, "map.getSecondaryTilesetPalettesPreview"]], "map.getshowlocationname() (map method)": [[12, "map.getShowLocationName"]], "map.getsong() (map method)": [[12, "map.getSong"]], "map.gettilepixels() (map method)": [[12, "map.getTilePixels"]], "map.gettype() (map method)": [[12, "map.getType"]], "map.getweather() (map method)": [[12, "map.getWeather"]], "map.getwidth() (map method)": [[12, "map.getWidth"]], "map.magicfill() (map method)": [[12, "map.magicFill"]], "map.magicfillfromselection() (map method)": [[12, "map.magicFillFromSelection"]], "map.redraw() (map method)": [[12, "map.redraw"]], "map.setallowbiking() (map method)": [[12, "map.setAllowBiking"]], "map.setallowescaping() (map method)": [[12, "map.setAllowEscaping"]], "map.setallowrunning() (map method)": [[12, "map.setAllowRunning"]], "map.setbattlescene() (map method)": [[12, "map.setBattleScene"]], "map.setblock() (map method)": [[12, "id0"], [12, "map.setBlock"]], "map.setblocksfromselection() (map method)": [[12, "map.setBlocksFromSelection"]], "map.setborderdimensions() (map method)": [[12, "map.setBorderDimensions"]], "map.setborderheight() (map method)": [[12, "map.setBorderHeight"]], "map.setbordermetatileid() (map method)": [[12, "map.setBorderMetatileId"]], "map.setborderwidth() (map method)": [[12, "map.setBorderWidth"]], "map.setcollision() (map method)": [[12, "map.setCollision"]], "map.setdimensions() (map method)": [[12, "map.setDimensions"]], "map.setelevation() (map method)": [[12, "map.setElevation"]], "map.setfloornumber() (map method)": [[12, "map.setFloorNumber"]], "map.setheight() (map method)": [[12, "map.setHeight"]], "map.setlocation() (map method)": [[12, "map.setLocation"]], "map.setmetatileattributes() (map method)": [[12, "map.setMetatileAttributes"]], "map.setmetatilebehavior() (map method)": [[12, "map.setMetatileBehavior"]], "map.setmetatileencountertype() (map method)": [[12, "map.setMetatileEncounterType"]], "map.setmetatileid() (map method)": [[12, "map.setMetatileId"]], "map.setmetatilelabel() (map method)": [[12, "map.setMetatileLabel"]], "map.setmetatilelayertype() (map method)": [[12, "map.setMetatileLayerType"]], "map.setmetatileterraintype() (map method)": [[12, "map.setMetatileTerrainType"]], "map.setmetatiletile() (map method)": [[12, "id1"], [12, "map.setMetatileTile"]], "map.setmetatiletiles() (map method)": [[12, "id2"], [12, "map.setMetatileTiles"]], "map.setprimarytileset() (map method)": [[12, "map.setPrimaryTileset"]], "map.setprimarytilesetpalette() (map method)": [[12, "map.setPrimaryTilesetPalette"]], "map.setprimarytilesetpalettepreview() (map method)": [[12, "map.setPrimaryTilesetPalettePreview"]], "map.setprimarytilesetpalettes() (map method)": [[12, "map.setPrimaryTilesetPalettes"]], "map.setprimarytilesetpalettespreview() (map method)": [[12, "map.setPrimaryTilesetPalettesPreview"]], "map.setrequiresflash() (map method)": [[12, "map.setRequiresFlash"]], "map.setsecondarytileset() (map method)": [[12, "map.setSecondaryTileset"]], "map.setsecondarytilesetpalette() (map method)": [[12, "map.setSecondaryTilesetPalette"]], "map.setsecondarytilesetpalettepreview() (map method)": [[12, "map.setSecondaryTilesetPalettePreview"]], "map.setsecondarytilesetpalettes() (map method)": [[12, "map.setSecondaryTilesetPalettes"]], "map.setsecondarytilesetpalettespreview() (map method)": [[12, "map.setSecondaryTilesetPalettesPreview"]], "map.setshowlocationname() (map method)": [[12, "map.setShowLocationName"]], "map.setsong() (map method)": [[12, "map.setSong"]], "map.settype() (map method)": [[12, "map.setType"]], "map.setweather() (map method)": [[12, "map.setWeather"]], "map.setwidth() (map method)": [[12, "map.setWidth"]], "map.shift() (map method)": [[12, "map.shift"]], "onblockchanged() (built-in function)": [[12, "onBlockChanged"]], "onblockhoverchanged() (built-in function)": [[12, "onBlockHoverChanged"]], "onblockhovercleared() (built-in function)": [[12, "onBlockHoverCleared"]], "onbordermetatilechanged() (built-in function)": [[12, "onBorderMetatileChanged"]], "onborderresized() (built-in function)": [[12, "onBorderResized"]], "onbordervisibilitytoggled() (built-in function)": [[12, "onBorderVisibilityToggled"]], "onmaintabchanged() (built-in function)": [[12, "onMainTabChanged"]], "onmapopened() (built-in function)": [[12, "onMapOpened"]], "onmapresized() (built-in function)": [[12, "onMapResized"]], "onmapshifted() (built-in function)": [[12, "onMapShifted"]], "onmapviewtabchanged() (built-in function)": [[12, "onMapViewTabChanged"]], "onprojectclosed() (built-in function)": [[12, "onProjectClosed"]], "onprojectopened() (built-in function)": [[12, "onProjectOpened"]], "ontilesetupdated() (built-in function)": [[12, "onTilesetUpdated"]], "overlay.addimage() (overlay method)": [[12, "overlay.addImage"]], "overlay.addmetatileimage() (overlay method)": [[12, "overlay.addMetatileImage"]], "overlay.addpath() (overlay method)": [[12, "id19"], [12, "overlay.addPath"]], "overlay.addrect() (overlay method)": [[12, "overlay.addRect"]], "overlay.addtext() (overlay method)": [[12, "overlay.addText"]], "overlay.addtileimage() (overlay method)": [[12, "id21"], [12, "overlay.addTileImage"]], "overlay.clear() (overlay method)": [[12, "id3"], [12, "overlay.clear"]], "overlay.clearclippingrect() (overlay method)": [[12, "id16"], [12, "overlay.clearClippingRect"]], "overlay.createimage() (overlay method)": [[12, "overlay.createImage"]], "overlay.gethorizontalscale() (overlay method)": [[12, "overlay.getHorizontalScale"]], "overlay.getopacity() (overlay method)": [[12, "overlay.getOpacity"]], "overlay.getposition() (overlay method)": [[12, "overlay.getPosition"]], "overlay.getrotation() (overlay method)": [[12, "overlay.getRotation"]], "overlay.getverticalscale() (overlay method)": [[12, "overlay.getVerticalScale"]], "overlay.getvisibility() (overlay method)": [[12, "overlay.getVisibility"]], "overlay.getx() (overlay method)": [[12, "overlay.getX"]], "overlay.gety() (overlay method)": [[12, "overlay.getY"]], "overlay.hide() (overlay method)": [[12, "id4"], [12, "overlay.hide"]], "overlay.move() (overlay method)": [[12, "id18"], [12, "overlay.move"]], "overlay.rotate() (overlay method)": [[12, "id12"], [12, "overlay.rotate"]], "overlay.setclippingrect() (overlay method)": [[12, "id15"], [12, "overlay.setClippingRect"]], "overlay.sethorizontalscale() (overlay method)": [[12, "id8"], [12, "overlay.setHorizontalScale"]], "overlay.setopacity() (overlay method)": [[12, "id7"], [12, "overlay.setOpacity"]], "overlay.setposition() (overlay method)": [[12, "id17"], [12, "overlay.setPosition"]], "overlay.setrotation() (overlay method)": [[12, "id11"], [12, "overlay.setRotation"]], "overlay.setscale() (overlay method)": [[12, "id10"], [12, "overlay.setScale"]], "overlay.setverticalscale() (overlay method)": [[12, "id9"], [12, "overlay.setVerticalScale"]], "overlay.setvisibility() (overlay method)": [[12, "id6"], [12, "overlay.setVisibility"]], "overlay.setx() (overlay method)": [[12, "id13"], [12, "overlay.setX"]], "overlay.sety() (overlay method)": [[12, "id14"], [12, "overlay.setY"]], "overlay.show() (overlay method)": [[12, "id5"], [12, "overlay.show"]], "utility.error() (utility method)": [[12, "utility.error"]], "utility.getbattlescenenames() (utility method)": [[12, "utility.getBattleSceneNames"]], "utility.getbordervisibility() (utility method)": [[12, "utility.getBorderVisibility"]], "utility.getcustomscripts() (utility method)": [[12, "utility.getCustomScripts"]], "utility.getgridvisibility() (utility method)": [[12, "utility.getGridVisibility"]], "utility.getinputitem() (utility method)": [[12, "utility.getInputItem"]], "utility.getinputnumber() (utility method)": [[12, "utility.getInputNumber"]], "utility.getinputtext() (utility method)": [[12, "utility.getInputText"]], "utility.getlocationnames() (utility method)": [[12, "utility.getLocationNames"]], "utility.getmaintab() (utility method)": [[12, "utility.getMainTab"]], "utility.getmapnames() (utility method)": [[12, "utility.getMapNames"]], "utility.getmaptypenames() (utility method)": [[12, "utility.getMapTypeNames"]], "utility.getmapviewtab() (utility method)": [[12, "utility.getMapViewTab"]], "utility.getmetatilebehaviornames() (utility method)": [[12, "utility.getMetatileBehaviorNames"]], "utility.getmetatilelayeropacity() (utility method)": [[12, "utility.getMetatileLayerOpacity"]], "utility.getmetatilelayerorder() (utility method)": [[12, "utility.getMetatileLayerOrder"]], "utility.getprimarytilesetnames() (utility method)": [[12, "utility.getPrimaryTilesetNames"]], "utility.getsecondarytilesetnames() (utility method)": [[12, "utility.getSecondaryTilesetNames"]], "utility.getsmartpathsenabled() (utility method)": [[12, "utility.getSmartPathsEnabled"]], "utility.getsongnames() (utility method)": [[12, "utility.getSongNames"]], "utility.gettilesetnames() (utility method)": [[12, "utility.getTilesetNames"]], "utility.getweathernames() (utility method)": [[12, "utility.getWeatherNames"]], "utility.isprimarytileset() (utility method)": [[12, "utility.isPrimaryTileset"]], "utility.issecondarytileset() (utility method)": [[12, "utility.isSecondaryTileset"]], "utility.log() (utility method)": [[12, "utility.log"]], "utility.registeraction() (utility method)": [[12, "utility.registerAction"]], "utility.registertoggleaction() (utility method)": [[12, "utility.registerToggleAction"]], "utility.setbordervisibility() (utility method)": [[12, "utility.setBorderVisibility"]], "utility.setgridvisibility() (utility method)": [[12, "utility.setGridVisibility"]], "utility.setmaintab() (utility method)": [[12, "utility.setMainTab"]], "utility.setmapviewtab() (utility method)": [[12, "utility.setMapViewTab"]], "utility.setmetatilelayeropacity() (utility method)": [[12, "utility.setMetatileLayerOpacity"]], "utility.setmetatilelayerorder() (utility method)": [[12, "utility.setMetatileLayerOrder"]], "utility.setsmartpathsenabled() (utility method)": [[12, "utility.setSmartPathsEnabled"]], "utility.settimeout() (utility method)": [[12, "utility.setTimeout"]], "utility.showerror() (utility method)": [[12, "utility.showError"]], "utility.showmessage() (utility method)": [[12, "utility.showMessage"]], "utility.showquestion() (utility method)": [[12, "utility.showQuestion"]], "utility.showwarning() (utility method)": [[12, "utility.showWarning"]], "utility.warn() (utility method)": [[12, "utility.warn"]]}}) \ No newline at end of file +Search.setIndex({docnames:["index","manual/creating-new-maps","manual/editing-map-collisions","manual/editing-map-connections","manual/editing-map-events","manual/editing-map-header","manual/editing-map-tiles","manual/editing-wild-encounters","manual/introduction","manual/navigation","manual/project-files","manual/region-map-editor","manual/scripting-capabilities","manual/settings-and-options","manual/shortcuts","manual/tileset-editor","reference/changelog","reference/related-projects"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:54},filenames:["index.rst","manual/creating-new-maps.rst","manual/editing-map-collisions.rst","manual/editing-map-connections.rst","manual/editing-map-events.rst","manual/editing-map-header.rst","manual/editing-map-tiles.rst","manual/editing-wild-encounters.rst","manual/introduction.rst","manual/navigation.rst","manual/project-files.rst","manual/region-map-editor.rst","manual/scripting-capabilities.rst","manual/settings-and-options.rst","manual/shortcuts.rst","manual/tileset-editor.rst","reference/changelog.md","reference/related-projects.rst"],objects:{"":{onBlockChanged:[12,1,1,""],onBlockHoverChanged:[12,1,1,""],onBlockHoverCleared:[12,1,1,""],onBorderMetatileChanged:[12,1,1,""],onBorderResized:[12,1,1,""],onBorderVisibilityToggled:[12,1,1,""],onMainTabChanged:[12,1,1,""],onMapOpened:[12,1,1,""],onMapResized:[12,1,1,""],onMapShifted:[12,1,1,""],onMapViewTabChanged:[12,1,1,""],onProjectClosed:[12,1,1,""],onProjectOpened:[12,1,1,""],onTilesetUpdated:[12,1,1,""]},"constants.version":{major:[12,0,1,""],minor:[12,0,1,""],patch:[12,0,1,""]},constants:{base_game_version:[12,0,1,""],layers_per_metatile:[12,0,1,""],max_primary_metatiles:[12,0,1,""],max_primary_tiles:[12,0,1,""],max_secondary_metatiles:[12,0,1,""],max_secondary_tiles:[12,0,1,""],tiles_per_metatile:[12,0,1,""]},map:{bucketFill:[12,1,1,""],bucketFillFromSelection:[12,1,1,""],commit:[12,1,1,""],getAllowBiking:[12,1,1,""],getAllowEscaping:[12,1,1,""],getAllowRunning:[12,1,1,""],getBattleScene:[12,1,1,""],getBlock:[12,1,1,""],getBorderDimensions:[12,1,1,""],getBorderHeight:[12,1,1,""],getBorderMetatileId:[12,1,1,""],getBorderWidth:[12,1,1,""],getCollision:[12,1,1,""],getDimensions:[12,1,1,""],getElevation:[12,1,1,""],getFloorNumber:[12,1,1,""],getHeight:[12,1,1,""],getLocation:[12,1,1,""],getMetatileAttributes:[12,1,1,""],getMetatileBehavior:[12,1,1,""],getMetatileEncounterType:[12,1,1,""],getMetatileId:[12,1,1,""],getMetatileLabel:[12,1,1,""],getMetatileLayerType:[12,1,1,""],getMetatileTerrainType:[12,1,1,""],getMetatileTile:[12,1,1,""],getMetatileTiles:[12,1,1,""],getNumPrimaryTilesetMetatiles:[12,1,1,""],getNumPrimaryTilesetTiles:[12,1,1,""],getNumSecondaryTilesetMetatiles:[12,1,1,""],getNumSecondaryTilesetTiles:[12,1,1,""],getPrimaryTileset:[12,1,1,""],getPrimaryTilesetPalette:[12,1,1,""],getPrimaryTilesetPalettePreview:[12,1,1,""],getPrimaryTilesetPalettes:[12,1,1,""],getPrimaryTilesetPalettesPreview:[12,1,1,""],getRequiresFlash:[12,1,1,""],getSecondaryTileset:[12,1,1,""],getSecondaryTilesetPalette:[12,1,1,""],getSecondaryTilesetPalettePreview:[12,1,1,""],getSecondaryTilesetPalettes:[12,1,1,""],getSecondaryTilesetPalettesPreview:[12,1,1,""],getShowLocationName:[12,1,1,""],getSong:[12,1,1,""],getTilePixels:[12,1,1,""],getType:[12,1,1,""],getWeather:[12,1,1,""],getWidth:[12,1,1,""],magicFill:[12,1,1,""],magicFillFromSelection:[12,1,1,""],redraw:[12,1,1,""],setAllowBiking:[12,1,1,""],setAllowEscaping:[12,1,1,""],setAllowRunning:[12,1,1,""],setBattleScene:[12,1,1,""],setBlock:[12,1,1,""],setBlocksFromSelection:[12,1,1,""],setBorderDimensions:[12,1,1,""],setBorderHeight:[12,1,1,""],setBorderMetatileId:[12,1,1,""],setBorderWidth:[12,1,1,""],setCollision:[12,1,1,""],setDimensions:[12,1,1,""],setElevation:[12,1,1,""],setFloorNumber:[12,1,1,""],setHeight:[12,1,1,""],setLocation:[12,1,1,""],setMetatileAttributes:[12,1,1,""],setMetatileBehavior:[12,1,1,""],setMetatileEncounterType:[12,1,1,""],setMetatileId:[12,1,1,""],setMetatileLabel:[12,1,1,""],setMetatileLayerType:[12,1,1,""],setMetatileTerrainType:[12,1,1,""],setMetatileTile:[12,1,1,""],setMetatileTiles:[12,1,1,""],setPrimaryTileset:[12,1,1,""],setPrimaryTilesetPalette:[12,1,1,""],setPrimaryTilesetPalettePreview:[12,1,1,""],setPrimaryTilesetPalettes:[12,1,1,""],setPrimaryTilesetPalettesPreview:[12,1,1,""],setRequiresFlash:[12,1,1,""],setSecondaryTileset:[12,1,1,""],setSecondaryTilesetPalette:[12,1,1,""],setSecondaryTilesetPalettePreview:[12,1,1,""],setSecondaryTilesetPalettes:[12,1,1,""],setSecondaryTilesetPalettesPreview:[12,1,1,""],setShowLocationName:[12,1,1,""],setSong:[12,1,1,""],setType:[12,1,1,""],setWeather:[12,1,1,""],setWidth:[12,1,1,""],shift:[12,1,1,""]},overlay:{addImage:[12,1,1,""],addMetatileImage:[12,1,1,""],addPath:[12,1,1,""],addRect:[12,1,1,""],addText:[12,1,1,""],addTileImage:[12,1,1,""],clear:[12,1,1,""],clearClippingRect:[12,1,1,""],createImage:[12,1,1,""],getHorizontalScale:[12,1,1,""],getOpacity:[12,1,1,""],getPosition:[12,1,1,""],getRotation:[12,1,1,""],getVerticalScale:[12,1,1,""],getVisibility:[12,1,1,""],getX:[12,1,1,""],getY:[12,1,1,""],hide:[12,1,1,""],move:[12,1,1,""],rotate:[12,1,1,""],setClippingRect:[12,1,1,""],setHorizontalScale:[12,1,1,""],setOpacity:[12,1,1,""],setPosition:[12,1,1,""],setRotation:[12,1,1,""],setScale:[12,1,1,""],setVerticalScale:[12,1,1,""],setVisibility:[12,1,1,""],setX:[12,1,1,""],setY:[12,1,1,""],show:[12,1,1,""]},utility:{error:[12,1,1,""],getBattleSceneNames:[12,1,1,""],getBorderVisibility:[12,1,1,""],getCustomScripts:[12,1,1,""],getGridVisibility:[12,1,1,""],getInputItem:[12,1,1,""],getInputNumber:[12,1,1,""],getInputText:[12,1,1,""],getLocationNames:[12,1,1,""],getMainTab:[12,1,1,""],getMapNames:[12,1,1,""],getMapTypeNames:[12,1,1,""],getMapViewTab:[12,1,1,""],getMetatileBehaviorNames:[12,1,1,""],getMetatileLayerOpacity:[12,1,1,""],getMetatileLayerOrder:[12,1,1,""],getPrimaryTilesetNames:[12,1,1,""],getSecondaryTilesetNames:[12,1,1,""],getSmartPathsEnabled:[12,1,1,""],getSongNames:[12,1,1,""],getTilesetNames:[12,1,1,""],getWeatherNames:[12,1,1,""],isPrimaryTileset:[12,1,1,""],isSecondaryTileset:[12,1,1,""],log:[12,1,1,""],registerAction:[12,1,1,""],registerToggleAction:[12,1,1,""],setBorderVisibility:[12,1,1,""],setGridVisibility:[12,1,1,""],setMainTab:[12,1,1,""],setMapViewTab:[12,1,1,""],setMetatileLayerOpacity:[12,1,1,""],setMetatileLayerOrder:[12,1,1,""],setSmartPathsEnabled:[12,1,1,""],setTimeout:[12,1,1,""],showError:[12,1,1,""],showMessage:[12,1,1,""],showQuestion:[12,1,1,""],showWarning:[12,1,1,""],warn:[12,1,1,""]}},objnames:{"0":["js","attribute","JavaScript attribute"],"1":["js","function","JavaScript function"]},objtypes:{"0":"js:attribute","1":"js:function"},terms:{"0e8ccfc4fd3544001f4c25fafd401f7558bdefba":16,"0x0":[13,16],"0x000":13,"0x014":13,"0x015":13,"0x01c":13,"0x01d":13,"0x1":[12,13],"0x10":12,"0x11":12,"0x1d4":13,"0x1d5":13,"0x1dc":13,"0x1dd":13,"0x1ff":13,"0x220":15,"0x3e00":13,"0x3ff":13,"0x4":[8,12],"0x60000000":13,"0x7000000":13,"0x8":12,"0x9":12,"0xc00":13,"0xd":12,"0xf000":13,"0xff":13,"2x2":13,"3x3":6,"4bpp":11,"82abc164dc9f6a74fdf0c535cc1621b7ed05318b":16,"8bpp":[11,16],"8x8":[12,15],"boolean":12,"byte":13,"case":[2,4,13],"const":12,"default":[4,6,7,9,10,11,12,13,14,16],"export":[12,15,16],"final":[8,12],"function":[4,8,11,13,16],"goto":4,"import":[2,6,13,16],"long":[2,12,16],"new":[0,2,3,4,6,9,10,11,12,13,14,15,16],"null":[13,16],"pok\u00e9":6,"pok\u00e9cent":4,"pok\u00e9mon":[4,6,9,10,13,16],"return":[4,12],"switch":[9,12,15,16],"true":[2,12,13],"try":[2,12],"var":[4,10],"while":[2,4,6,12,13,14,16],AND:4,Adding:0,For:[1,2,3,4,5,6,7,9,11,12,13,14,15,16],IDs:[10,16],Its:[8,16],MUS:10,NOT:12,One:[7,12],That:8,The:[0,1,2,4,5,6,7,8,9,10,12,13,16],Their:13,Then:[2,6,7,12],There:[4,8,11,12,15],These:[2,3,6,7,10,12,13,15],Use:[4,6,13],Used:[5,15],Useful:12,With:[4,12],YES:12,Yes:12,a0ba1b7c6353f7e4f3066025514c05b323a0123d:16,a1ea3b5e394bc115ba9b86348c161094a00dcca7:16,aarrggbb:12,abil:[2,4,12,16],abl:[2,4,11,12],about:[0,12,16],abov:[2,4,6,8,9,11,12,15,16],accept:[7,12],access:[4,12,13,16],accomod:16,accomplish:6,accord:[13,16],accordingli:16,accur:16,across:[13,15],act:16,action:[0,6,14,16],actionnam:12,activ:[4,7,12,16],actual:[4,12,16],ad365a35c1536740cbcbc10bee66e5dd908c39e7:16,adb0a444577b59eb02788c782a3d04bc285be0ba:16,add:[1,3,4,7,11,12,13,15,16],added:[12,16],addfilledrect:16,addimag:12,adding:[7,16],addit:[5,8,10,12,13,15],addition:[4,6,12,13,16],addmetatileimag:12,addpath:12,addrect:[12,16],addtext:12,addtileimag:12,adher:16,adjac:[4,12],adjust:[6,7,15,16],adob:15,advanc:[2,8,16,17],advancemap:[13,16],affect:12,after:[2,4,6,8,10,12,16],again:[4,6],alia:11,all:[2,3,4,6,7,9,11,12,13,14,15,16],allow:[1,2,4,5,6,7,8,9,12,13,15,16],alon:12,along:2,alongsid:13,alreadi:[12,14],also:[2,4,5,6,7,10,11,12,13,14,15,16],alter:7,altern:[1,4],altogeth:15,alwai:[2,4,16],amount:16,angl:12,ani:[1,2,4,6,9,11,12,13,15,16],anim:[4,12,16],anoth:[4,6,7,9,11,16],anyth:[4,6,12],api:[0,16],app:13,appdata:[13,14],appear:[4,6,9,11,12,15,16],append:[5,10],appli:[12,15,16],applic:[9,13,14,16],applymov:4,applynighttint:12,appropri:2,arbitrarili:16,area:[2,4,6,8,9,11,12,16],aren:[10,16],argument:[12,15,16],around:[4,6,9,11,16],arrai:[11,12],arriv:4,arrow:[4,16],asid:13,assign:[4,7,16],associ:[1,2,4,11,13,15],assum:[12,16],attempt:[15,16],attribut:[12,13,15,16],auto:16,autocomplet:16,automat:[3,4,5,12,13,15,16],avail:[4,6,7,8,9,11,13],awai:7,awar:6,axi:6,back:[6,16],background:[0,5,9,12,15],bad:16,bar:[12,16],base:[0,1,6,7,10,11,13,16],base_game_vers:[12,16],basement:5,basic:[2,6,8,9,12],batch:12,battl:[4,5,10,12],battlescen:12,bbg_event_player_facing_:10,bcoord_event_weather_:10,becaus:[2,4,9,12,13],becom:[13,16],been:[12,16],befor:[2,6,8,12,16],begin:[],behav:[4,12,16],behavior:[10,12,13,16],behind:[12,16],being:[2,8,13,16],bele:1,belong:5,below:[2,4,6,7,10,12,16],berri:4,better:16,between:[2,3,4,9,11,12,15,16],beyond:16,bflag_:10,bigger:6,bike:[1,5,12,13],bin:[10,13],binari:[8,11,15],bit:[12,13,15,16],bitem_:10,black:12,blob:[],block:[1,2,12,16],blue:4,bmap_battle_scene_:10,bmap_type_:10,bmb_:10,bmovement_type_:10,bobj_event_gfx_:10,boi:17,border:[0,1,4,10,12,13,16],bordercolor:[12,16],both:[3,6,13,15,16],bottom:[2,6,12,13,15,16],bound:[4,16],boundari:16,box:[4,7,10,11,12,13,15,16],bread:6,bridg:2,brief:4,briefli:9,bring:[4,6,7,9,11],browser:12,brush:12,bsecret_base_:10,bspecies_:10,btrainer_type_:10,bucket:[0,12,14],bucketfil:12,bucketfillfromselect:12,bug:16,build:[4,6,8,12],built:[6,16],bulk:16,bump:16,butter:6,button:[0,3,6,7,8,9,10,11,12,13,15,16],bvar_:10,bvd:[15,16],bweather_:10,c68ba9f4e8e260f2e3389eccd15f6ee5f4bdcd3:16,c73de8bed752ca538d90cfc93c4a9e8c7965f8c9:16,cach:12,calcul:[10,16],call:[6,12,16],callabl:12,callback:[13,16],can:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],cancel:[12,14],cannot:[1,4,5,14,16],capabl:[0,16],categori:15,caus:[12,16],cave:7,cdae0c1444bed98e652c87dc3e3edcecacfef8b:16,ceil:12,center:[1,4,6,9,16],certain:[4,10,12,15,16],cfg:[6,13,14,16],chain:6,chanc:7,chang:[0,1,3,4,7,8,9,11,12,13],changelog:0,charact:[4,16],check:[4,6,7,9,12,13,16],checkbox:[3,6,16],checkerboard:16,choos:[4,6,7,8,9,10,12],citi:[3,8],clear:[11,12,16],clearclippingrect:12,click:[1,2,3,4,6,7,8,9,11,12,14,16],cliff:2,clip:[12,16],clipboard:16,clockwis:12,clone:[0,13,16],close:[4,12,16],code:[4,12,13,15],collaps:[9,16],collect:5,collid:12,collis:[0,4,6,8,9,12,13,16],collision_opac:[],color:[12,15,16,17],column:[2,13],com:[0,13,16],combin:[2,15],combo:[4,16],combobox:[11,16],comma:13,command:[4,14,16],comment:16,commit:[12,13,16],commitchang:12,common:2,commonli:[2,16],compat:16,compil:8,complet:12,comprehens:[14,16],concept:2,config:[6,12,13,16],configur:[0,6,11,13,16],confirm:[12,13],conjunct:6,connect:[0,4,6,8,9,12,16],consecut:12,consid:13,consist:[12,13,16],constant:[10,11,15,16],constants_event_bg:10,constants_fieldmap:10,constants_flag:10,constants_glob:10,constants_heal_loc:10,constants_item:10,constants_map_group:10,constants_map_typ:10,constants_metatile_behavior:10,constants_metatile_label:10,constants_obj_ev:10,constants_obj_event_mov:10,constants_oppon:[],constants_pokemon:10,constants_region_map_sect:10,constants_secret_bas:10,constants_song:10,constants_trainer_typ:10,constants_var:10,constants_weath:10,construct:13,contain:[4,9,12,13,15,16],content:12,context:[9,15],contigu:[6,16],continu:[2,6],contrast:16,control:[2,4,5,8],conveni:[4,6,12,15,16],convert:[15,16],coord:12,coordin:[4,11,12,16],coorespond:16,copi:[6,7,15,16],corner:[3,12],correctli:[13,16],correspond:[11,13,16],corrupt:16,could:[12,16],count:[2,10,15,16],counterclockwis:12,coupl:11,cover:[4,9,15],crash:16,creat:[0,4,6,7,9,11,12,13,15,16],create_map_text_fil:[],createimag:[12,16],creation:6,critic:12,cross:8,crosshair:[],ctrl:[3,4,6,8,9,11,12,14,16],cumbersom:12,current:[2,4,6,7,8,9,11,12,13,14,15,16],cursor:[4,6,11,14,16],custom:[0,1,5,6,11,13,14,16],custom_script:[],cut:16,dai:[7,12],dark:16,data:[6,7,8,10,11,12,13,15,16],data_event_script:10,data_heal_loc:10,data_layouts_fold:10,data_map_fold:10,data_obj_event_gfx:10,data_obj_event_gfx_info:10,data_obj_event_gfx_point:10,data_obj_event_pic_t:10,data_pokemon_gfx:10,data_scripts_fold:10,data_tilesets_fold:10,date:16,daunt:9,deactiv:4,debug:12,decim:12,decompil:[8,16,17],decor:12,default_primary_tileset:[],default_secondary_tileset:[],defin:[6,11,12,13,15,16],define_attribute_behavior:10,define_attribute_encount:10,define_attribute_lay:10,define_attribute_terrain:10,define_heal_locations_prefix:10,define_map_dynam:10,define_map_empti:10,define_map_prefix:10,define_map_s:10,define_map_section_count:10,define_map_section_empti:10,define_map_section_prefix:10,define_mask_behavior:10,define_mask_collis:10,define_mask_elev:10,define_mask_lay:10,define_mask_metatil:10,define_max_level:10,define_metatile_label_prefix:10,define_metatiles_primari:10,define_min_level:10,define_obj_event_count:10,define_pals_primari:10,define_pals_tot:10,define_spawn_prefix:10,define_tiles_primari:10,define_tiles_tot:10,definit:13,degre:12,del:[14,16],delai:12,delaym:12,delet:[0,3,11,12,14,15,16],deltai:12,deltax:12,demand:12,demonstr:6,denot:2,depend:[1,6,12,13,16],depth:[15,16],describ:[4,7],descript:4,design:6,desir:[3,6,9],despit:16,destin:[3,4],detail:[4,6,9,11,12,13,16],detailedtext:12,detect:12,determin:[2,4,11,13,15],diagonist:12,dialog:[8,9,12,14,16],did:16,diff:16,differ:[1,2,4,6,9,11,12,13,15,16],difficulti:8,dig:[5,12,13],dimens:[6,10,11,12,13,16],direct:[2,3,4,6,10,13,16],directli:[4,12,13],directori:[12,16],disabl:[6,7,10,12,13,16],disallow:16,disappear:16,disassembl:17,discontin:[],disk:[7,12],displai:[1,4,6,7,8,11,12,13,15,16],disppear:[],dissect:4,distanc:[4,16],distinguish:11,dive:0,divid:13,document:[12,16],doe:[4,6,8,10,12,13],doesn:[2,6,12,13,16],doing:8,don:[3,16],done:[11,15],doubl:[3,4,9,11,16],down:[6,7,8,16],download:[8,12],drag:[3,4,6,11,14,16],draw:[4,8,11,12,14,15,16],drawn:[12,16],drop:[7,16],dropdown:[3,6,12,13,15,16],due:16,dummi:4,duplic:[4,14,16],dure:[2,4,16],dynam:[4,10],each:[2,4,5,6,7,9,10,11,12,13,15,16],easi:[1,4,6],easier:[6,11,15,16],easiest:3,east:[2,3],ecmascript:12,ecount:10,edg:12,edit:[0,8,9,10,11,13,14,15,16],editor:[0,4,8,13,16,17],effect:[13,15,16],either:[2,6,9,12,13,15,16],element:[12,16],elev:[1,2,4,12,13,16],ellips:16,ellipt:12,els:[2,4],elsewher:12,emerg:0,empti:[7,8,10,12,13,16],enabl:[3,6,10,12,13,16],enable_event_clone_object:[],enable_event_secret_bas:[],enable_event_weather_trigg:[],enable_floor_numb:[],enable_heal_location_respawn_data:[],enable_hidden_item_quant:[],enable_hidden_item_requires_itemfind:[],enable_map_allow_flag:[],enable_triple_layer_metatil:[12,16],enclos:12,encount:[0,10,12,13,16],encountertyp:12,end:[10,16],endless:12,enforc:[7,13],engin:[4,5],enhanc:12,ensur:4,enter:[1,2,4,5,9,10,11,12,14],entir:[6,11,12,15,16],entranc:4,entri:[0,12,16],equal:4,equival:8,eras:12,error:[12,16],escap:[1,5,12,13],essenti:12,etc:16,evalu:16,even:[2,6,12,14],evenli:13,event:[0,1,3,8,9,10,12,14,16],event_bg:10,event_object:10,event_object_mov:10,event_script:10,everi:[6,11,12,13,15],exactli:6,exampl:[1,2,3,4,5,6,11,12,15,16],except:[2,4],exchang:11,exclus:[4,5,15],execut:[4,12],exist:[1,4,6,8,10,11,12,13,16],exit:[4,12,13,16],expand:[5,9,16],expect:[10,13,16],expens:12,explain:4,explan:11,explanatori:5,explicitli:16,explor:2,express:[10,13,16],extend:[4,16],extens:[4,12,16],extra:16,extract:10,extrem:3,eyedropp:[6,14,15],face:[4,10,15,16],fail:[13,16],fake:12,fall:16,fals:12,familiar:8,fan:16,favor:16,featur:[2,3,8,9,11,16],feel:0,few:[4,6,8,9,16],field:[0,4,5,6,10,11,13,16],fieldmap:10,file:[0,3,4,6,8,9,11,12,15,16],filepath:[10,11,12,13,16],fill:[0,2,12,13,14,16],fillcolor:[12,16],filter:[9,16],find:[0,10,13,16],finish:[2,11],first:[2,4,6,7,8,9,11,12,13,16],fit:16,fix:6,flag:[4,10,16],flash:[5,12],flip:[11,12,16],floor:[1,5,12,13,16],floornumb:12,flow:[2,6],flower:[8,12],floweri:8,fly:[1,4],focu:16,folder:[1,8,9,10,13,16],follow:[0,6,8,12],font:12,forc:[12,13],forceredraw:12,fork:12,form:[12,15],format:[6,11,12,15,16,17],found:[4,8,10,13,15,16],four:[7,13],frame:[10,16],freeli:12,frlg:16,from:[1,2,4,6,7,8,9,10,11,12,13,14,16,17],front:[4,16],full:[12,16],fullest:9,func:12,functionnam:12,game:[2,4,5,6,7,8,9,11,12,13,16,17],gameplai:[2,4,9],gba:15,gen:[8,17],gener:[2,8,10,12,14],get:[0,6,10,12],getallowbik:12,getallowescap:12,getallowrun:12,getbattlescen:12,getbattlescenenam:12,getblock:12,getborderdimens:12,getborderheight:12,getbordermetatileid:12,getbordervis:12,getborderwidth:12,getcollis:12,getcustomscript:12,getdimens:12,getelev:12,getfloornumb:12,getgridvis:12,getheight:12,gethorizontalscal:12,geti:12,getinputitem:12,getinputnumb:12,getinputtext:12,getloc:12,getlocationnam:12,getmaintab:12,getmapnam:12,getmaptypenam:12,getmapviewtab:12,getmetatileattribut:12,getmetatilebehavior:12,getmetatilebehaviornam:12,getmetatileencountertyp:12,getmetatileid:12,getmetatilelabel:12,getmetatilelayeropac:12,getmetatilelayerord:12,getmetatilelayertyp:12,getmetatileterraintyp:12,getmetatiletil:12,getnumprimarytilesetmetatil:12,getnumprimarytilesettil:12,getnumsecondarytilesetmetatil:12,getnumsecondarytilesettil:12,getopac:12,getposit:12,getprimarytileset:12,getprimarytilesetnam:12,getprimarytilesetpalett:12,getprimarytilesetpalettepreview:12,getprimarytilesetpalettespreview:12,getrequiresflash:12,getrot:12,getsecondarytileset:12,getsecondarytilesetnam:12,getsecondarytilesetpalett:12,getsecondarytilesetpalettepreview:12,getsecondarytilesetpalettespreview:12,getshowlocationnam:12,getsmartpathsen:12,getsong:12,getsongnam:12,gettilepixel:12,gettilesetnam:12,gettyp:12,getverticalscal:12,getvis:12,getweath:12,getweathernam:12,getwidth:12,getx:12,gif:[6,16],ginitialmovementtypefacingdirect:10,git:[4,8],github:[0,13,16],gitignor:13,give:[4,6,7,9,16],given:[7,12,15,16],global:[0,4,10,12],global_fieldmap:10,gmonicont:10,gobjecteventgraphicsinfopoint:10,goe:12,going:[4,14],good:[10,12],gpl:16,grai:15,graphic:[2,4,5,10,13,16],graphics_file_rul:15,grass:[2,8,12,15],grasstil:12,grayscal:16,great:8,green:[4,7],greet:8,grid:[6,12,14,16],group:[0,1,6,9,13,14,16],grow:16,gtileset_:10,gtileset_gener:13,gtileset_pallettown:13,gtileset_petalburg:13,guarante:[12,16],gwildmonhead:10,hack:[8,15],had:13,half:2,handl:16,happen:[4,12,16],hardcod:[4,16],hardwar:15,has:[2,3,4,5,9,11,12,14,15,16],have:[2,3,4,6,7,8,9,11,12,13,14,15,16],head:11,headbutt_mon:7,header:[0,9,10,13,16],heal:[0,1,10,13,16],heal_loc:[4,10],heal_location_:[10,16],healspot:0,height:[1,11,12,13,16],help:[6,15,16],here:[2,12,13,14,15],hex:[15,16],hexadecim:2,hidden:[0,6,10,12,13,16],hide:[1,5,12,16],hierarch:9,high:17,higher:12,highest:13,highli:8,highlight:16,higlight:11,histori:[2,12,14,16],hit:16,hold:[4,6,14,16],home:16,hop:2,horizont:[3,12,16],hous:16,hover:[6,16],how:[2,4,6,8,9,12,16],howev:[4,6,12],hscale:[12,16],html:12,http:[0,13,16],huderlem:[0,16],huge:16,ice:15,icon:[6,10,12,13,16],idea:10,ident:[2,6],identifi:10,ids:12,ignor:[8,16],illustr:[2,6],imag:[0,2,4,6,10,12,13,16],immedi:16,impass:[2,12],implement:7,implicitli:12,improperli:16,improv:[8,16],inanim:16,inc:[4,10,13,16],incbin_u16:13,incbin_u32:13,incbin_u8:13,includ:[2,4,6,7,9,10,11,13,15,16],inclus:12,incomapt:[],incompat:[6,16],incorrect:16,incorrectli:16,increment:12,independ:16,index:[7,12,15,16],indexof:12,indic:[6,12,15,16],individu:[6,12,15,16],indoor:1,info:12,inform:[12,13,16],informativetext:12,inherit:4,initi:[12,13,16],initial_facing_t:10,input:[12,16],insert:12,insid:[4,12],instal:8,instanc:[11,13],instead:[4,10,12,13,16],integ:[11,16],integr:[10,16],interact:[2,4,9,12,16],interchang:16,interest:12,interpret:16,interrupt:16,interv:12,introduc:16,introduct:0,invalid:16,investig:[],invis:[4,12],involv:4,iscompress:13,isprimarytileset:12,issecondarytileset:12,issu:16,item:[0,5,10,12,13,16],itemfind:[4,13,16],iter:16,its:[4,6,12,15,16],itself:12,jasc:[15,16],javascript:[12,16],json:[6,7,10,11,13,16],json_layout:10,json_map_group:10,json_region_map_entri:10,json_region_porymap_cfg:10,json_wild_encount:10,jump:16,junk:16,just:[1,2,6,7,15],kanto:16,keep:[3,5,16],kei:[6,14,16],keyboard:[11,12,14,16],keyword:12,known:4,label:[10,11,12,13,16],laid:6,land:[2,12],languag:17,larg:[6,16],larger:[6,9],last:[12,16],later:12,launch:[8,13,16],layer:[12,13,16],layers_per_metatil:12,layertyp:12,layout:[0,1,9,10,13,16],layouts_t:16,learn:[6,8,9],leav:[2,12],left:[2,4,6,8,9,11,12,13,14,15,16],length:12,let:[2,4,6,7,8,9,11,12,17],letter:12,level:[2,7,10,16,17],librari:[13,14],life:[4,6],like:[2,4,6,9,12,13,15,16],limit:[5,10,12,13,15,16],line:[4,6,13,16],linux:[8,16],list:[0,1,4,6,10,11,12,13,14,16],listen:17,littl:4,load:[4,8,9,12,13,16],local:4,locat:[0,1,5,6,8,10,11,12,13,16],lock:[4,6,16],log:[12,16],logic:12,longer:[4,16],look:[0,4,8,9,11],lose:16,lot:15,lower:[12,16],mac:[8,16],maco:[13,14,16],macro:[10,13,16],made:[7,12,13,16],magic:[12,14,16],magicfil:12,magicfillfromselect:12,mai:[1,2,4,7,13,15,16],main:[0,6,7,8,11,12,13,16],main_splitter_st:[],maintain:[2,10],major:[12,16],make:[2,4,6,8,11,12,13,15,16],makefil:15,manag:12,mani:[4,8,9,11,12,14,15,16],manipul:[7,12],manual:[0,12,15],map:[0,7,8,10,16,17],map_:10,map_dynam:16,map_group:10,map_groups_count:16,map_non:16,map_sort_ord:[],map_splitter_st:[],map_typ:10,map_type_indoor:5,mapgrid_collision_mask:[10,13],mapgrid_elevation_mask:[10,13],mapgrid_metatile_id_mask:[10,13],mapjson:16,mapnam:12,mapsec_:10,mapsec_non:11,mark:[4,12],mart:6,mask:[10,13,16],master:[],match:[4,6,13,16],math:12,max:[12,13,16],max_level:10,max_map_data_s:10,max_primary_metatil:12,max_primary_til:12,max_secondary_metatil:12,max_secondary_til:12,maximum:[7,10,12,13,16],mean:[2,3,4,12],meant:17,measur:[4,16],memori:12,menu:[0,3,7,12,16],messag:[12,16],met:12,metatil:[0,1,2,4,8,9,10,12,13,14,16],metatile_:10,metatile_attr_behavior_mask:[10,13],metatile_attr_layer_mask:[10,13],metatile_attribut:13,metatile_attribute_behavior:10,metatile_attribute_encounter_typ:10,metatile_attribute_layer_typ:10,metatile_attribute_terrain:10,metatile_attributes_s:[],metatile_behavior:[10,15],metatile_behavior_mask:[],metatile_encounter_type_mask:[],metatile_general_grass:[],metatile_general_plain_grass:15,metatile_id:[],metatile_label:[10,15,16],metatile_layer_type_mask:[],metatile_secretbase_pc:15,metatile_terrain_type_mask:[],metatileid:12,metatiles_zoom:[],method:[6,16],middl:[6,12,14,15,16],might:[7,12],millisecond:12,mimic:16,min:[12,16],min_level:10,minimum:[7,10,12,16],minor:[12,16],mirror:0,miscellan:[5,12],mislead:16,miss:[0,16],mistak:[6,11],mode:[1,9,14,16],modif:2,modifi:[6,9,11,12,13,15,16],moment:12,monitor:16,monitor_fil:[],more:[4,6,8,9,11,12,13,14,15,16],most:[2,8,9,11,16],mostli:5,mountain:[2,6],mous:[4,6,11,12,16],mouseov:16,move:[2,3,4,5,12,14,16],movement:[4,10,16],much:8,multi:[2,16],multilin:16,multipl:[4,6,7,11,14,16],music:[5,9,10,16,17],must:[3,4,6,7,8,12,15],my_script:12,name:[1,4,5,6,7,9,10,11,12,13,15,16],nativ:[],navig:[0,3,4,7,8,11,16],nearli:2,necessari:[],need:[2,3,4,5,6,11,12,13,15,16],neg:[5,11,12,16],never:4,new_map_border_metatil:[],new_map_elev:[],new_map_metatil:[],newblock:12,newheight:12,newli:[12,16],newmetatileid:12,newtab:12,newwidth:12,next:[2,4,7,8,9,12,15,16],nice:12,night:12,nodej:12,nodep:8,non:[4,11,16],none:[10,12],normal:[4,6,12,13,15],north:2,notabl:[8,16],note:[5,10,12,13],noth:[4,12],notic:[11,12,16],now:[2,6,7,8,12,16],npc:[4,10,13],num_metatiles_in_primari:10,num_pals_in_primari:10,num_pals_tot:10,num_til:15,num_tiles_in_primari:10,num_tiles_tot:10,number:[1,2,4,5,7,10,12,13,16],object:[0,2,6,9,10,12,13,16],object_ev:10,object_event_graph:10,object_event_graphics_info:[10,16],object_event_graphics_info_point:10,object_event_pic_t:10,object_event_templates_count:10,occur:[12,16],odd:12,off:[2,6,12,16],offici:16,offset:[3,11,16],old:[14,16],oldheight:12,oldtab:12,oldwidth:12,onblockchang:[12,16],onblockhoverchang:12,onblockhoverclear:12,onbordermetatilechang:12,onborderres:12,onbordervisibilitytoggl:12,onc:[4,6,12,16],one:[2,3,4,6,7,9,11,12,13,16],ones:16,onli:[2,3,4,6,7,9,10,12,13,15,16],onmaintabchang:12,onmapopen:12,onmapres:[12,16],onmapshift:12,onmapviewtabchang:12,onprojectclos:12,onprojectopen:12,ontilesetupd:12,onto:[2,6,9,11,12],opac:[12,16],opaqu:12,open:[0,3,6,7,8,9,11,12,13,14,15,16],oper:[9,12,15,16],oppon:[],optim:6,option:[0,2,4,9,10,11,12,13,14,15,16],order:[1,4,7,12,16],organ:9,origin:[4,12,13,16],other:[4,6,9,11,12,13,16,17],otherwis:[7,10],our:[7,8,12],out:[0,2,4,6,7,9,11,14,16],outdoor:1,outlin:[6,12,14,16],output:[10,13,15],outsid:[12,15,16],over:[2,4,5,6,9,16],overhaul:16,overlai:16,overlap:13,overload:12,overrid:[10,13,16],overridden:[10,13],overview:12,overworld:[4,16],overwrit:[12,13,14],overwritten:12,own:[12,13],paint:[0,6,8,9,11,12,14,16],pair:[12,15],pal:[11,15,16],palett:[0,10,11,12,16],paletteid:12,paletteindex:12,pane:[6,9,11,15,16],panel:[2,8,13,15,16],pars:16,part:[9,16],partial:[6,16],particular:2,particularli:4,passabl:12,past:16,patch:12,path:[0,2,10,11,12,13,14,16],pathwai:6,patient:9,pattern:[6,12],pencil:[0,4,8,14,16],per:[13,14,16],percent:12,perform:[6,12,16],perman:12,persist:16,petalburg:[3,8],pick:[4,15],picker:[6,16],pictur:[7,15,16],pink:4,pixel:[12,15,16],place:[4,6,8,11,16],placehold:16,plai:5,plain:[11,16],plain_grass:[],platform:[8,13,16],player:[1,2,3,4,6,9,11,14,15,16],pleas:0,plu:[3,4],png:[10,15,16],pointer:[0,4,14,16],pokecryst:17,pokeemerald:[4,6,8,10,11,12,13,16],pokefir:[4,5,6,8,11,12,13,15,16],pokemon:[1,7,9,10,12,13,16],pokemon_gfx:10,pokemon_icon:10,pokemon_icon_t:10,poker:17,pokerubi:[4,6,8,10,12,13,16],polish:17,pond:6,poor:16,pop:8,popul:[7,11,12,13,15],popular:17,popup:[1,5,11],pori:[4,10,13,16],port:16,portion:6,porycript:4,porymap:[1,3,4,6,7,9,10,11,12,14,15,16],porymap_config:10,poryscript:[13,16,17],posit:[0,6,11,12,13,16],possibl:[7,12,16],power:[6,12],pre:[6,16],predict:16,prefab:[0,12,13,16],prefabr:6,prefabs_filepath:6,prefabs_import_prompt:[],prefer:[4,13,14,16],prefix:[5,10,12,16],present:12,preserv:16,press:[3,4,6,8,9,16],pret:[8,13,14,16],pretti:7,pretty_cursor:[],prevblock:12,prevent:16,preview:[6,12],previou:[2,16],previous:[12,16],prevmetatileid:12,primari:[1,6,8,10,12,13,15,16],pro:15,probabl:[10,12],procedur:12,process:[2,4],program:17,project:[0,1,2,4,5,6,8,9,11,12,14,15,16],project_root:6,projectpath:12,prompt:[6,12,13,14,16],proper:16,properli:16,properti:[0,2,4,5,8,9,10,11,12,13,16],provid:[4,6,7,8,12,13,15,16],pull:16,purpos:[2,9],qt6:16,quantiti:[4,13],question:12,quick:6,quickli:9,radiu:[4,6],rais:16,randint:12,random:12,rang:[4,12,13],rate:[7,16],rather:[6,12,16],ratio:7,raw:12,rawvalu:12,reach:0,reactiv:16,read:[4,8,10,11,12,13,16],realist:15,reason:[7,13,15],receiv:4,recent:16,recent_map:[],recent_project:[],recommend:8,rectangl:[6,12,16],rectangular:12,red:[2,7,16],redo:[0,2,4,8,11,14,16],redraw:12,reduc:16,refer:[0,14],referenc:15,reflect:[12,16],refresh:12,regex:[10,13],regex_battle_scen:10,regex_behavior:10,regex_coord_event_weath:10,regex_flag:10,regex_item:10,regex_map_typ:10,regex_movement_typ:10,regex_mus:10,regex_obj_event_gfx:10,regex_secret_bas:10,regex_sign_facing_direct:10,regex_speci:10,regex_trainer_typ:10,regex_var:10,regex_weath:10,region:[0,1,5,6,8,10,12,13,16],region_map:[10,11],region_map_sect:[10,11],regist:0,registeract:[12,16],registertoggleact:[12,16],registri:16,regress:16,regular:[6,10,12,13],rejoic:16,rel:[10,11,12,13],relat:[0,10,12],releas:[6,8,16],reli:10,reload:[12,13,16],reloc:16,remain:12,rememb:[2,16],remov:[12,13,15,16],renam:16,render:[12,16],reopen:16,reopen_on_launch:[],reorder:16,reorgan:16,replac:[2,11,12,13,16],repo:16,report:16,repositori:13,repres:[2,7,12,13],repsawn:13,requir:[4,5,10,12,13,16],reselect:16,reset:[11,14,16],resili:16,resiz:[2,6,16],resolut:16,resolv:16,resourc:[],respawn:[4,10,13],respect:[8,13,16],respond:16,rest:[12,13],restor:[13,14,16],restrict:11,result:8,retain:16,retriev:12,rgb:[12,16],right:[1,2,3,4,6,7,9,11,12,13,14,15,16],rival:4,rme:11,rom:8,rooftop:5,root:[10,11,13],rope:[1,5,12,13],rotat:[12,16],round:[12,16],rout:[2,3],row:[2,13,16],rrggbb:12,rubi:5,rule:[12,15],ruler:[0,16],run:[1,5,12,13,16],same:[2,4,6,8,12,13,14,15,16],save:[3,6,7,8,12,13,14,15,16],scale:[12,14,16],scenario:[15,16],scene:[5,10,12],scratch:[11,15],screen:[7,8,15,16],script:[0,9,10,13,16,17],scroll:[6,16],seamlessli:3,search:[10,13],second:[2,8,9,13],secondari:[1,6,10,12,13,15,16],secret:[0,10,13,16],secret_bas:[4,10],secretbas:15,section:[1,4,5,6,9,10,11],see:[1,4,6,7,8,9,12,13,16],seem:9,seen:16,segment:13,select:[0,3,4,7,8,9,11,12,13,14,15,16],selector:[2,6,11,16],self:5,semant:[13,16],sensibl:16,separ:[12,13],sequenti:13,session:16,set:[0,2,4,6,7,9,10,11,14,15,16],setallowbik:12,setallowescap:12,setallowrun:12,setbattlescen:12,setblock:12,setblocksfromselect:12,setborderdimens:12,setborderheight:12,setbordermetatileid:12,setbordervis:12,setborderwidth:12,setclippingrect:12,setcollis:12,setdimens:12,setelev:12,setfloornumb:12,setgridvis:12,setheight:12,sethorizontalscal:12,seti:12,setloc:12,setmaintab:12,setmapviewtab:12,setmetatileattribut:12,setmetatilebehavior:12,setmetatileencountertyp:12,setmetatileid:12,setmetatilelabel:12,setmetatilelayeropac:12,setmetatilelayerord:12,setmetatilelayertyp:12,setmetatileterraintyp:12,setmetatiletil:[12,16],setopac:12,setposit:12,setprimarytileset:12,setprimarytilesetpalett:12,setprimarytilesetpalettepreview:12,setprimarytilesetpalettespreview:12,setrequiresflash:12,setrot:12,setscal:[12,16],setsecondarytileset:12,setsecondarytilesetpalett:12,setsecondarytilesetpalettepreview:12,setsecondarytilesetpalettespreview:12,setshowlocationnam:12,setsmartpathsen:12,setsong:12,settimeout:12,settranspar:12,settyp:12,setup:8,setverticalscal:12,setvis:12,setweath:12,setwhiteoutrespawnwarpandhealernpc:4,setwidth:12,setx:12,sever:[7,12,15],shape:12,share:16,shealloc:10,shift:[0,3,4,12,14,16],shoe:5,shortcut:[0,2,6,8,11,12,16],should:[2,4,6,7,8,11,12,13,16],shouldn:8,show:[1,5,6,8,9,12,13,14,15,16],show_cursor_til:[],show_player_view:[],showerror:12,showmessag:12,shown:12,showquest:12,showwarn:12,shrink:16,side:[2,3,6,8,9,15],sight:4,sign:[0,10,16],signific:16,signpost:[2,4],silenc:[13,16],similar:[2,3,7],simpl:[4,7],simpli:[3,4,6,9,11,15],simplifi:6,simultan:11,sinc:[3,8,12,15,16],singl:[7,9,11,12,16],situat:[9,16],size:[6,11,12,13,16],slider:[2,6,11,15,16],slightli:16,slot:[7,16],slow:12,small:4,smaller:12,smart:[0,2,12,14,16],smetatileattrmask:[10,13],smooth:16,snap:6,some:[1,2,4,6,8,9,10,12,16],someth:[0,2,4,7,11],sometim:[15,16],somewhat:16,song:[5,10,12],sort:[1,9,16],sourc:[8,15],south:2,space:[13,16],span:11,spawn_:[10,16],speci:[7,10,13],special:[2,4,12,13],specif:[4,10,13,16],specifi:[4,10,12,13,16],specifieid:12,specifii:12,speed:16,spin:13,spinbox:11,spinner:[2,4,12,15,16],split:15,spot:4,sprint:1,sprite:[4,10,13,16],spritesheet:16,squar:[4,11,16],src:[4,10,11],ssecretbaseentrancemetatil:4,sspawnpoint:10,stai:16,stair:2,stand:[4,15],standard:4,start:[0,2,6,12,13],startup:16,state:12,statu:16,step:12,stick:16,still:[13,16],stitch:16,stop:[12,16],store:[11,13,14,16],straight:[0,12,14,16],straightforward:7,string:[11,12,16],struct:16,studio:17,stuff:[],successfulli:[8,12],suffici:[11,12],summar:9,support:[5,6,8,10,11,12,13,14,16],sure:[2,3,8],surf:2,surround:[6,9],swap:11,swhiteoutrespawnhealcentermapidx:10,swhiteoutrespawnhealernpcid:10,symbol:[10,13,16],symbol_attribute_t:10,symbol_facing_direct:10,symbol_heal_loc:10,symbol_obj_event_gfx_point:10,symbol_pokemon_icon_t:10,symbol_spawn_map:10,symbol_spawn_npc:10,symbol_spawn_point:10,symbol_tilesets_prefix:10,symbol_wild_encount:10,sync:[3,16],syntax:[10,13],system:16,tab:[0,2,3,4,6,7,9,10,12,13,16],tabl:[10,12,13,15,16],tag:12,take:[6,7,8,9,11,12,13,16],taken:16,tall:[12,15],target:[4,12],technic:[4,12],templat:[12,16],temporarili:[6,12,16],terrain:[12,13],terraintyp:12,test:12,text:[2,4,9,10,12,13,15,16],text_editor_goto_lin:[],text_editor_open_directori:[],textbox:[],than:[6,12,16],thei:[1,3,4,5,6,9,10,12,13,14,15,16],them:[2,3,4,5,6,7,12,13,16],theme:16,therefor:[7,8],thi:[1,2,3,4,5,6,7,9,10,11,12,13,15,16],thing:[4,5,6,7,8,9],think:[6,8],those:[6,8,12],though:[6,16],three:[4,11,12,13],through:[2,3,16],tile:[0,2,4,8,9,10,11,12,13,16],tileend:12,tileid:12,tileindex:12,tilemap:[11,16,17],tiles_per_metatil:12,tilesest:13,tileset:[0,1,8,10,11,16],tileset_checkerboard_fil:[],tilesetnam:12,tilesets_graph:10,tilesets_graphics_asm:10,tilesets_have_callback:[],tilesets_have_is_compress:[],tilesets_head:10,tilesets_headers_asm:10,tilesets_metatil:10,tilesets_metatiles_asm:10,tilestart:12,time:[2,4,6,7,8,9,12,13,15,16],timelaps:16,tint:12,titl:12,todo:[],togeth:[3,4,6,12,14],toggl:[6,12,14,16],toggld:16,toggleabl:16,too:[2,16],tool:[0,1,2,8,11,12,16],toolbar:[6,8],toolbutton:[14,15],top:[2,3,4,10,11,12,13,15,16],total:[2,7,10],tpl:16,track:[],tradit:8,trainer:[4,10,16],trainer_sight_or_berry_tree_id:16,trainer_typ:[10,16],trainer_type_norm:4,transform:12,transit:[2,4],transpar:[2,12,13,16],treat:[13,16],tree:[4,6,16],trigger:[0,9,10,12,13,16],tripl:[13,16],turn:16,two:[3,6,9,11,13,15],type:[0,1,4,5,9,10,11,12,13,16],typic:[2,4],ubuntu:16,unabl:2,unavail:4,uncheck:[11,12,13],uncommit:12,undefin:10,under:[2,10,11,12,13,16],underli:[12,16],underlin:12,underscor:[12,16],undertand:2,underw:16,undo:[0,2,4,8,11,12,14,16],undoabl:16,unexpect:16,unfortun:4,unhappi:11,uniq:7,uniqu:[4,11,13],unknown:16,unless:[10,12,13],unlik:2,unlock:4,unnecessari:16,unpredict:16,unreleas:0,unsav:16,until:[7,12],unus:[15,16],updat:[2,3,6,12,13,16],upon:[],upstream:16,url:16,usabl:8,usag:[2,15],use:[1,2,4,6,7,8,9,10,11,12,13,14,15,16],use_:10,use_custom_border_s:[6,12,16],use_encounter_json:[],use_poryscript:16,usecach:12,used:[2,3,4,5,6,9,10,12,13,14,15,16,17],useful:[3,4,5,6,12,15,16],user:[0,1,2,6,8,10,11,12,13,15,16],uses:[2,4,6,7,12,13,15,16],using:[2,4,6,8,10,12,13,14,15,16],usual:12,util:16,valid:[2,11,13,16],valu:[2,3,4,5,6,10,11,12,13,15,16],vanilla:[7,13],var_valu:16,vari:[],variabl:4,varieti:15,variou:[5,6,8,9,16],veri:[2,3,4,6,12],version:[2,4,5,6,8,12,13,16],vertic:[3,12,16],via:[6,12,16],video:17,view:[2,3,4,5,6,9,11,12,14,16],visibl:[4,6,12,16],vision:5,visual:[0,2,16],vscale:[12,16],wai:[3,4,6,12,13],wait:12,walk:[2,3,4,9],want:[7,11,12,13],warn:[4,12,13,16],warp:[0,9,13,15,16],wasn:16,watch:16,water:[12,15],waterfal:12,weather:[0,5,9,10,12,13,16],web:12,websit:16,were:[4,6,16],weren:16,west:[2,3],what:[0,2,4,5,6,9,11,13],wheel:6,when:[1,2,3,4,5,6,8,9,11,12,13,15,16],whenev:[2,6,12,15],where:[4,6,11,12,13,15,16],whether:[1,2,5,12,15,16],which:[1,2,3,5,6,7,9,11,12,13,15,16],whichev:6,white:[2,4,6],whose:[13,16],why:2,widget:16,width:[1,11,12,13,16],wiki:13,wild:[0,9,10,12,13,15,16],wild_encount:10,window:[0,1,4,5,6,7,8,11,12,13,15,16],window_geometri:[],window_st:[],within:[4,9,14,15],without:[6,11,12,16],woman:4,won:[2,12,16],word:12,work:[6,8,9,15,16],workflow:[6,8,12],would:[2,12,16],wouldn:16,wrap:6,write:[0,8,10,13,16],written:[13,16],wrong:16,wsl:16,xcoord:12,xdelta:12,xflip:[12,16],xoffset:[12,16],ycoord:12,ydelta:12,yes:10,yet:12,yflip:[12,16],yoffset:[12,16],you:[0,1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17],your:[1,3,4,5,6,7,8,9,10,11,12,13,14],yourself:[10,14],zoom:[2,6,11,14,16]},titles:["Porymap Documentation","Creating New Maps","Editing Map Collisions","Editing Map Connections","Editing Map Events","Editing Map Headers","Editing Map Tiles","Editing Wild Encounters","Introduction","Navigation","Project Files","The Region Map Editor","Scripting Capabilities","Porymap Settings","Shortcuts","The Tileset Editor","Changelog","Related Projects"],titleterms:{"break":16,"default":[],"function":12,"import":15,"new":[1,7],Added:16,Adding:[4,7],The:[11,15],Use:[],about:8,action:12,addit:[],advanc:15,allow:[],api:12,attribut:[],background:11,base:4,behavior:15,bike:[],border:6,bucket:6,button:4,callback:12,capabl:12,chang:[6,15,16],changelog:16,clone:4,collis:2,configur:7,connect:3,constant:12,creat:1,custom:12,delet:4,dive:3,document:0,edit:[2,3,4,5,6,7,12],editor:[9,11,12,14,15],elev:[],emerg:3,enabl:[],encount:[7,15],entri:11,escap:[],event:[4,13],field:7,file:[10,13],fill:6,fix:16,floor:[],follow:3,from:15,game:[],gener:13,get:8,global:13,group:7,header:[5,12],heal:4,healspot:4,hidden:4,identifi:13,imag:[11,15],introduct:8,iscompress:[],item:4,itemfind:[],label:15,layer:15,layout:11,list:9,locat:4,main:[9,14],map:[1,2,3,4,5,6,9,11,12,13,14,15],mask:[],menu:15,metatil:[6,15],mirror:3,navig:9,npc:[],number:15,object:4,open:4,option:[1,6],other:15,output:[],overlai:12,paint:2,palett:15,path:6,pencil:6,pointer:6,porymap:[0,8,13],poryscript:[],posit:4,prefab:6,prefer:[],project:[10,13,17],properti:15,quantiti:[],redo:6,region:[9,11,14],regist:12,relat:17,repsawn:[],requir:[],ruler:4,run:[],script:[4,12],secret:4,select:[2,6],separ:[],set:[12,13],shift:6,shortcut:14,show:[],sign:4,size:[],smart:6,start:8,straight:6,tab:11,terrain:15,text:[],tile:[6,15],tileset:[6,9,12,13,14,15],tool:[4,6,15],trigger:4,tripl:[],type:[2,15],undo:6,unreleas:16,util:12,version:[],visual:6,warp:[3,4],weather:4,wild:7,window:[9,14],write:12}}) \ No newline at end of file