diff --git a/.venv-sp/bin/Activate.ps1 b/.venv-sp/bin/Activate.ps1 new file mode 100644 index 0000000..b49d77b --- /dev/null +++ b/.venv-sp/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/.venv-sp/bin/activate b/.venv-sp/bin/activate new file mode 100644 index 0000000..c19ddd9 --- /dev/null +++ b/.venv-sp/bin/activate @@ -0,0 +1,70 @@ +# This file must be used with "source bin/activate" *from bash* +# You cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # Call hash to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + hash -r 2> /dev/null + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +# on Windows, a path can contain colons and backslashes and has to be converted: +if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then + # transform D:\path\to\venv to /d/path/to/venv on MSYS + # and to /cygdrive/d/path/to/venv on Cygwin + export VIRTUAL_ENV=$(cygpath "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp") +else + # use the path as-is + export VIRTUAL_ENV="/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp" +fi + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1="(.venv-sp) ${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT="(.venv-sp) " + export VIRTUAL_ENV_PROMPT +fi + +# Call hash to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +hash -r 2> /dev/null diff --git a/.venv-sp/bin/activate.csh b/.venv-sp/bin/activate.csh new file mode 100644 index 0000000..4c64f68 --- /dev/null +++ b/.venv-sp/bin/activate.csh @@ -0,0 +1,27 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. + +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = "(.venv-sp) $prompt" + setenv VIRTUAL_ENV_PROMPT "(.venv-sp) " +endif + +alias pydoc python -m pydoc + +rehash diff --git a/.venv-sp/bin/activate.fish b/.venv-sp/bin/activate.fish new file mode 100644 index 0000000..2be83e7 --- /dev/null +++ b/.venv-sp/bin/activate.fish @@ -0,0 +1,69 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/). You cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + set -e _OLD_FISH_PROMPT_OVERRIDE + # prevents error when using nested fish instances (Issue #93858) + if functions -q _old_fish_prompt + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) "(.venv-sp) " (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT "(.venv-sp) " +end diff --git a/.venv-sp/bin/bokeh b/.venv-sp/bin/bokeh new file mode 100755 index 0000000..bd9362d --- /dev/null +++ b/.venv-sp/bin/bokeh @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from bokeh.__main__ import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/debugpy b/.venv-sp/bin/debugpy new file mode 100755 index 0000000..010711f --- /dev/null +++ b/.venv-sp/bin/debugpy @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from debugpy.server.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/debugpy-adapter b/.venv-sp/bin/debugpy-adapter new file mode 100755 index 0000000..bea2b69 --- /dev/null +++ b/.venv-sp/bin/debugpy-adapter @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from debugpy.adapter.__main__ import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/dotenv b/.venv-sp/bin/dotenv new file mode 100755 index 0000000..68aaaed --- /dev/null +++ b/.venv-sp/bin/dotenv @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from dotenv.__main__ import cli +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli()) diff --git a/.venv-sp/bin/f2py b/.venv-sp/bin/f2py new file mode 100755 index 0000000..a517c22 --- /dev/null +++ b/.venv-sp/bin/f2py @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from numpy.f2py.f2py2e import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/fio b/.venv-sp/bin/fio new file mode 100755 index 0000000..dd37b2c --- /dev/null +++ b/.venv-sp/bin/fio @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from fiona.fio.main import main_group +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main_group()) diff --git a/.venv-sp/bin/fonttools b/.venv-sp/bin/fonttools new file mode 100755 index 0000000..a625f7d --- /dev/null +++ b/.venv-sp/bin/fonttools @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from fontTools.__main__ import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/httpx b/.venv-sp/bin/httpx new file mode 100755 index 0000000..6713f1a --- /dev/null +++ b/.venv-sp/bin/httpx @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from httpx import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/ipython b/.venv-sp/bin/ipython new file mode 100755 index 0000000..29f2096 --- /dev/null +++ b/.venv-sp/bin/ipython @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from IPython import start_ipython +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(start_ipython()) diff --git a/.venv-sp/bin/ipython3 b/.venv-sp/bin/ipython3 new file mode 100755 index 0000000..29f2096 --- /dev/null +++ b/.venv-sp/bin/ipython3 @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from IPython import start_ipython +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(start_ipython()) diff --git a/.venv-sp/bin/jupyter b/.venv-sp/bin/jupyter new file mode 100755 index 0000000..b183c43 --- /dev/null +++ b/.venv-sp/bin/jupyter @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from jupyter_core.command import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/jupyter-kernel b/.venv-sp/bin/jupyter-kernel new file mode 100755 index 0000000..3762715 --- /dev/null +++ b/.venv-sp/bin/jupyter-kernel @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from jupyter_client.kernelapp import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/jupyter-kernelspec b/.venv-sp/bin/jupyter-kernelspec new file mode 100755 index 0000000..ed9fb9b --- /dev/null +++ b/.venv-sp/bin/jupyter-kernelspec @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from jupyter_client.kernelspecapp import KernelSpecApp +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(KernelSpecApp.launch_instance()) diff --git a/.venv-sp/bin/jupyter-migrate b/.venv-sp/bin/jupyter-migrate new file mode 100755 index 0000000..7ddc1ea --- /dev/null +++ b/.venv-sp/bin/jupyter-migrate @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from jupyter_core.migrate import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/jupyter-run b/.venv-sp/bin/jupyter-run new file mode 100755 index 0000000..8d86513 --- /dev/null +++ b/.venv-sp/bin/jupyter-run @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from jupyter_client.runapp import RunApp +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(RunApp.launch_instance()) diff --git a/.venv-sp/bin/jupyter-troubleshoot b/.venv-sp/bin/jupyter-troubleshoot new file mode 100755 index 0000000..39e12bb --- /dev/null +++ b/.venv-sp/bin/jupyter-troubleshoot @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from jupyter_core.troubleshoot import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/mercantile b/.venv-sp/bin/mercantile new file mode 100755 index 0000000..171791c --- /dev/null +++ b/.venv-sp/bin/mercantile @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from mercantile.scripts import cli +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli()) diff --git a/.venv-sp/bin/normalizer b/.venv-sp/bin/normalizer new file mode 100755 index 0000000..5b4b3e9 --- /dev/null +++ b/.venv-sp/bin/normalizer @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from charset_normalizer.cli import cli_detect +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli_detect()) diff --git a/.venv-sp/bin/numpy-config b/.venv-sp/bin/numpy-config new file mode 100755 index 0000000..ccd693b --- /dev/null +++ b/.venv-sp/bin/numpy-config @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from numpy._configtool import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/pip b/.venv-sp/bin/pip new file mode 100755 index 0000000..d48f207 --- /dev/null +++ b/.venv-sp/bin/pip @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/pip3 b/.venv-sp/bin/pip3 new file mode 100755 index 0000000..d48f207 --- /dev/null +++ b/.venv-sp/bin/pip3 @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/pip3.12 b/.venv-sp/bin/pip3.12 new file mode 100755 index 0000000..d48f207 --- /dev/null +++ b/.venv-sp/bin/pip3.12 @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/pyftmerge b/.venv-sp/bin/pyftmerge new file mode 100755 index 0000000..0e67e4f --- /dev/null +++ b/.venv-sp/bin/pyftmerge @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from fontTools.merge import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/pyftsubset b/.venv-sp/bin/pyftsubset new file mode 100755 index 0000000..5a26da8 --- /dev/null +++ b/.venv-sp/bin/pyftsubset @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from fontTools.subset import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/pygmentize b/.venv-sp/bin/pygmentize new file mode 100755 index 0000000..b7d185d --- /dev/null +++ b/.venv-sp/bin/pygmentize @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from pygments.cmdline import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/pyproj b/.venv-sp/bin/pyproj new file mode 100755 index 0000000..75c2e33 --- /dev/null +++ b/.venv-sp/bin/pyproj @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from pyproj.__main__ import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/python b/.venv-sp/bin/python new file mode 120000 index 0000000..a4624ae --- /dev/null +++ b/.venv-sp/bin/python @@ -0,0 +1 @@ +/Users/dmatekenya/anaconda3/bin/python \ No newline at end of file diff --git a/.venv-sp/bin/python3 b/.venv-sp/bin/python3 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/.venv-sp/bin/python3 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/.venv-sp/bin/python3.12 b/.venv-sp/bin/python3.12 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/.venv-sp/bin/python3.12 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/.venv-sp/bin/rio b/.venv-sp/bin/rio new file mode 100755 index 0000000..270a0c7 --- /dev/null +++ b/.venv-sp/bin/rio @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from rasterio.rio.main import main_group +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main_group()) diff --git a/.venv-sp/bin/tqdm b/.venv-sp/bin/tqdm new file mode 100755 index 0000000..9509a79 --- /dev/null +++ b/.venv-sp/bin/tqdm @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from tqdm.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/bin/ttx b/.venv-sp/bin/ttx new file mode 100755 index 0000000..144b070 --- /dev/null +++ b/.venv-sp/bin/ttx @@ -0,0 +1,10 @@ +#!/bin/sh +'''exec' "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp/bin/python" "$0" "$@" +' ''' +# -*- coding: utf-8 -*- +import re +import sys +from fontTools.ttx import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv-sp/etc/jupyter/nbconfig/notebook.d/widgetsnbextension.json b/.venv-sp/etc/jupyter/nbconfig/notebook.d/widgetsnbextension.json new file mode 100644 index 0000000..7a17570 --- /dev/null +++ b/.venv-sp/etc/jupyter/nbconfig/notebook.d/widgetsnbextension.json @@ -0,0 +1,5 @@ +{ + "load_extensions": { + "jupyter-js-widgets/extension": true + } +} diff --git a/.venv-sp/pyvenv.cfg b/.venv-sp/pyvenv.cfg new file mode 100644 index 0000000..470741b --- /dev/null +++ b/.venv-sp/pyvenv.cfg @@ -0,0 +1,5 @@ +home = /Users/dmatekenya/anaconda3/bin +include-system-site-packages = false +version = 3.12.7 +executable = /Users/dmatekenya/anaconda3/bin/python3.12 +command = /Users/dmatekenya/anaconda3/bin/python -m venv /Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/.venv-sp diff --git a/.venv-sp/share/jupyter/kernels/python3/kernel.json b/.venv-sp/share/jupyter/kernels/python3/kernel.json new file mode 100644 index 0000000..cca38a4 --- /dev/null +++ b/.venv-sp/share/jupyter/kernels/python3/kernel.json @@ -0,0 +1,14 @@ +{ + "argv": [ + "python", + "-m", + "ipykernel_launcher", + "-f", + "{connection_file}" + ], + "display_name": "Python 3 (ipykernel)", + "language": "python", + "metadata": { + "debugger": true + } +} \ No newline at end of file diff --git a/.venv-sp/share/jupyter/kernels/python3/logo-32x32.png b/.venv-sp/share/jupyter/kernels/python3/logo-32x32.png new file mode 100644 index 0000000..be81330 Binary files /dev/null and b/.venv-sp/share/jupyter/kernels/python3/logo-32x32.png differ diff --git a/.venv-sp/share/jupyter/kernels/python3/logo-64x64.png b/.venv-sp/share/jupyter/kernels/python3/logo-64x64.png new file mode 100644 index 0000000..eebbff6 Binary files /dev/null and b/.venv-sp/share/jupyter/kernels/python3/logo-64x64.png differ diff --git a/.venv-sp/share/jupyter/kernels/python3/logo-svg.svg b/.venv-sp/share/jupyter/kernels/python3/logo-svg.svg new file mode 100644 index 0000000..467b07b --- /dev/null +++ b/.venv-sp/share/jupyter/kernels/python3/logo-svg.svg @@ -0,0 +1,265 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/install.json b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/install.json new file mode 100644 index 0000000..40c68e5 --- /dev/null +++ b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/install.json @@ -0,0 +1,5 @@ +{ + "packageManager": "python", + "packageName": "jupyterlab_widgets", + "uninstallInstructions": "Use your Python package manager (pip, conda, etc.) to uninstall the package jupyterlab_widgets" +} diff --git a/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/package.json b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/package.json new file mode 100644 index 0000000..f1f5a89 --- /dev/null +++ b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/package.json @@ -0,0 +1,102 @@ +{ + "name": "@jupyter-widgets/jupyterlab-manager", + "version": "5.0.15", + "description": "The JupyterLab extension providing Jupyter widgets.", + "keywords": [ + "jupyter", + "jupyterlab", + "jupyterlab notebook", + "jupyterlab-extension" + ], + "homepage": "https://github.com/jupyter-widgets/ipywidgets", + "bugs": { + "url": "https://github.com/jupyter-widgets/ipywidgets/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/jupyter-widgets/ipywidgets" + }, + "license": "BSD-3-Clause", + "author": "Project Jupyter", + "sideEffects": [ + "style/*.css" + ], + "main": "lib/index.js", + "types": "lib/index.d.ts", + "files": [ + "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}", + "style/**/*.{css,eot,gif,html,jpg,json,png,svg,woff2,ttf}", + "dist/*.js", + "schema/*.json" + ], + "scripts": { + "build": "jlpm build:lib && jlpm build:labextension:dev", + "build:labextension": "jupyter labextension build .", + "build:labextension:dev": "jupyter labextension build --development True .", + "build:lib": "tsc -b", + "build:prod": "jlpm build:lib && jlpm build:labextension", + "clean": "jlpm clean:lib", + "clean:all": "jlpm clean:lib && jlpm clean:labextension", + "clean:labextension": "rimraf labextension", + "clean:lib": "rimraf lib tsconfig.tsbuildinfo", + "eslint": "eslint . --ext .ts,.tsx --fix", + "eslint:check": "eslint . --ext .ts,.tsx", + "install:extension": "jlpm build", + "prepare": "jlpm clean && jlpm build:prod", + "watch": "jupyter labextension watch ." + }, + "dependencies": { + "@jupyter-widgets/base": "^6.0.11", + "@jupyter-widgets/base-manager": "^1.0.12", + "@jupyter-widgets/controls": "^5.0.12", + "@jupyter-widgets/output": "^6.0.11", + "@jupyterlab/application": "^3.0.0 || ^4.0.0", + "@jupyterlab/apputils": "^3.0.0 || ^4.0.0", + "@jupyterlab/console": "^3.0.0 || ^4.0.0", + "@jupyterlab/docregistry": "^3.0.0 || ^4.0.0", + "@jupyterlab/logconsole": "^3.0.0 || ^4.0.0", + "@jupyterlab/mainmenu": "^3.0.0 || ^4.0.0", + "@jupyterlab/nbformat": "^3.0.0 || ^4.0.0", + "@jupyterlab/notebook": "^3.0.0 || ^4.0.0", + "@jupyterlab/outputarea": "^3.0.0 || ^4.0.0", + "@jupyterlab/rendermime": "^3.0.0 || ^4.0.0", + "@jupyterlab/rendermime-interfaces": "^3.0.0 || ^4.0.0", + "@jupyterlab/services": "^6.0.0 || ^7.0.0", + "@jupyterlab/settingregistry": "^3.0.0 || ^4.0.0", + "@jupyterlab/translation": "^3.0.0 || ^4.0.0", + "@lumino/algorithm": "^1 || ^2", + "@lumino/coreutils": "^1 || ^2", + "@lumino/disposable": "^1 || ^2", + "@lumino/signaling": "^1 || ^2", + "@lumino/widgets": "^1 || ^2", + "@types/backbone": "1.4.14", + "jquery": "^3.1.1", + "semver": "^7.3.5" + }, + "devDependencies": { + "@jupyterlab/builder": "^3.0.0 || ^4.0.0", + "@jupyterlab/cells": "^3.0.0 || ^4.0.0", + "@types/jquery": "^3.5.16", + "@types/semver": "^7.3.6", + "@typescript-eslint/eslint-plugin": "^5.8.0", + "@typescript-eslint/parser": "^5.8.0", + "eslint": "^8.5.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "npm-run-all": "^4.1.5", + "prettier": "^2.3.2", + "rimraf": "^3.0.2", + "source-map-loader": "^4.0.1", + "typescript": "~4.9.4" + }, + "jupyterlab": { + "extension": true, + "outputDir": "labextension", + "schemaDir": "./schema", + "_build": { + "load": "static/remoteEntry.35b6c65bd99dab37b910.js", + "extension": "./extension" + } + }, + "gitHead": "efcf380707fd57050fc781e2ce991b557ec5ac0d" +} diff --git a/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/schemas/@jupyter-widgets/jupyterlab-manager/package.json.orig b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/schemas/@jupyter-widgets/jupyterlab-manager/package.json.orig new file mode 100644 index 0000000..5f22e25 --- /dev/null +++ b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/schemas/@jupyter-widgets/jupyterlab-manager/package.json.orig @@ -0,0 +1,98 @@ +{ + "name": "@jupyter-widgets/jupyterlab-manager", + "version": "5.0.15", + "description": "The JupyterLab extension providing Jupyter widgets.", + "keywords": [ + "jupyter", + "jupyterlab", + "jupyterlab notebook", + "jupyterlab-extension" + ], + "homepage": "https://github.com/jupyter-widgets/ipywidgets", + "bugs": { + "url": "https://github.com/jupyter-widgets/ipywidgets/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/jupyter-widgets/ipywidgets" + }, + "license": "BSD-3-Clause", + "author": "Project Jupyter", + "sideEffects": [ + "style/*.css" + ], + "main": "lib/index.js", + "types": "lib/index.d.ts", + "files": [ + "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}", + "style/**/*.{css,eot,gif,html,jpg,json,png,svg,woff2,ttf}", + "dist/*.js", + "schema/*.json" + ], + "scripts": { + "build": "jlpm build:lib && jlpm build:labextension:dev", + "build:labextension": "jupyter labextension build .", + "build:labextension:dev": "jupyter labextension build --development True .", + "build:lib": "tsc -b", + "build:prod": "jlpm build:lib && jlpm build:labextension", + "clean": "jlpm clean:lib", + "clean:all": "jlpm clean:lib && jlpm clean:labextension", + "clean:labextension": "rimraf labextension", + "clean:lib": "rimraf lib tsconfig.tsbuildinfo", + "eslint": "eslint . --ext .ts,.tsx --fix", + "eslint:check": "eslint . --ext .ts,.tsx", + "install:extension": "jlpm build", + "prepare": "jlpm clean && jlpm build:prod", + "watch": "jupyter labextension watch ." + }, + "dependencies": { + "@jupyter-widgets/base": "^6.0.11", + "@jupyter-widgets/base-manager": "^1.0.12", + "@jupyter-widgets/controls": "^5.0.12", + "@jupyter-widgets/output": "^6.0.11", + "@jupyterlab/application": "^3.0.0 || ^4.0.0", + "@jupyterlab/apputils": "^3.0.0 || ^4.0.0", + "@jupyterlab/console": "^3.0.0 || ^4.0.0", + "@jupyterlab/docregistry": "^3.0.0 || ^4.0.0", + "@jupyterlab/logconsole": "^3.0.0 || ^4.0.0", + "@jupyterlab/mainmenu": "^3.0.0 || ^4.0.0", + "@jupyterlab/nbformat": "^3.0.0 || ^4.0.0", + "@jupyterlab/notebook": "^3.0.0 || ^4.0.0", + "@jupyterlab/outputarea": "^3.0.0 || ^4.0.0", + "@jupyterlab/rendermime": "^3.0.0 || ^4.0.0", + "@jupyterlab/rendermime-interfaces": "^3.0.0 || ^4.0.0", + "@jupyterlab/services": "^6.0.0 || ^7.0.0", + "@jupyterlab/settingregistry": "^3.0.0 || ^4.0.0", + "@jupyterlab/translation": "^3.0.0 || ^4.0.0", + "@lumino/algorithm": "^1 || ^2", + "@lumino/coreutils": "^1 || ^2", + "@lumino/disposable": "^1 || ^2", + "@lumino/signaling": "^1 || ^2", + "@lumino/widgets": "^1 || ^2", + "@types/backbone": "1.4.14", + "jquery": "^3.1.1", + "semver": "^7.3.5" + }, + "devDependencies": { + "@jupyterlab/builder": "^3.0.0 || ^4.0.0", + "@jupyterlab/cells": "^3.0.0 || ^4.0.0", + "@types/jquery": "^3.5.16", + "@types/semver": "^7.3.6", + "@typescript-eslint/eslint-plugin": "^5.8.0", + "@typescript-eslint/parser": "^5.8.0", + "eslint": "^8.5.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "npm-run-all": "^4.1.5", + "prettier": "^2.3.2", + "rimraf": "^3.0.2", + "source-map-loader": "^4.0.1", + "typescript": "~4.9.4" + }, + "jupyterlab": { + "extension": true, + "outputDir": "labextension", + "schemaDir": "./schema" + }, + "gitHead": "efcf380707fd57050fc781e2ce991b557ec5ac0d" +} diff --git a/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/schemas/@jupyter-widgets/jupyterlab-manager/plugin.json b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/schemas/@jupyter-widgets/jupyterlab-manager/plugin.json new file mode 100644 index 0000000..1c45d80 --- /dev/null +++ b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/schemas/@jupyter-widgets/jupyterlab-manager/plugin.json @@ -0,0 +1,14 @@ +{ + "title": "Jupyter Widgets", + "description": "Jupyter widgets settings.", + "additionalProperties": false, + "properties": { + "saveState": { + "type": "boolean", + "title": "Save Jupyter widget state in notebooks", + "description": "Automatically save Jupyter widget state when a notebook is saved.", + "default": false + } + }, + "type": "object" +} diff --git a/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/327.d242f1a99504b2d5b629.js b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/327.d242f1a99504b2d5b629.js new file mode 100644 index 0000000..123f7a4 --- /dev/null +++ b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/327.d242f1a99504b2d5b629.js @@ -0,0 +1 @@ +(self.webpackChunk_jupyter_widgets_jupyterlab_manager=self.webpackChunk_jupyter_widgets_jupyterlab_manager||[]).push([[327],{6084:(e,t,o)=>{"use strict";o.r(t),o.d(t,{CONTROL_COMM_PROTOCOL_VERSION:()=>g,CONTROL_COMM_TARGET:()=>f,CONTROL_COMM_TIMEOUT:()=>p,ManagerBase:()=>v,base64ToBuffer:()=>d,bufferToBase64:()=>m,bufferToHex:()=>a,hexToBuffer:()=>i,serialize_state:()=>b});var s=o(7401),n=o(7262),r=o(7991);const l=["00","01","02","03","04","05","06","07","08","09","0A","0B","0C","0D","0E","0F","10","11","12","13","14","15","16","17","18","19","1A","1B","1C","1D","1E","1F","20","21","22","23","24","25","26","27","28","29","2A","2B","2C","2D","2E","2F","30","31","32","33","34","35","36","37","38","39","3A","3B","3C","3D","3E","3F","40","41","42","43","44","45","46","47","48","49","4A","4B","4C","4D","4E","4F","50","51","52","53","54","55","56","57","58","59","5A","5B","5C","5D","5E","5F","60","61","62","63","64","65","66","67","68","69","6A","6B","6C","6D","6E","6F","70","71","72","73","74","75","76","77","78","79","7A","7B","7C","7D","7E","7F","80","81","82","83","84","85","86","87","88","89","8A","8B","8C","8D","8E","8F","90","91","92","93","94","95","96","97","98","99","9A","9B","9C","9D","9E","9F","A0","A1","A2","A3","A4","A5","A6","A7","A8","A9","AA","AB","AC","AD","AE","AF","B0","B1","B2","B3","B4","B5","B6","B7","B8","B9","BA","BB","BC","BD","BE","BF","C0","C1","C2","C3","C4","C5","C6","C7","C8","C9","CA","CB","CC","CD","CE","CF","D0","D1","D2","D3","D4","D5","D6","D7","D8","D9","DA","DB","DC","DD","DE","DF","E0","E1","E2","E3","E4","E5","E6","E7","E8","E9","EA","EB","EC","ED","EE","EF","F0","F1","F2","F3","F4","F5","F6","F7","F8","F9","FA","FB","FC","FD","FE","FF"];function a(e){const t=new Uint8Array(e),o=[];for(let e=0;e/g,">");for(navigator&&"Microsoft Internet Explorer"===navigator.appName&&(r=r.replace(/(%[^\n]*)\n/g,"$1
\n"));t>e;)n[t]="",t--;return n[e]="@@"+s.length+"@@",o&&(r=o(r)),s.push(r),n}var u=o(7521),h=o.n(u);const w=s.PROTOCOL_VERSION.split(".",1)[0],f="jupyter.widget.control",g="1.0.0",p=4e3;class v{constructor(){this.comm_target_name="jupyter.widget",this._models=Object.create(null)}setViewOptions(e={}){return e}create_view(e,t={}){const o=(0,s.uuid)(),n=e.state_change=e.state_change.then((async()=>{const n=e.get("_view_name"),r=e.get("_view_module");try{const s=new(await this.loadViewClass(n,r,e.get("_view_module_version")))({model:e,options:this.setViewOptions(t)});return s.listenTo(e,"destroy",s.remove),await s.render(),s.once("remove",(()=>{e.views&&delete e.views[o]})),s}catch(o){console.error(`Could not create a view for model id ${e.model_id}`);const l=`Failed to create view for '${n}' from module '${r}' with model '${e.name}' from module '${e.module}'`,a=new(s.createErrorWidgetModel(o,l)),i=new s.ErrorWidgetView({model:a,options:this.setViewOptions(t)});return await i.render(),i}}));return e.views&&(e.views[o]=n),n}callbacks(e){return{}}async get_model(e){const t=this._models[e];if(void 0===t)throw new Error("widget model not found");return t}has_model(e){return void 0!==this._models[e]}handle_comm_open(e,t){const o=(t.metadata||{}).version||"";if(o.split(".",1)[0]!==w){const e=`Wrong widget protocol version: received protocol version '${o}', but was expecting major version '${w}'`;return console.error(e),Promise.reject(e)}const n=t.content.data,r=n.buffer_paths||[],l=t.buffers||[];return(0,s.put_buffers)(n.state,r,l),this.new_model({model_name:n.state._model_name,model_module:n.state._model_module,model_module_version:n.state._model_module_version,comm:e},n.state).catch((0,s.reject)("Could not create a model.",!0))}new_widget(e,t={}){let o;if(void 0===e.view_name||void 0===e.view_module||void 0===e.view_module_version)return Promise.reject("new_widget(...) must be given view information in the options.");o=e.comm?Promise.resolve(e.comm):this._create_comm(this.comm_target_name,e.model_id,{state:{_model_module:e.model_module,_model_module_version:e.model_module_version,_model_name:e.model_name,_view_module:e.view_module,_view_module_version:e.view_module_version,_view_name:e.view_name}},{version:s.PROTOCOL_VERSION});const n=Object.assign({},e);return o.then((e=>(n.comm=e,this.new_model(n,t).then((e=>(e.sync("create",e),e))))),(()=>(n.model_id||(n.model_id=(0,s.uuid)()),this.new_model(n,t))))}register_model(e,t){this._models[e]=t,t.then((t=>{t.once("comm:close",(()=>{delete this._models[e]}))}))}async new_model(e,t={}){var o,s;const n=null!==(o=e.model_id)&&void 0!==o?o:null===(s=e.comm)||void 0===s?void 0:s.comm_id;if(!n)throw new Error("Neither comm nor model_id provided in options object. At least one must exist.");e.model_id=n;const r=this._make_model(e,t);return this.register_model(n,r),await r}async _loadFromKernel(){let e,t;try{const o=await this._create_comm(f,(0,s.uuid)(),{},{version:g});await new Promise(((s,n)=>{o.on_msg((o=>{e=o.content.data,"update_states"===e.method?(t=(o.buffers||[]).map((e=>e instanceof DataView?e:new DataView(e instanceof ArrayBuffer?e:e.buffer))),s(null)):console.warn(`\n Unknown ${e.method} message on the Control channel\n `)})),o.on_close((()=>n("Control comm was closed too early"))),o.send({method:"request_states"},{}),setTimeout((()=>n("Control comm did not respond in time")),p)})),o.close()}catch(e){return this._loadFromKernelModels()}const o=e.states,n={},r={};for(let o=0;o({widget_id:e,comm:this.has_model(e)?void 0:await this._create_comm("jupyter.widget",e)}))));await Promise.all(l.map((async({widget_id:e,comm:t})=>{const l=o[e];e in n&&(0,s.put_buffers)(l,n[e],r[e]);try{if(t)await this.new_model({model_name:l.model_name,model_module:l.model_module,model_module_version:l.model_module_version,model_id:e,comm:t},l.state);else{const t=await this.get_model(e),o=await t.constructor._deserialize_state(l.state,this);t.set_state(o)}}catch(e){console.error(e)}})))}async _loadFromKernelModels(){const e=await this._get_comm_info(),t=await Promise.all(Object.keys(e).map((async e=>{if(this.has_model(e))return;const t=await this._create_comm(this.comm_target_name,e);let o="";const r=new n.PromiseDelegate;return t.on_msg((e=>{if(e.parent_header.msg_id===o&&"comm_msg"===e.header.msg_type&&"update"===e.content.data.method){const o=e.content.data,n=o.buffer_paths||[],l=e.buffers||[];(0,s.put_buffers)(o.state,n,l),r.resolve({comm:t,msg:e})}})),o=t.send({method:"request_state"},this.callbacks(void 0)),r.promise})));await Promise.all(t.map((async e=>{if(!e)return;const t=e.msg.content;await this.new_model({model_name:t.data.state._model_name,model_module:t.data.state._model_module,model_module_version:t.data.state._model_module_version,comm:e.comm},t.data.state)})))}async _make_model(e,t={}){const o=e.model_id,n=this.loadModelClass(e.model_name,e.model_module,e.model_module_version);let r;const l=(e,t)=>new(s.createErrorWidgetModel(e,t));try{r=await n}catch(e){const t="Could not instantiate widget";return console.error(t),l(e,t)}if(!r){const t="Could not instantiate widget";return console.error(t),l(new Error(`Cannot find model module ${e.model_module}@${e.model_module_version}, ${e.model_name}`),t)}let a;try{const s=await r._deserialize_state(t,this);a=new r(s,{widget_manager:this,model_id:o,comm:e.comm})}catch(t){console.error(t),a=l(t,`Model class '${e.model_name}' from module '${e.model_module}' is loaded but can not be instantiated`)}return a.name=e.model_name,a.module=e.model_module,a}clear_state(){return(0,s.resolvePromisesDict)(this._models).then((e=>{Object.keys(e).forEach((t=>e[t].close())),this._models=Object.create(null)}))}get_state(e={}){const t=Object.keys(this._models).map((e=>this._models[e]));return Promise.all(t).then((t=>b(t,e)))}set_state(e){if(!(e.version_major&&e.version_major<=2))throw"Unsupported widget state format";const t=e.state;return this._get_comm_info().then((e=>Promise.all(Object.keys(t).map((o=>{const n={base64:d,hex:i},r=t[o],l=r.state;if(r.buffers){const e=r.buffers.map((e=>e.path)),t=r.buffers.map((e=>new DataView(n[e.encoding](e.data))));(0,s.put_buffers)(r.state,e,t)}if(this.has_model(o))return this.get_model(o).then((e=>e.constructor._deserialize_state(l||{},this).then((t=>(e.set_state(t),e)))));const a={model_id:o,model_name:r.model_name,model_module:r.model_module,model_module_version:r.model_module_version};return Object.prototype.hasOwnProperty.call(e,"model_id")?this._create_comm(this.comm_target_name,o).then((e=>(a.comm=e,this.new_model(a)))):this.new_model(a,l)})))))}disconnect(){Object.keys(this._models).forEach((e=>{this._models[e].then((e=>{e.comm_live=!1}))}))}resolveUrl(e){return Promise.resolve(e)}inline_sanitize(e){const t=function(e){const t=[];let o,s=null,n=null,r=null,l=0;/`/.test(e)?(e=e.replace(/~/g,"~T").replace(/(^|[^\\])(`+)([^\n]*?[^`\n])\2(?!`)/gm,(e=>e.replace(/\$/g,"~D"))),o=e=>e.replace(/~([TD])/g,((e,t)=>"T"===t?"~":"$"))):o=e=>e;let a=e.replace(/\r\n?/g,"\n").split(_);for(let e=1,i=a.length;e{let o=n[t];return"\\\\("===o.substr(0,3)&&"\\\\)"===o.substr(o.length-3)?o="\\("+o.substring(3,o.length-3)+"\\)":"\\\\["===o.substr(0,3)&&"\\\\]"===o.substr(o.length-3)&&(o="\\["+o.substring(3,o.length-3)+"\\]"),o}))}async loadModelClass(e,t,o){try{const s=this.loadClass(e,t,o);return await s,s}catch(o){console.error(o);const n=`Failed to load model class '${e}' from module '${t}'`;return s.createErrorWidgetModel(o,n)}}async loadViewClass(e,t,o){try{const s=this.loadClass(e,t,o);return await s,s}catch(o){console.error(o);const n=`Failed to load view class '${e}' from module '${t}'`;return s.createErrorWidgetView(o,n)}}filterExistingModelState(e){let t=e.state;return t=Object.keys(t).filter((e=>!this.has_model(e))).reduce(((e,o)=>(e[o]=t[o],e)),{}),Object.assign(Object.assign({},e),{state:t})}}function b(e,t={}){const o={};return e.forEach((e=>{const n=e.model_id,r=(0,s.remove_buffers)(e.serialize(e.get_state(t.drop_defaults))),l=r.buffers.map(((e,t)=>({data:m(e),path:r.buffer_paths[t],encoding:"base64"})));o[n]={model_name:e.name,model_module:e.module,model_module_version:e.get("_model_module_version"),state:r.state},l.length>0&&(o[n].buffers=l)})),{version_major:2,version_minor:0,state:o}}},3215:()=>{},8892:()=>{},5324:()=>{},8645:()=>{},588:()=>{}}]); \ No newline at end of file diff --git a/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/420.23ab95819c045f6c36bc.js b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/420.23ab95819c045f6c36bc.js new file mode 100644 index 0000000..0c2d7a6 --- /dev/null +++ b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/420.23ab95819c045f6c36bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_jupyter_widgets_jupyterlab_manager=self.webpackChunk_jupyter_widgets_jupyterlab_manager||[]).push([[420],{4420:(e,t,u)=>{u.r(t),u.d(t,{OUTPUT_WIDGET_VERSION:()=>_,OutputModel:()=>d,OutputView:()=>l});var s=u(7401);const _="1.0.0";class d extends s.DOMWidgetModel{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"OutputModel",_view_name:"OutputView",_model_module:"@jupyter-widgets/output",_view_module:"@jupyter-widgets/output",_model_module_version:_,_view_module_version:_})}}class l extends s.DOMWidgetView{}}}]); \ No newline at end of file diff --git a/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/439.b350310d057b43cdd50f.js b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/439.b350310d057b43cdd50f.js new file mode 100644 index 0000000..d933436 --- /dev/null +++ b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/439.b350310d057b43cdd50f.js @@ -0,0 +1,2 @@ +/*! For license information please see 439.b350310d057b43cdd50f.js.LICENSE.txt */ +(self.webpackChunk_jupyter_widgets_jupyterlab_manager=self.webpackChunk_jupyter_widgets_jupyterlab_manager||[]).push([[439],{7991:(e,t)=>{"use strict";t.bg=function(e){var t,r,s=function(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var r=e.indexOf("=");return-1===r&&(r=t),[r,r===t?0:4-r%4]}(e),o=s[0],a=s[1],l=new i(function(e,t,r){return 3*(t+r)/4-r}(0,o,a)),c=0,u=a>0?o-4:o;for(r=0;r>16&255,l[c++]=t>>8&255,l[c++]=255&t;return 2===a&&(t=n[e.charCodeAt(r)]<<2|n[e.charCodeAt(r+1)]>>4,l[c++]=255&t),1===a&&(t=n[e.charCodeAt(r)]<<10|n[e.charCodeAt(r+1)]<<4|n[e.charCodeAt(r+2)]>>2,l[c++]=t>>8&255,l[c++]=255&t),l},t.iI=function(e){for(var t,n=e.length,i=n%3,s=[],o=16383,l=0,c=n-i;lc?c:l+o));return 1===i?(t=e[n-1],s.push(r[t>>2]+r[t<<4&63]+"==")):2===i&&(t=(e[n-2]<<8)+e[n-1],s.push(r[t>>10]+r[t>>4&63]+r[t<<2&63]+"=")),s.join("")};for(var r=[],n=[],i="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0;o<64;++o)r[o]=s[o],n[s.charCodeAt(o)]=o;function a(e,t,n){for(var i,s,o=[],a=t;a>18&63]+r[s>>12&63]+r[s>>6&63]+r[63&s]);return o.join("")}n["-".charCodeAt(0)]=62,n["_".charCodeAt(0)]=63},2743:e=>{"use strict";var t=function(e){return function(e){return!!e&&"object"==typeof e}(e)&&!function(e){var t=Object.prototype.toString.call(e);return"[object RegExp]"===t||"[object Date]"===t||function(e){return e.$$typeof===r}(e)}(e)},r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?a((r=e,Array.isArray(r)?[]:{}),e,t):e;var r}function i(e,t,r){return e.concat(t).map((function(e){return n(e,r)}))}function s(e){return Object.keys(e).concat(function(e){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter((function(t){return Object.propertyIsEnumerable.call(e,t)})):[]}(e))}function o(e,t){try{return t in e}catch(e){return!1}}function a(e,r,l){(l=l||{}).arrayMerge=l.arrayMerge||i,l.isMergeableObject=l.isMergeableObject||t,l.cloneUnlessOtherwiseSpecified=n;var c=Array.isArray(r);return c===Array.isArray(e)?c?l.arrayMerge(e,r,l):function(e,t,r){var i={};return r.isMergeableObject(e)&&s(e).forEach((function(t){i[t]=n(e[t],r)})),s(t).forEach((function(s){(function(e,t){return o(e,t)&&!(Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))})(e,s)||(o(e,s)&&r.isMergeableObject(t[s])?i[s]=function(e,t){if(!t.customMerge)return a;var r=t.customMerge(e);return"function"==typeof r?r:a}(s,r)(e[s],t[s],r):i[s]=n(t[s],r))})),i}(e,r,l):n(r,l)}a.all=function(e,t){if(!Array.isArray(e))throw new Error("first argument should be an array");return e.reduce((function(e,r){return a(e,r,t)}),{})};var l=a;e.exports=l},6593:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.attributeNames=t.elementNames=void 0,t.elementNames=new Map(["altGlyph","altGlyphDef","altGlyphItem","animateColor","animateMotion","animateTransform","clipPath","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","foreignObject","glyphRef","linearGradient","radialGradient","textPath"].map((function(e){return[e.toLowerCase(),e]}))),t.attributeNames=new Map(["definitionURL","attributeName","attributeType","baseFrequency","baseProfile","calcMode","clipPathUnits","diffuseConstant","edgeMode","filterUnits","glyphRef","gradientTransform","gradientUnits","kernelMatrix","kernelUnitLength","keyPoints","keySplines","keyTimes","lengthAdjust","limitingConeAngle","markerHeight","markerUnits","markerWidth","maskContentUnits","maskUnits","numOctaves","pathLength","patternContentUnits","patternTransform","patternUnits","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","refX","refY","repeatCount","repeatDur","requiredExtensions","requiredFeatures","specularConstant","specularExponent","spreadMethod","startOffset","stdDeviation","stitchTiles","surfaceScale","systemLanguage","tableValues","targetX","targetY","textLength","viewBox","viewTarget","xChannelSelector","yChannelSelector","zoomAndPan"].map((function(e){return[e.toLowerCase(),e]})))},5193:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r");case a.Comment:return"\x3c!--".concat(e.data,"--\x3e");case a.CDATA:return function(e){return"")}(e);case a.Script:case a.Style:case a.Tag:return function(e,t){var r;"foreign"===t.xmlMode&&(e.name=null!==(r=c.elementNames.get(e.name))&&void 0!==r?r:e.name,e.parent&&m.has(e.parent.name)&&(t=n(n({},t),{xmlMode:!1}))),!t.xmlMode&&g.has(e.name)&&(t=n(n({},t),{xmlMode:"foreign"}));var i="<".concat(e.name),s=function(e,t){var r;if(e){var n=!1===(null!==(r=t.encodeEntities)&&void 0!==r?r:t.decodeEntities)?h:t.xmlMode||"utf8"!==t.encodeEntities?l.encodeXML:l.escapeAttribute;return Object.keys(e).map((function(r){var i,s,o=null!==(i=e[r])&&void 0!==i?i:"";return"foreign"===t.xmlMode&&(r=null!==(s=c.attributeNames.get(r))&&void 0!==s?s:r),t.emptyAttrs||t.xmlMode||""!==o?"".concat(r,'="').concat(n(o),'"'):r})).join(" ")}}(e.attribs,t);return s&&(i+=" ".concat(s)),0===e.children.length&&(t.xmlMode?!1!==t.selfClosingTags:t.selfClosingTags&&d.has(e.name))?(t.xmlMode||(i+=" "),i+="/>"):(i+=">",e.children.length>0&&(i+=p(e.children,t)),!t.xmlMode&&d.has(e.name)||(i+=""))),i}(e,t);case a.Text:return function(e,t){var r,n=e.data||"";return!1===(null!==(r=t.encodeEntities)&&void 0!==r?r:t.decodeEntities)||!t.xmlMode&&e.parent&&u.has(e.parent.name)||(n=t.xmlMode||"utf8"!==t.encodeEntities?(0,l.encodeXML)(n):(0,l.escapeText)(n)),n}(e,t)}}t.render=p,t.default=p;var m=new Set(["mi","mo","mn","ms","mtext","annotation-xml","foreignObject","desc","title"]),g=new Set(["svg","math"])},3338:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.Doctype=t.CDATA=t.Tag=t.Style=t.Script=t.Comment=t.Directive=t.Text=t.Root=t.isTag=t.ElementType=void 0,function(e){e.Root="root",e.Text="text",e.Directive="directive",e.Comment="comment",e.Script="script",e.Style="style",e.Tag="tag",e.CDATA="cdata",e.Doctype="doctype"}(r=t.ElementType||(t.ElementType={})),t.isTag=function(e){return e.type===r.Tag||e.type===r.Script||e.type===r.Style},t.Root=r.Root,t.Text=r.Text,t.Directive=r.Directive,t.Comment=r.Comment,t.Script=r.Script,t.Style=r.Style,t.Tag=r.Tag,t.CDATA=r.CDATA,t.Doctype=r.Doctype},1138:function(e,t,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,i)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||n(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.DomHandler=void 0;var s=r(3338),o=r(2888);i(r(2888),t);var a={withStartIndices:!1,withEndIndices:!1,xmlMode:!1},l=function(){function e(e,t,r){this.dom=[],this.root=new o.Document(this.dom),this.done=!1,this.tagStack=[this.root],this.lastNode=null,this.parser=null,"function"==typeof t&&(r=t,t=a),"object"==typeof e&&(t=e,e=void 0),this.callback=null!=e?e:null,this.options=null!=t?t:a,this.elementCB=null!=r?r:null}return e.prototype.onparserinit=function(e){this.parser=e},e.prototype.onreset=function(){this.dom=[],this.root=new o.Document(this.dom),this.done=!1,this.tagStack=[this.root],this.lastNode=null,this.parser=null},e.prototype.onend=function(){this.done||(this.done=!0,this.parser=null,this.handleCallback(null))},e.prototype.onerror=function(e){this.handleCallback(e)},e.prototype.onclosetag=function(){this.lastNode=null;var e=this.tagStack.pop();this.options.withEndIndices&&(e.endIndex=this.parser.endIndex),this.elementCB&&this.elementCB(e)},e.prototype.onopentag=function(e,t){var r=this.options.xmlMode?s.ElementType.Tag:void 0,n=new o.Element(e,t,void 0,r);this.addNode(n),this.tagStack.push(n)},e.prototype.ontext=function(e){var t=this.lastNode;if(t&&t.type===s.ElementType.Text)t.data+=e,this.options.withEndIndices&&(t.endIndex=this.parser.endIndex);else{var r=new o.Text(e);this.addNode(r),this.lastNode=r}},e.prototype.oncomment=function(e){if(this.lastNode&&this.lastNode.type===s.ElementType.Comment)this.lastNode.data+=e;else{var t=new o.Comment(e);this.addNode(t),this.lastNode=t}},e.prototype.oncommentend=function(){this.lastNode=null},e.prototype.oncdatastart=function(){var e=new o.Text(""),t=new o.CDATA([e]);this.addNode(t),e.parent=t,this.lastNode=e},e.prototype.oncdataend=function(){this.lastNode=null},e.prototype.onprocessinginstruction=function(e,t){var r=new o.ProcessingInstruction(e,t);this.addNode(r)},e.prototype.handleCallback=function(e){if("function"==typeof this.callback)this.callback(e,this.dom);else if(e)throw e},e.prototype.addNode=function(e){var t=this.tagStack[this.tagStack.length-1],r=t.children[t.children.length-1];this.options.withStartIndices&&(e.startIndex=this.parser.startIndex),this.options.withEndIndices&&(e.endIndex=this.parser.endIndex),t.children.push(e),r&&(e.prev=r,r.next=e),e.parent=t,this.lastNode=null},e}();t.DomHandler=l,t.default=l},2888:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),s=this&&this.__assign||function(){return s=Object.assign||function(e){for(var t,r=1,n=arguments.length;r0?this.children[this.children.length-1]:null},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"childNodes",{get:function(){return this.children},set:function(e){this.children=e},enumerable:!1,configurable:!0}),t}(a);t.NodeWithChildren=d;var p=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.type=o.ElementType.CDATA,t}return i(t,e),Object.defineProperty(t.prototype,"nodeType",{get:function(){return 4},enumerable:!1,configurable:!0}),t}(d);t.CDATA=p;var f=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.type=o.ElementType.Root,t}return i(t,e),Object.defineProperty(t.prototype,"nodeType",{get:function(){return 9},enumerable:!1,configurable:!0}),t}(d);t.Document=f;var m=function(e){function t(t,r,n,i){void 0===n&&(n=[]),void 0===i&&(i="script"===t?o.ElementType.Script:"style"===t?o.ElementType.Style:o.ElementType.Tag);var s=e.call(this,n)||this;return s.name=t,s.attribs=r,s.type=i,s}return i(t,e),Object.defineProperty(t.prototype,"nodeType",{get:function(){return 1},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"tagName",{get:function(){return this.name},set:function(e){this.name=e},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"attributes",{get:function(){var e=this;return Object.keys(this.attribs).map((function(t){var r,n;return{name:t,value:e.attribs[t],namespace:null===(r=e["x-attribsNamespace"])||void 0===r?void 0:r[t],prefix:null===(n=e["x-attribsPrefix"])||void 0===n?void 0:n[t]}}))},enumerable:!1,configurable:!0}),t}(d);function g(e){return(0,o.isTag)(e)}function b(e){return e.type===o.ElementType.CDATA}function y(e){return e.type===o.ElementType.Text}function v(e){return e.type===o.ElementType.Comment}function w(e){return e.type===o.ElementType.Directive}function x(e){return e.type===o.ElementType.Root}function S(e,t){var r;if(void 0===t&&(t=!1),y(e))r=new c(e.data);else if(v(e))r=new u(e.data);else if(g(e)){var n=t?T(e.children):[],i=new m(e.name,s({},e.attribs),n);n.forEach((function(e){return e.parent=i})),null!=e.namespace&&(i.namespace=e.namespace),e["x-attribsNamespace"]&&(i["x-attribsNamespace"]=s({},e["x-attribsNamespace"])),e["x-attribsPrefix"]&&(i["x-attribsPrefix"]=s({},e["x-attribsPrefix"])),r=i}else if(b(e)){n=t?T(e.children):[];var o=new p(n);n.forEach((function(e){return e.parent=o})),r=o}else if(x(e)){n=t?T(e.children):[];var a=new f(n);n.forEach((function(e){return e.parent=a})),e["x-mode"]&&(a["x-mode"]=e["x-mode"]),r=a}else{if(!w(e))throw new Error("Not implemented yet: ".concat(e.type));var l=new h(e.name,e.data);null!=e["x-name"]&&(l["x-name"]=e["x-name"],l["x-publicId"]=e["x-publicId"],l["x-systemId"]=e["x-systemId"]),r=l}return r.startIndex=e.startIndex,r.endIndex=e.endIndex,null!=e.sourceCodeLocation&&(r.sourceCodeLocation=e.sourceCodeLocation),r}function T(e){for(var t=e.map((function(e){return S(e,!0)})),r=1;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getFeed=void 0;var n=r(8642),i=r(8052);t.getFeed=function(e){var t=l(h,e);return t?"feed"===t.name?function(e){var t,r=e.children,n={type:"atom",items:(0,i.getElementsByTagName)("entry",r).map((function(e){var t,r=e.children,n={media:a(r)};u(n,"id","id",r),u(n,"title","title",r);var i=null===(t=l("link",r))||void 0===t?void 0:t.attribs.href;i&&(n.link=i);var s=c("summary",r)||c("content",r);s&&(n.description=s);var o=c("updated",r);return o&&(n.pubDate=new Date(o)),n}))};u(n,"id","id",r),u(n,"title","title",r);var s=null===(t=l("link",r))||void 0===t?void 0:t.attribs.href;s&&(n.link=s),u(n,"description","subtitle",r);var o=c("updated",r);return o&&(n.updated=new Date(o)),u(n,"author","email",r,!0),n}(t):function(e){var t,r,n=null!==(r=null===(t=l("channel",e.children))||void 0===t?void 0:t.children)&&void 0!==r?r:[],s={type:e.name.substr(0,3),id:"",items:(0,i.getElementsByTagName)("item",e.children).map((function(e){var t=e.children,r={media:a(t)};u(r,"id","guid",t),u(r,"title","title",t),u(r,"link","link",t),u(r,"description","description",t);var n=c("pubDate",t)||c("dc:date",t);return n&&(r.pubDate=new Date(n)),r}))};u(s,"title","title",n),u(s,"link","link",n),u(s,"description","description",n);var o=c("lastBuildDate",n);return o&&(s.updated=new Date(o)),u(s,"author","managingEditor",n,!0),s}(t):null};var s=["url","type","lang"],o=["fileSize","bitrate","framerate","samplingrate","channels","duration","height","width"];function a(e){return(0,i.getElementsByTagName)("media:content",e).map((function(e){for(var t=e.attribs,r={medium:t.medium,isDefault:!!t.isDefault},n=0,i=s;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.uniqueSort=t.compareDocumentPosition=t.DocumentPosition=t.removeSubsets=void 0;var n,i=r(1138);function s(e,t){var r=[],s=[];if(e===t)return 0;for(var o=(0,i.hasChildren)(e)?e:e.parent;o;)r.unshift(o),o=o.parent;for(o=(0,i.hasChildren)(t)?t:t.parent;o;)s.unshift(o),o=o.parent;for(var a=Math.min(r.length,s.length),l=0;lu.indexOf(d)?c===t?n.FOLLOWING|n.CONTAINED_BY:n.FOLLOWING:c===e?n.PRECEDING|n.CONTAINS:n.PRECEDING}t.removeSubsets=function(e){for(var t=e.length;--t>=0;){var r=e[t];if(t>0&&e.lastIndexOf(r,t-1)>=0)e.splice(t,1);else for(var n=r.parent;n;n=n.parent)if(e.includes(n)){e.splice(t,1);break}}return e},function(e){e[e.DISCONNECTED=1]="DISCONNECTED",e[e.PRECEDING=2]="PRECEDING",e[e.FOLLOWING=4]="FOLLOWING",e[e.CONTAINS=8]="CONTAINS",e[e.CONTAINED_BY=16]="CONTAINED_BY"}(n=t.DocumentPosition||(t.DocumentPosition={})),t.compareDocumentPosition=s,t.uniqueSort=function(e){return(e=e.filter((function(e,t,r){return!r.includes(e,t+1)}))).sort((function(e,t){var r=s(e,t);return r&n.PRECEDING?-1:r&n.FOLLOWING?1:0})),e}},6403:function(e,t,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,i)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||n(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.hasChildren=t.isDocument=t.isComment=t.isText=t.isCDATA=t.isTag=void 0,i(r(8642),t),i(r(5517),t),i(r(6178),t),i(r(1467),t),i(r(8052),t),i(r(3698),t),i(r(1206),t);var s=r(1138);Object.defineProperty(t,"isTag",{enumerable:!0,get:function(){return s.isTag}}),Object.defineProperty(t,"isCDATA",{enumerable:!0,get:function(){return s.isCDATA}}),Object.defineProperty(t,"isText",{enumerable:!0,get:function(){return s.isText}}),Object.defineProperty(t,"isComment",{enumerable:!0,get:function(){return s.isComment}}),Object.defineProperty(t,"isDocument",{enumerable:!0,get:function(){return s.isDocument}}),Object.defineProperty(t,"hasChildren",{enumerable:!0,get:function(){return s.hasChildren}})},8052:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getElementsByTagType=t.getElementsByTagName=t.getElementById=t.getElements=t.testElement=void 0;var n=r(1138),i=r(1467),s={tag_name:function(e){return"function"==typeof e?function(t){return(0,n.isTag)(t)&&e(t.name)}:"*"===e?n.isTag:function(t){return(0,n.isTag)(t)&&t.name===e}},tag_type:function(e){return"function"==typeof e?function(t){return e(t.type)}:function(t){return t.type===e}},tag_contains:function(e){return"function"==typeof e?function(t){return(0,n.isText)(t)&&e(t.data)}:function(t){return(0,n.isText)(t)&&t.data===e}}};function o(e,t){return"function"==typeof t?function(r){return(0,n.isTag)(r)&&t(r.attribs[e])}:function(r){return(0,n.isTag)(r)&&r.attribs[e]===t}}function a(e,t){return function(r){return e(r)||t(r)}}function l(e){var t=Object.keys(e).map((function(t){var r=e[t];return Object.prototype.hasOwnProperty.call(s,t)?s[t](r):o(t,r)}));return 0===t.length?null:t.reduce(a)}t.testElement=function(e,t){var r=l(e);return!r||r(t)},t.getElements=function(e,t,r,n){void 0===n&&(n=1/0);var s=l(e);return s?(0,i.filter)(s,t,r,n):[]},t.getElementById=function(e,t,r){return void 0===r&&(r=!0),Array.isArray(t)||(t=[t]),(0,i.findOne)(o("id",e),t,r)},t.getElementsByTagName=function(e,t,r,n){return void 0===r&&(r=!0),void 0===n&&(n=1/0),(0,i.filter)(s.tag_name(e),t,r,n)},t.getElementsByTagType=function(e,t,r,n){return void 0===r&&(r=!0),void 0===n&&(n=1/0),(0,i.filter)(s.tag_type(e),t,r,n)}},6178:(e,t)=>{"use strict";function r(e){if(e.prev&&(e.prev.next=e.next),e.next&&(e.next.prev=e.prev),e.parent){var t=e.parent.children,r=t.lastIndexOf(e);r>=0&&t.splice(r,1)}e.next=null,e.prev=null,e.parent=null}Object.defineProperty(t,"__esModule",{value:!0}),t.prepend=t.prependChild=t.append=t.appendChild=t.replaceElement=t.removeElement=void 0,t.removeElement=r,t.replaceElement=function(e,t){var r=t.prev=e.prev;r&&(r.next=t);var n=t.next=e.next;n&&(n.prev=t);var i=t.parent=e.parent;if(i){var s=i.children;s[s.lastIndexOf(e)]=t,e.parent=null}},t.appendChild=function(e,t){if(r(t),t.next=null,t.parent=e,e.children.push(t)>1){var n=e.children[e.children.length-2];n.next=t,t.prev=n}else t.prev=null},t.append=function(e,t){r(t);var n=e.parent,i=e.next;if(t.next=i,t.prev=e,e.next=t,t.parent=n,i){if(i.prev=t,n){var s=n.children;s.splice(s.lastIndexOf(i),0,t)}}else n&&n.children.push(t)},t.prependChild=function(e,t){if(r(t),t.parent=e,t.prev=null,1!==e.children.unshift(t)){var n=e.children[1];n.prev=t,t.next=n}else t.next=null},t.prepend=function(e,t){r(t);var n=e.parent;if(n){var i=n.children;i.splice(i.indexOf(e),0,t)}e.prev&&(e.prev.next=t),t.parent=n,t.prev=e.prev,t.next=e,e.prev=t}},1467:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.findAll=t.existsOne=t.findOne=t.findOneChild=t.find=t.filter=void 0;var n=r(1138);function i(e,t,r,i){for(var s=[],o=[t],a=[0];;)if(a[0]>=o[0].length){if(1===a.length)return s;o.shift(),a.shift()}else{var l=o[0][a[0]++];if(e(l)&&(s.push(l),--i<=0))return s;r&&(0,n.hasChildren)(l)&&l.children.length>0&&(a.unshift(0),o.unshift(l.children))}}t.filter=function(e,t,r,n){return void 0===r&&(r=!0),void 0===n&&(n=1/0),i(e,Array.isArray(t)?t:[t],r,n)},t.find=i,t.findOneChild=function(e,t){return t.find(e)},t.findOne=function e(t,r,i){void 0===i&&(i=!0);for(var s=null,o=0;o0&&(s=e(t,a.children,!0)))}return s},t.existsOne=function e(t,r){return r.some((function(r){return(0,n.isTag)(r)&&(t(r)||e(t,r.children))}))},t.findAll=function(e,t){for(var r=[],i=[t],s=[0];;)if(s[0]>=i[0].length){if(1===i.length)return r;i.shift(),s.shift()}else{var o=i[0][s[0]++];(0,n.isTag)(o)&&(e(o)&&r.push(o),o.children.length>0&&(s.unshift(0),i.unshift(o.children)))}}},8642:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.innerText=t.textContent=t.getText=t.getInnerHTML=t.getOuterHTML=void 0;var i=r(1138),s=n(r(5193)),o=r(3338);function a(e,t){return(0,s.default)(e,t)}t.getOuterHTML=a,t.getInnerHTML=function(e,t){return(0,i.hasChildren)(e)?e.children.map((function(e){return a(e,t)})).join(""):""},t.getText=function e(t){return Array.isArray(t)?t.map(e).join(""):(0,i.isTag)(t)?"br"===t.name?"\n":e(t.children):(0,i.isCDATA)(t)?e(t.children):(0,i.isText)(t)?t.data:""},t.textContent=function e(t){return Array.isArray(t)?t.map(e).join(""):(0,i.hasChildren)(t)&&!(0,i.isComment)(t)?e(t.children):(0,i.isText)(t)?t.data:""},t.innerText=function e(t){return Array.isArray(t)?t.map(e).join(""):(0,i.hasChildren)(t)&&(t.type===o.ElementType.Tag||(0,i.isCDATA)(t))?e(t.children):(0,i.isText)(t)?t.data:""}},5517:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.prevElementSibling=t.nextElementSibling=t.getName=t.hasAttrib=t.getAttributeValue=t.getSiblings=t.getParent=t.getChildren=void 0;var n=r(1138);function i(e){return(0,n.hasChildren)(e)?e.children:[]}function s(e){return e.parent||null}t.getChildren=i,t.getParent=s,t.getSiblings=function(e){var t=s(e);if(null!=t)return i(t);for(var r=[e],n=e.prev,o=e.next;null!=n;)r.unshift(n),n=n.prev;for(;null!=o;)r.push(o),o=o.next;return r},t.getAttributeValue=function(e,t){var r;return null===(r=e.attribs)||void 0===r?void 0:r[t]},t.hasAttrib=function(e,t){return null!=e.attribs&&Object.prototype.hasOwnProperty.call(e.attribs,t)&&null!=e.attribs[t]},t.getName=function(e){return e.name},t.nextElementSibling=function(e){for(var t=e.next;null!==t&&!(0,n.isTag)(t);)t=t.next;return t},t.prevElementSibling=function(e){for(var t=e.prev;null!==t&&!(0,n.isTag)(t);)t=t.prev;return t}},3379:function(e,t,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,i)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&n(t,e,r);return i(t,e),t},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.decodeXML=t.decodeHTMLStrict=t.decodeHTMLAttribute=t.decodeHTML=t.determineBranch=t.EntityDecoder=t.DecodingMode=t.BinTrieFlags=t.fromCodePoint=t.replaceCodePoint=t.decodeCodePoint=t.xmlDecodeTree=t.htmlDecodeTree=void 0;var a=o(r(7346));t.htmlDecodeTree=a.default;var l=o(r(8622));t.xmlDecodeTree=l.default;var c=s(r(2809));t.decodeCodePoint=c.default;var u,h,d,p,f=r(2809);function m(e){return e>=u.ZERO&&e<=u.NINE}Object.defineProperty(t,"replaceCodePoint",{enumerable:!0,get:function(){return f.replaceCodePoint}}),Object.defineProperty(t,"fromCodePoint",{enumerable:!0,get:function(){return f.fromCodePoint}}),function(e){e[e.NUM=35]="NUM",e[e.SEMI=59]="SEMI",e[e.EQUALS=61]="EQUALS",e[e.ZERO=48]="ZERO",e[e.NINE=57]="NINE",e[e.LOWER_A=97]="LOWER_A",e[e.LOWER_F=102]="LOWER_F",e[e.LOWER_X=120]="LOWER_X",e[e.LOWER_Z=122]="LOWER_Z",e[e.UPPER_A=65]="UPPER_A",e[e.UPPER_F=70]="UPPER_F",e[e.UPPER_Z=90]="UPPER_Z"}(u||(u={})),function(e){e[e.VALUE_LENGTH=49152]="VALUE_LENGTH",e[e.BRANCH_LENGTH=16256]="BRANCH_LENGTH",e[e.JUMP_TABLE=127]="JUMP_TABLE"}(h=t.BinTrieFlags||(t.BinTrieFlags={})),function(e){e[e.EntityStart=0]="EntityStart",e[e.NumericStart=1]="NumericStart",e[e.NumericDecimal=2]="NumericDecimal",e[e.NumericHex=3]="NumericHex",e[e.NamedEntity=4]="NamedEntity"}(d||(d={})),function(e){e[e.Legacy=0]="Legacy",e[e.Strict=1]="Strict",e[e.Attribute=2]="Attribute"}(p=t.DecodingMode||(t.DecodingMode={}));var g=function(){function e(e,t,r){this.decodeTree=e,this.emitCodePoint=t,this.errors=r,this.state=d.EntityStart,this.consumed=1,this.result=0,this.treeIndex=0,this.excess=1,this.decodeMode=p.Strict}return e.prototype.startEntity=function(e){this.decodeMode=e,this.state=d.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1},e.prototype.write=function(e,t){switch(this.state){case d.EntityStart:return e.charCodeAt(t)===u.NUM?(this.state=d.NumericStart,this.consumed+=1,this.stateNumericStart(e,t+1)):(this.state=d.NamedEntity,this.stateNamedEntity(e,t));case d.NumericStart:return this.stateNumericStart(e,t);case d.NumericDecimal:return this.stateNumericDecimal(e,t);case d.NumericHex:return this.stateNumericHex(e,t);case d.NamedEntity:return this.stateNamedEntity(e,t)}},e.prototype.stateNumericStart=function(e,t){return t>=e.length?-1:(32|e.charCodeAt(t))===u.LOWER_X?(this.state=d.NumericHex,this.consumed+=1,this.stateNumericHex(e,t+1)):(this.state=d.NumericDecimal,this.stateNumericDecimal(e,t))},e.prototype.addToNumericResult=function(e,t,r,n){if(t!==r){var i=r-t;this.result=this.result*Math.pow(n,i)+parseInt(e.substr(t,i),n),this.consumed+=i}},e.prototype.stateNumericHex=function(e,t){for(var r,n=t;t=u.UPPER_A&&r<=u.UPPER_F||r>=u.LOWER_A&&r<=u.LOWER_F)))return this.addToNumericResult(e,n,t,16),this.emitNumericEntity(i,3);t+=1}return this.addToNumericResult(e,n,t,16),-1},e.prototype.stateNumericDecimal=function(e,t){for(var r=t;t>14;t=u.UPPER_A&&e<=u.UPPER_Z||e>=u.LOWER_A&&e<=u.LOWER_Z||m(e)}(o)))?0:this.emitNotTerminatedNamedEntity();if(0!=(i=((n=r[this.treeIndex])&h.VALUE_LENGTH)>>14)){if(s===u.SEMI)return this.emitNamedEntityData(this.treeIndex,i,this.consumed+this.excess);this.decodeMode!==p.Strict&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}}var o;return-1},e.prototype.emitNotTerminatedNamedEntity=function(){var e,t=this.result,r=(this.decodeTree[t]&h.VALUE_LENGTH)>>14;return this.emitNamedEntityData(t,r,this.consumed),null===(e=this.errors)||void 0===e||e.missingSemicolonAfterCharacterReference(),this.consumed},e.prototype.emitNamedEntityData=function(e,t,r){var n=this.decodeTree;return this.emitCodePoint(1===t?n[e]&~h.VALUE_LENGTH:n[e+1],r),3===t&&this.emitCodePoint(n[e+2],r),r},e.prototype.end=function(){var e;switch(this.state){case d.NamedEntity:return 0===this.result||this.decodeMode===p.Attribute&&this.result!==this.treeIndex?0:this.emitNotTerminatedNamedEntity();case d.NumericDecimal:return this.emitNumericEntity(0,2);case d.NumericHex:return this.emitNumericEntity(0,3);case d.NumericStart:return null===(e=this.errors)||void 0===e||e.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case d.EntityStart:return 0}},e}();function b(e){var t="",r=new g(e,(function(e){return t+=(0,c.fromCodePoint)(e)}));return function(e,n){for(var i=0,s=0;(s=e.indexOf("&",s))>=0;){t+=e.slice(i,s),r.startEntity(n);var o=r.write(e,s+1);if(o<0){i=s+r.end();break}i=s+o,s=0===o?i+1:i}var a=t+e.slice(i);return t="",a}}function y(e,t,r,n){var i=(t&h.BRANCH_LENGTH)>>7,s=t&h.JUMP_TABLE;if(0===i)return 0!==s&&n===s?r:-1;if(s){var o=n-s;return o<0||o>=i?-1:e[r+o]-1}for(var a=r,l=a+i-1;a<=l;){var c=a+l>>>1,u=e[c];if(un))return e[c+i];l=c-1}}return-1}t.EntityDecoder=g,t.determineBranch=y;var v=b(a.default),w=b(l.default);t.decodeHTML=function(e,t){return void 0===t&&(t=p.Legacy),v(e,t)},t.decodeHTMLAttribute=function(e){return v(e,p.Attribute)},t.decodeHTMLStrict=function(e){return v(e,p.Strict)},t.decodeXML=function(e){return w(e,p.Strict)}},2809:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.replaceCodePoint=t.fromCodePoint=void 0;var n=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]);function i(e){var t;return e>=55296&&e<=57343||e>1114111?65533:null!==(t=n.get(e))&&void 0!==t?t:e}t.fromCodePoint=null!==(r=String.fromCodePoint)&&void 0!==r?r:function(e){var t="";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|1023&e),t+String.fromCharCode(e)},t.replaceCodePoint=i,t.default=function(e){return(0,t.fromCodePoint)(i(e))}},3231:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.encodeNonAsciiHTML=t.encodeHTML=void 0;var i=n(r(8635)),s=r(7078),o=/[\t\n!-,./:-@[-`\f{-}$\x80-\uFFFF]/g;function a(e,t){for(var r,n="",o=0;null!==(r=e.exec(t));){var a=r.index;n+=t.substring(o,a);var l=t.charCodeAt(a),c=i.default.get(l);if("object"==typeof c){if(a+1{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.escapeText=t.escapeAttribute=t.escapeUTF8=t.escape=t.encodeXML=t.getCodePoint=t.xmlReplacer=void 0,t.xmlReplacer=/["&'<>$\x80-\uFFFF]/g;var r=new Map([[34,"""],[38,"&"],[39,"'"],[60,"<"],[62,">"]]);function n(e){for(var n,i="",s=0;null!==(n=t.xmlReplacer.exec(e));){var o=n.index,a=e.charCodeAt(o),l=r.get(a);void 0!==l?(i+=e.substring(s,o)+l,s=o+1):(i+="".concat(e.substring(s,o),"&#x").concat((0,t.getCodePoint)(e,o).toString(16),";"),s=t.xmlReplacer.lastIndex+=Number(55296==(64512&a)))}return i+e.substr(s)}function i(e,t){return function(r){for(var n,i=0,s="";n=e.exec(r);)i!==n.index&&(s+=r.substring(i,n.index)),s+=t.get(n[0].charCodeAt(0)),i=n.index+1;return s+r.substring(i)}}t.getCodePoint=null!=String.prototype.codePointAt?function(e,t){return e.codePointAt(t)}:function(e,t){return 55296==(64512&e.charCodeAt(t))?1024*(e.charCodeAt(t)-55296)+e.charCodeAt(t+1)-56320+65536:e.charCodeAt(t)},t.encodeXML=n,t.escape=n,t.escapeUTF8=i(/[&<>'"]/g,r),t.escapeAttribute=i(/["&\u00A0]/g,new Map([[34,"""],[38,"&"],[160," "]])),t.escapeText=i(/[&<>\u00A0]/g,new Map([[38,"&"],[60,"<"],[62,">"],[160," "]]))},7346:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=new Uint16Array('ᵁ<Õıʊҝջאٵ۞ޢߖࠏ੊ઑඡ๭༉༦჊ረዡᐕᒝᓃᓟᔥ\0\0\0\0\0\0ᕫᛍᦍᰒᷝ὾⁠↰⊍⏀⏻⑂⠤⤒ⴈ⹈⿎〖㊺㘹㞬㣾㨨㩱㫠㬮ࠀEMabcfglmnoprstu\\bfms„‹•˜¦³¹ÈÏlig耻Æ䃆P耻&䀦cute耻Á䃁reve;䄂Āiyx}rc耻Â䃂;䐐r;쀀𝔄rave耻À䃀pha;䎑acr;䄀d;橓Āgp¡on;䄄f;쀀𝔸plyFunction;恡ing耻Å䃅Ācs¾Ãr;쀀𝒜ign;扔ilde耻Ã䃃ml耻Ä䃄ЀaceforsuåûþėĜĢħĪĀcrêòkslash;或Ŷöø;櫧ed;挆y;䐑ƀcrtąċĔause;戵noullis;愬a;䎒r;쀀𝔅pf;쀀𝔹eve;䋘còēmpeq;扎܀HOacdefhilorsuōőŖƀƞƢƵƷƺǜȕɳɸɾcy;䐧PY耻©䂩ƀcpyŝŢźute;䄆Ā;iŧŨ拒talDifferentialD;慅leys;愭ȀaeioƉƎƔƘron;䄌dil耻Ç䃇rc;䄈nint;戰ot;䄊ĀdnƧƭilla;䂸terDot;䂷òſi;䎧rcleȀDMPTLJNjǑǖot;抙inus;抖lus;投imes;抗oĀcsǢǸkwiseContourIntegral;戲eCurlyĀDQȃȏoubleQuote;思uote;怙ȀlnpuȞȨɇɕonĀ;eȥȦ户;橴ƀgitȯȶȺruent;扡nt;戯ourIntegral;戮ĀfrɌɎ;愂oduct;成nterClockwiseContourIntegral;戳oss;樯cr;쀀𝒞pĀ;Cʄʅ拓ap;才րDJSZacefiosʠʬʰʴʸˋ˗ˡ˦̳ҍĀ;oŹʥtrahd;椑cy;䐂cy;䐅cy;䐏ƀgrsʿ˄ˇger;怡r;憡hv;櫤Āayː˕ron;䄎;䐔lĀ;t˝˞戇a;䎔r;쀀𝔇Āaf˫̧Ācm˰̢riticalȀADGT̖̜̀̆cute;䂴oŴ̋̍;䋙bleAcute;䋝rave;䁠ilde;䋜ond;拄ferentialD;慆Ѱ̽\0\0\0͔͂\0Ѕf;쀀𝔻ƀ;DE͈͉͍䂨ot;惜qual;扐blèCDLRUVͣͲ΂ϏϢϸontourIntegraìȹoɴ͹\0\0ͻ»͉nArrow;懓Āeo·ΤftƀARTΐΖΡrrow;懐ightArrow;懔eåˊngĀLRΫτeftĀARγιrrow;柸ightArrow;柺ightArrow;柹ightĀATϘϞrrow;懒ee;抨pɁϩ\0\0ϯrrow;懑ownArrow;懕erticalBar;戥ǹABLRTaВЪаўѿͼrrowƀ;BUНОТ憓ar;椓pArrow;懵reve;䌑eft˒к\0ц\0ѐightVector;楐eeVector;楞ectorĀ;Bљњ憽ar;楖ightǔѧ\0ѱeeVector;楟ectorĀ;BѺѻ懁ar;楗eeĀ;A҆҇护rrow;憧ĀctҒҗr;쀀𝒟rok;䄐ࠀNTacdfglmopqstuxҽӀӄӋӞӢӧӮӵԡԯԶՒ՝ՠեG;䅊H耻Ð䃐cute耻É䃉ƀaiyӒӗӜron;䄚rc耻Ê䃊;䐭ot;䄖r;쀀𝔈rave耻È䃈ement;戈ĀapӺӾcr;䄒tyɓԆ\0\0ԒmallSquare;旻erySmallSquare;斫ĀgpԦԪon;䄘f;쀀𝔼silon;䎕uĀaiԼՉlĀ;TՂՃ橵ilde;扂librium;懌Āci՗՚r;愰m;橳a;䎗ml耻Ë䃋Āipժկsts;戃onentialE;慇ʀcfiosօֈ֍ֲ׌y;䐤r;쀀𝔉lledɓ֗\0\0֣mallSquare;旼erySmallSquare;斪Ͱֺ\0ֿ\0\0ׄf;쀀𝔽All;戀riertrf;愱cò׋؀JTabcdfgorstר׬ׯ׺؀ؒؖ؛؝أ٬ٲcy;䐃耻>䀾mmaĀ;d׷׸䎓;䏜reve;䄞ƀeiy؇،ؐdil;䄢rc;䄜;䐓ot;䄠r;쀀𝔊;拙pf;쀀𝔾eater̀EFGLSTصلَٖٛ٦qualĀ;Lؾؿ扥ess;招ullEqual;执reater;檢ess;扷lantEqual;橾ilde;扳cr;쀀𝒢;扫ЀAacfiosuڅڋږڛڞڪھۊRDcy;䐪Āctڐڔek;䋇;䁞irc;䄤r;愌lbertSpace;愋ǰگ\0ڲf;愍izontalLine;攀Āctۃۅòکrok;䄦mpńېۘownHumðįqual;扏܀EJOacdfgmnostuۺ۾܃܇܎ܚܞܡܨ݄ݸދޏޕcy;䐕lig;䄲cy;䐁cute耻Í䃍Āiyܓܘrc耻Î䃎;䐘ot;䄰r;愑rave耻Ì䃌ƀ;apܠܯܿĀcgܴܷr;䄪inaryI;慈lieóϝǴ݉\0ݢĀ;eݍݎ戬Āgrݓݘral;戫section;拂isibleĀCTݬݲomma;恣imes;恢ƀgptݿރވon;䄮f;쀀𝕀a;䎙cr;愐ilde;䄨ǫޚ\0ޞcy;䐆l耻Ï䃏ʀcfosuެ޷޼߂ߐĀiyޱ޵rc;䄴;䐙r;쀀𝔍pf;쀀𝕁ǣ߇\0ߌr;쀀𝒥rcy;䐈kcy;䐄΀HJacfosߤߨ߽߬߱ࠂࠈcy;䐥cy;䐌ppa;䎚Āey߶߻dil;䄶;䐚r;쀀𝔎pf;쀀𝕂cr;쀀𝒦րJTaceflmostࠥࠩࠬࡐࡣ঳সে্਷ੇcy;䐉耻<䀼ʀcmnpr࠷࠼ࡁࡄࡍute;䄹bda;䎛g;柪lacetrf;愒r;憞ƀaeyࡗ࡜ࡡron;䄽dil;䄻;䐛Āfsࡨ॰tԀACDFRTUVarࡾࢩࢱࣦ࣠ࣼयज़ΐ४Ānrࢃ࢏gleBracket;柨rowƀ;BR࢙࢚࢞憐ar;懤ightArrow;懆eiling;挈oǵࢷ\0ࣃbleBracket;柦nǔࣈ\0࣒eeVector;楡ectorĀ;Bࣛࣜ懃ar;楙loor;挊ightĀAV࣯ࣵrrow;憔ector;楎Āerँगeƀ;AVउऊऐ抣rrow;憤ector;楚iangleƀ;BEतथऩ抲ar;槏qual;抴pƀDTVषूौownVector;楑eeVector;楠ectorĀ;Bॖॗ憿ar;楘ectorĀ;B॥०憼ar;楒ightáΜs̀EFGLSTॾঋকঝঢভqualGreater;拚ullEqual;扦reater;扶ess;檡lantEqual;橽ilde;扲r;쀀𝔏Ā;eঽা拘ftarrow;懚idot;䄿ƀnpw৔ਖਛgȀLRlr৞৷ਂਐeftĀAR০৬rrow;柵ightArrow;柷ightArrow;柶eftĀarγਊightáοightáϊf;쀀𝕃erĀLRਢਬeftArrow;憙ightArrow;憘ƀchtਾੀੂòࡌ;憰rok;䅁;扪Ѐacefiosuਗ਼੝੠੷੼અઋ઎p;椅y;䐜Ādl੥੯iumSpace;恟lintrf;愳r;쀀𝔐nusPlus;戓pf;쀀𝕄cò੶;䎜ҀJacefostuણધભીଔଙඑ඗ඞcy;䐊cute;䅃ƀaey઴હાron;䅇dil;䅅;䐝ƀgswે૰଎ativeƀMTV૓૟૨ediumSpace;怋hiĀcn૦૘ë૙eryThiî૙tedĀGL૸ଆreaterGreateòٳessLesóੈLine;䀊r;쀀𝔑ȀBnptଢନଷ଺reak;恠BreakingSpace;䂠f;愕ڀ;CDEGHLNPRSTV୕ୖ୪୼஡௫ఄ౞಄ದ೘ൡඅ櫬Āou୛୤ngruent;扢pCap;扭oubleVerticalBar;戦ƀlqxஃஊ஛ement;戉ualĀ;Tஒஓ扠ilde;쀀≂̸ists;戄reater΀;EFGLSTஶஷ஽௉௓௘௥扯qual;扱ullEqual;쀀≧̸reater;쀀≫̸ess;批lantEqual;쀀⩾̸ilde;扵umpń௲௽ownHump;쀀≎̸qual;쀀≏̸eĀfsఊధtTriangleƀ;BEచఛడ拪ar;쀀⧏̸qual;括s̀;EGLSTవశ఼ౄోౘ扮qual;扰reater;扸ess;쀀≪̸lantEqual;쀀⩽̸ilde;扴estedĀGL౨౹reaterGreater;쀀⪢̸essLess;쀀⪡̸recedesƀ;ESಒಓಛ技qual;쀀⪯̸lantEqual;拠ĀeiಫಹverseElement;戌ghtTriangleƀ;BEೋೌ೒拫ar;쀀⧐̸qual;拭ĀquೝഌuareSuĀbp೨೹setĀ;E೰ೳ쀀⊏̸qual;拢ersetĀ;Eഃആ쀀⊐̸qual;拣ƀbcpഓതൎsetĀ;Eഛഞ쀀⊂⃒qual;抈ceedsȀ;ESTലള഻െ抁qual;쀀⪰̸lantEqual;拡ilde;쀀≿̸ersetĀ;E൘൛쀀⊃⃒qual;抉ildeȀ;EFT൮൯൵ൿ扁qual;扄ullEqual;扇ilde;扉erticalBar;戤cr;쀀𝒩ilde耻Ñ䃑;䎝܀Eacdfgmoprstuvලෂ෉෕ෛ෠෧෼ขภยา฿ไlig;䅒cute耻Ó䃓Āiy෎ීrc耻Ô䃔;䐞blac;䅐r;쀀𝔒rave耻Ò䃒ƀaei෮ෲ෶cr;䅌ga;䎩cron;䎟pf;쀀𝕆enCurlyĀDQฎบoubleQuote;怜uote;怘;橔Āclวฬr;쀀𝒪ash耻Ø䃘iŬื฼de耻Õ䃕es;樷ml耻Ö䃖erĀBP๋๠Āar๐๓r;怾acĀek๚๜;揞et;掴arenthesis;揜Ҁacfhilors๿ງຊຏຒດຝະ໼rtialD;戂y;䐟r;쀀𝔓i;䎦;䎠usMinus;䂱Āipຢອncareplanåڝf;愙Ȁ;eio຺ູ໠໤檻cedesȀ;EST່້໏໚扺qual;檯lantEqual;扼ilde;找me;怳Ādp໩໮uct;戏ortionĀ;aȥ໹l;戝Āci༁༆r;쀀𝒫;䎨ȀUfos༑༖༛༟OT耻"䀢r;쀀𝔔pf;愚cr;쀀𝒬؀BEacefhiorsu༾གྷཇའཱིྦྷྪྭ႖ႩႴႾarr;椐G耻®䂮ƀcnrཎནབute;䅔g;柫rĀ;tཛྷཝ憠l;椖ƀaeyཧཬཱron;䅘dil;䅖;䐠Ā;vླྀཹ愜erseĀEUྂྙĀlq྇ྎement;戋uilibrium;懋pEquilibrium;楯r»ཹo;䎡ghtЀACDFTUVa࿁࿫࿳ဢဨၛႇϘĀnr࿆࿒gleBracket;柩rowƀ;BL࿜࿝࿡憒ar;懥eftArrow;懄eiling;按oǵ࿹\0စbleBracket;柧nǔည\0နeeVector;楝ectorĀ;Bဝသ懂ar;楕loor;挋Āerိ၃eƀ;AVဵံြ抢rrow;憦ector;楛iangleƀ;BEၐၑၕ抳ar;槐qual;抵pƀDTVၣၮၸownVector;楏eeVector;楜ectorĀ;Bႂႃ憾ar;楔ectorĀ;B႑႒懀ar;楓Āpuႛ႞f;愝ndImplies;楰ightarrow;懛ĀchႹႼr;愛;憱leDelayed;槴ڀHOacfhimoqstuფჱჷჽᄙᄞᅑᅖᅡᅧᆵᆻᆿĀCcჩხHcy;䐩y;䐨FTcy;䐬cute;䅚ʀ;aeiyᄈᄉᄎᄓᄗ檼ron;䅠dil;䅞rc;䅜;䐡r;쀀𝔖ortȀDLRUᄪᄴᄾᅉownArrow»ОeftArrow»࢚ightArrow»࿝pArrow;憑gma;䎣allCircle;战pf;쀀𝕊ɲᅭ\0\0ᅰt;戚areȀ;ISUᅻᅼᆉᆯ斡ntersection;抓uĀbpᆏᆞsetĀ;Eᆗᆘ抏qual;抑ersetĀ;Eᆨᆩ抐qual;抒nion;抔cr;쀀𝒮ar;拆ȀbcmpᇈᇛሉላĀ;sᇍᇎ拐etĀ;Eᇍᇕqual;抆ĀchᇠህeedsȀ;ESTᇭᇮᇴᇿ扻qual;檰lantEqual;扽ilde;承Tháྌ;我ƀ;esሒሓሣ拑rsetĀ;Eሜም抃qual;抇et»ሓրHRSacfhiorsሾቄ቉ቕ቞ቱቶኟዂወዑORN耻Þ䃞ADE;愢ĀHc቎ቒcy;䐋y;䐦Ābuቚቜ;䀉;䎤ƀaeyብቪቯron;䅤dil;䅢;䐢r;쀀𝔗Āeiቻ኉Dzኀ\0ኇefore;戴a;䎘Ācn኎ኘkSpace;쀀  Space;怉ldeȀ;EFTካኬኲኼ戼qual;扃ullEqual;扅ilde;扈pf;쀀𝕋ipleDot;惛Āctዖዛr;쀀𝒯rok;䅦ૡዷጎጚጦ\0ጬጱ\0\0\0\0\0ጸጽ፷ᎅ\0᏿ᐄᐊᐐĀcrዻጁute耻Ú䃚rĀ;oጇገ憟cir;楉rǣጓ\0጖y;䐎ve;䅬Āiyጞጣrc耻Û䃛;䐣blac;䅰r;쀀𝔘rave耻Ù䃙acr;䅪Ādiፁ፩erĀBPፈ፝Āarፍፐr;䁟acĀekፗፙ;揟et;掵arenthesis;揝onĀ;P፰፱拃lus;抎Āgp፻፿on;䅲f;쀀𝕌ЀADETadps᎕ᎮᎸᏄϨᏒᏗᏳrrowƀ;BDᅐᎠᎤar;椒ownArrow;懅ownArrow;憕quilibrium;楮eeĀ;AᏋᏌ报rrow;憥ownáϳerĀLRᏞᏨeftArrow;憖ightArrow;憗iĀ;lᏹᏺ䏒on;䎥ing;䅮cr;쀀𝒰ilde;䅨ml耻Ü䃜ҀDbcdefosvᐧᐬᐰᐳᐾᒅᒊᒐᒖash;披ar;櫫y;䐒ashĀ;lᐻᐼ抩;櫦Āerᑃᑅ;拁ƀbtyᑌᑐᑺar;怖Ā;iᑏᑕcalȀBLSTᑡᑥᑪᑴar;戣ine;䁼eparator;杘ilde;所ThinSpace;怊r;쀀𝔙pf;쀀𝕍cr;쀀𝒱dash;抪ʀcefosᒧᒬᒱᒶᒼirc;䅴dge;拀r;쀀𝔚pf;쀀𝕎cr;쀀𝒲Ȁfiosᓋᓐᓒᓘr;쀀𝔛;䎞pf;쀀𝕏cr;쀀𝒳ҀAIUacfosuᓱᓵᓹᓽᔄᔏᔔᔚᔠcy;䐯cy;䐇cy;䐮cute耻Ý䃝Āiyᔉᔍrc;䅶;䐫r;쀀𝔜pf;쀀𝕐cr;쀀𝒴ml;䅸ЀHacdefosᔵᔹᔿᕋᕏᕝᕠᕤcy;䐖cute;䅹Āayᕄᕉron;䅽;䐗ot;䅻Dzᕔ\0ᕛoWidtè૙a;䎖r;愨pf;愤cr;쀀𝒵௡ᖃᖊᖐ\0ᖰᖶᖿ\0\0\0\0ᗆᗛᗫᙟ᙭\0ᚕ᚛ᚲᚹ\0ᚾcute耻á䃡reve;䄃̀;Ediuyᖜᖝᖡᖣᖨᖭ戾;쀀∾̳;房rc耻â䃢te肻´̆;䐰lig耻æ䃦Ā;r²ᖺ;쀀𝔞rave耻à䃠ĀepᗊᗖĀfpᗏᗔsym;愵èᗓha;䎱ĀapᗟcĀclᗤᗧr;䄁g;樿ɤᗰ\0\0ᘊʀ;adsvᗺᗻᗿᘁᘇ戧nd;橕;橜lope;橘;橚΀;elmrszᘘᘙᘛᘞᘿᙏᙙ戠;榤e»ᘙsdĀ;aᘥᘦ戡ѡᘰᘲᘴᘶᘸᘺᘼᘾ;榨;榩;榪;榫;榬;榭;榮;榯tĀ;vᙅᙆ戟bĀ;dᙌᙍ抾;榝Āptᙔᙗh;戢»¹arr;捼Āgpᙣᙧon;䄅f;쀀𝕒΀;Eaeiop዁ᙻᙽᚂᚄᚇᚊ;橰cir;橯;扊d;手s;䀧roxĀ;e዁ᚒñᚃing耻å䃥ƀctyᚡᚦᚨr;쀀𝒶;䀪mpĀ;e዁ᚯñʈilde耻ã䃣ml耻ä䃤Āciᛂᛈoninôɲnt;樑ࠀNabcdefiklnoprsu᛭ᛱᜰ᜼ᝃᝈ᝸᝽០៦ᠹᡐᜍ᤽᥈ᥰot;櫭Ācrᛶ᜞kȀcepsᜀᜅᜍᜓong;扌psilon;䏶rime;怵imĀ;e᜚᜛戽q;拍Ŷᜢᜦee;抽edĀ;gᜬᜭ挅e»ᜭrkĀ;t፜᜷brk;掶Āoyᜁᝁ;䐱quo;怞ʀcmprtᝓ᝛ᝡᝤᝨausĀ;eĊĉptyv;榰séᜌnoõēƀahwᝯ᝱ᝳ;䎲;愶een;扬r;쀀𝔟g΀costuvwឍឝឳេ៕៛៞ƀaiuបពរðݠrc;旯p»፱ƀdptឤឨឭot;樀lus;樁imes;樂ɱឹ\0\0ើcup;樆ar;昅riangleĀdu៍្own;施p;斳plus;樄eåᑄåᒭarow;植ƀako៭ᠦᠵĀcn៲ᠣkƀlst៺֫᠂ozenge;槫riangleȀ;dlr᠒᠓᠘᠝斴own;斾eft;旂ight;斸k;搣Ʊᠫ\0ᠳƲᠯ\0ᠱ;斒;斑4;斓ck;斈ĀeoᠾᡍĀ;qᡃᡆ쀀=⃥uiv;쀀≡⃥t;挐Ȁptwxᡙᡞᡧᡬf;쀀𝕓Ā;tᏋᡣom»Ꮜtie;拈؀DHUVbdhmptuvᢅᢖᢪᢻᣗᣛᣬ᣿ᤅᤊᤐᤡȀLRlrᢎᢐᢒᢔ;敗;敔;敖;敓ʀ;DUduᢡᢢᢤᢦᢨ敐;敦;敩;敤;敧ȀLRlrᢳᢵᢷᢹ;敝;敚;敜;教΀;HLRhlrᣊᣋᣍᣏᣑᣓᣕ救;敬;散;敠;敫;敢;敟ox;槉ȀLRlrᣤᣦᣨᣪ;敕;敒;攐;攌ʀ;DUduڽ᣷᣹᣻᣽;敥;敨;攬;攴inus;抟lus;択imes;抠ȀLRlrᤙᤛᤝ᤟;敛;敘;攘;攔΀;HLRhlrᤰᤱᤳᤵᤷ᤻᤹攂;敪;敡;敞;攼;攤;攜Āevģ᥂bar耻¦䂦Ȁceioᥑᥖᥚᥠr;쀀𝒷mi;恏mĀ;e᜚᜜lƀ;bhᥨᥩᥫ䁜;槅sub;柈Ŭᥴ᥾lĀ;e᥹᥺怢t»᥺pƀ;Eeįᦅᦇ;檮Ā;qۜۛೡᦧ\0᧨ᨑᨕᨲ\0ᨷᩐ\0\0᪴\0\0᫁\0\0ᬡᬮ᭍᭒\0᯽\0ᰌƀcpr᦭ᦲ᧝ute;䄇̀;abcdsᦿᧀᧄ᧊᧕᧙戩nd;橄rcup;橉Āau᧏᧒p;橋p;橇ot;橀;쀀∩︀Āeo᧢᧥t;恁îړȀaeiu᧰᧻ᨁᨅǰ᧵\0᧸s;橍on;䄍dil耻ç䃧rc;䄉psĀ;sᨌᨍ橌m;橐ot;䄋ƀdmnᨛᨠᨦil肻¸ƭptyv;榲t脀¢;eᨭᨮ䂢räƲr;쀀𝔠ƀceiᨽᩀᩍy;䑇ckĀ;mᩇᩈ朓ark»ᩈ;䏇r΀;Ecefms᩟᩠ᩢᩫ᪤᪪᪮旋;槃ƀ;elᩩᩪᩭ䋆q;扗eɡᩴ\0\0᪈rrowĀlr᩼᪁eft;憺ight;憻ʀRSacd᪒᪔᪖᪚᪟»ཇ;擈st;抛irc;抚ash;抝nint;樐id;櫯cir;槂ubsĀ;u᪻᪼晣it»᪼ˬ᫇᫔᫺\0ᬊonĀ;eᫍᫎ䀺Ā;qÇÆɭ᫙\0\0᫢aĀ;t᫞᫟䀬;䁀ƀ;fl᫨᫩᫫戁îᅠeĀmx᫱᫶ent»᫩eóɍǧ᫾\0ᬇĀ;dኻᬂot;橭nôɆƀfryᬐᬔᬗ;쀀𝕔oäɔ脀©;sŕᬝr;愗Āaoᬥᬩrr;憵ss;朗Ācuᬲᬷr;쀀𝒸Ābpᬼ᭄Ā;eᭁᭂ櫏;櫑Ā;eᭉᭊ櫐;櫒dot;拯΀delprvw᭠᭬᭷ᮂᮬᯔ᯹arrĀlr᭨᭪;椸;椵ɰ᭲\0\0᭵r;拞c;拟arrĀ;p᭿ᮀ憶;椽̀;bcdosᮏᮐᮖᮡᮥᮨ截rcap;橈Āauᮛᮞp;橆p;橊ot;抍r;橅;쀀∪︀Ȁalrv᮵ᮿᯞᯣrrĀ;mᮼᮽ憷;椼yƀevwᯇᯔᯘqɰᯎ\0\0ᯒreã᭳uã᭵ee;拎edge;拏en耻¤䂤earrowĀlrᯮ᯳eft»ᮀight»ᮽeäᯝĀciᰁᰇoninôǷnt;戱lcty;挭ঀAHabcdefhijlorstuwz᰸᰻᰿ᱝᱩᱵᲊᲞᲬᲷ᳻᳿ᴍᵻᶑᶫᶻ᷆᷍rò΁ar;楥Ȁglrs᱈ᱍ᱒᱔ger;怠eth;愸òᄳhĀ;vᱚᱛ怐»ऊūᱡᱧarow;椏aã̕Āayᱮᱳron;䄏;䐴ƀ;ao̲ᱼᲄĀgrʿᲁr;懊tseq;橷ƀglmᲑᲔᲘ耻°䂰ta;䎴ptyv;榱ĀirᲣᲨsht;楿;쀀𝔡arĀlrᲳᲵ»ࣜ»သʀaegsv᳂͸᳖᳜᳠mƀ;oș᳊᳔ndĀ;ș᳑uit;晦amma;䏝in;拲ƀ;io᳧᳨᳸䃷de脀÷;o᳧ᳰntimes;拇nø᳷cy;䑒cɯᴆ\0\0ᴊrn;挞op;挍ʀlptuwᴘᴝᴢᵉᵕlar;䀤f;쀀𝕕ʀ;emps̋ᴭᴷᴽᵂqĀ;d͒ᴳot;扑inus;戸lus;戔quare;抡blebarwedgåúnƀadhᄮᵝᵧownarrowóᲃarpoonĀlrᵲᵶefôᲴighôᲶŢᵿᶅkaro÷གɯᶊ\0\0ᶎrn;挟op;挌ƀcotᶘᶣᶦĀryᶝᶡ;쀀𝒹;䑕l;槶rok;䄑Ādrᶰᶴot;拱iĀ;fᶺ᠖斿Āah᷀᷃ròЩaòྦangle;榦Āci᷒ᷕy;䑟grarr;柿ऀDacdefglmnopqrstuxḁḉḙḸոḼṉṡṾấắẽỡἪἷὄ὎὚ĀDoḆᴴoôᲉĀcsḎḔute耻é䃩ter;橮ȀaioyḢḧḱḶron;䄛rĀ;cḭḮ扖耻ê䃪lon;払;䑍ot;䄗ĀDrṁṅot;扒;쀀𝔢ƀ;rsṐṑṗ檚ave耻è䃨Ā;dṜṝ檖ot;檘Ȁ;ilsṪṫṲṴ檙nters;揧;愓Ā;dṹṺ檕ot;檗ƀapsẅẉẗcr;䄓tyƀ;svẒẓẕ戅et»ẓpĀ1;ẝẤijạả;怄;怅怃ĀgsẪẬ;䅋p;怂ĀgpẴẸon;䄙f;쀀𝕖ƀalsỄỎỒrĀ;sỊị拕l;槣us;橱iƀ;lvỚớở䎵on»ớ;䏵ȀcsuvỪỳἋἣĀioữḱrc»Ḯɩỹ\0\0ỻíՈantĀglἂἆtr»ṝess»Ṻƀaeiἒ἖Ἒls;䀽st;扟vĀ;DȵἠD;橸parsl;槥ĀDaἯἳot;打rr;楱ƀcdiἾὁỸr;愯oô͒ĀahὉὋ;䎷耻ð䃰Āmrὓὗl耻ë䃫o;悬ƀcipὡὤὧl;䀡sôծĀeoὬὴctatioîՙnentialåչৡᾒ\0ᾞ\0ᾡᾧ\0\0ῆῌ\0ΐ\0ῦῪ \0 ⁚llingdotseñṄy;䑄male;晀ƀilrᾭᾳ῁lig;耀ffiɩᾹ\0\0᾽g;耀ffig;耀ffl;쀀𝔣lig;耀filig;쀀fjƀaltῙ῜ῡt;晭ig;耀flns;斱of;䆒ǰ΅\0ῳf;쀀𝕗ĀakֿῷĀ;vῼ´拔;櫙artint;樍Āao‌⁕Ācs‑⁒ႉ‸⁅⁈\0⁐β•‥‧‪‬\0‮耻½䂽;慓耻¼䂼;慕;慙;慛Ƴ‴\0‶;慔;慖ʴ‾⁁\0\0⁃耻¾䂾;慗;慜5;慘ƶ⁌\0⁎;慚;慝8;慞l;恄wn;挢cr;쀀𝒻ࢀEabcdefgijlnorstv₂₉₟₥₰₴⃰⃵⃺⃿℃ℒℸ̗ℾ⅒↞Ā;lٍ₇;檌ƀcmpₐₕ₝ute;䇵maĀ;dₜ᳚䎳;檆reve;䄟Āiy₪₮rc;䄝;䐳ot;䄡Ȁ;lqsؾق₽⃉ƀ;qsؾٌ⃄lanô٥Ȁ;cdl٥⃒⃥⃕c;檩otĀ;o⃜⃝檀Ā;l⃢⃣檂;檄Ā;e⃪⃭쀀⋛︀s;檔r;쀀𝔤Ā;gٳ؛mel;愷cy;䑓Ȁ;Eajٚℌℎℐ;檒;檥;檤ȀEaesℛℝ℩ℴ;扩pĀ;p℣ℤ檊rox»ℤĀ;q℮ℯ檈Ā;q℮ℛim;拧pf;쀀𝕘Āci⅃ⅆr;愊mƀ;el٫ⅎ⅐;檎;檐茀>;cdlqr׮ⅠⅪⅮⅳⅹĀciⅥⅧ;檧r;橺ot;拗Par;榕uest;橼ʀadelsↄⅪ←ٖ↛ǰ↉\0↎proø₞r;楸qĀlqؿ↖lesó₈ií٫Āen↣↭rtneqq;쀀≩︀Å↪ԀAabcefkosy⇄⇇⇱⇵⇺∘∝∯≨≽ròΠȀilmr⇐⇔⇗⇛rsðᒄf»․ilôکĀdr⇠⇤cy;䑊ƀ;cwࣴ⇫⇯ir;楈;憭ar;意irc;䄥ƀalr∁∎∓rtsĀ;u∉∊晥it»∊lip;怦con;抹r;쀀𝔥sĀew∣∩arow;椥arow;椦ʀamopr∺∾≃≞≣rr;懿tht;戻kĀlr≉≓eftarrow;憩ightarrow;憪f;쀀𝕙bar;怕ƀclt≯≴≸r;쀀𝒽asè⇴rok;䄧Ābp⊂⊇ull;恃hen»ᱛૡ⊣\0⊪\0⊸⋅⋎\0⋕⋳\0\0⋸⌢⍧⍢⍿\0⎆⎪⎴cute耻í䃭ƀ;iyݱ⊰⊵rc耻î䃮;䐸Ācx⊼⊿y;䐵cl耻¡䂡ĀfrΟ⋉;쀀𝔦rave耻ì䃬Ȁ;inoܾ⋝⋩⋮Āin⋢⋦nt;樌t;戭fin;槜ta;愩lig;䄳ƀaop⋾⌚⌝ƀcgt⌅⌈⌗r;䄫ƀelpܟ⌏⌓inåގarôܠh;䄱f;抷ed;䆵ʀ;cfotӴ⌬⌱⌽⍁are;愅inĀ;t⌸⌹戞ie;槝doô⌙ʀ;celpݗ⍌⍐⍛⍡al;抺Āgr⍕⍙eróᕣã⍍arhk;樗rod;樼Ȁcgpt⍯⍲⍶⍻y;䑑on;䄯f;쀀𝕚a;䎹uest耻¿䂿Āci⎊⎏r;쀀𝒾nʀ;EdsvӴ⎛⎝⎡ӳ;拹ot;拵Ā;v⎦⎧拴;拳Ā;iݷ⎮lde;䄩ǫ⎸\0⎼cy;䑖l耻ï䃯̀cfmosu⏌⏗⏜⏡⏧⏵Āiy⏑⏕rc;䄵;䐹r;쀀𝔧ath;䈷pf;쀀𝕛ǣ⏬\0⏱r;쀀𝒿rcy;䑘kcy;䑔Ѐacfghjos␋␖␢␧␭␱␵␻ppaĀ;v␓␔䎺;䏰Āey␛␠dil;䄷;䐺r;쀀𝔨reen;䄸cy;䑅cy;䑜pf;쀀𝕜cr;쀀𝓀஀ABEHabcdefghjlmnoprstuv⑰⒁⒆⒍⒑┎┽╚▀♎♞♥♹♽⚚⚲⛘❝❨➋⟀⠁⠒ƀart⑷⑺⑼rò৆òΕail;椛arr;椎Ā;gঔ⒋;檋ar;楢ॣ⒥\0⒪\0⒱\0\0\0\0\0⒵Ⓔ\0ⓆⓈⓍ\0⓹ute;䄺mptyv;榴raîࡌbda;䎻gƀ;dlࢎⓁⓃ;榑åࢎ;檅uo耻«䂫rЀ;bfhlpst࢙ⓞⓦⓩ⓫⓮⓱⓵Ā;f࢝ⓣs;椟s;椝ë≒p;憫l;椹im;楳l;憢ƀ;ae⓿─┄檫il;椙Ā;s┉┊檭;쀀⪭︀ƀabr┕┙┝rr;椌rk;杲Āak┢┬cĀek┨┪;䁻;䁛Āes┱┳;榋lĀdu┹┻;榏;榍Ȁaeuy╆╋╖╘ron;䄾Ādi═╔il;䄼ìࢰâ┩;䐻Ȁcqrs╣╦╭╽a;椶uoĀ;rนᝆĀdu╲╷har;楧shar;楋h;憲ʀ;fgqs▋▌উ◳◿扤tʀahlrt▘▤▷◂◨rrowĀ;t࢙□aé⓶arpoonĀdu▯▴own»њp»०eftarrows;懇ightƀahs◍◖◞rrowĀ;sࣴࢧarpoonó྘quigarro÷⇰hreetimes;拋ƀ;qs▋ও◺lanôবʀ;cdgsব☊☍☝☨c;檨otĀ;o☔☕橿Ā;r☚☛檁;檃Ā;e☢☥쀀⋚︀s;檓ʀadegs☳☹☽♉♋pproøⓆot;拖qĀgq♃♅ôউgtò⒌ôছiíলƀilr♕࣡♚sht;楼;쀀𝔩Ā;Eজ♣;檑š♩♶rĀdu▲♮Ā;l॥♳;楪lk;斄cy;䑙ʀ;achtੈ⚈⚋⚑⚖rò◁orneòᴈard;楫ri;旺Āio⚟⚤dot;䅀ustĀ;a⚬⚭掰che»⚭ȀEaes⚻⚽⛉⛔;扨pĀ;p⛃⛄檉rox»⛄Ā;q⛎⛏檇Ā;q⛎⚻im;拦Ѐabnoptwz⛩⛴⛷✚✯❁❇❐Ānr⛮⛱g;柬r;懽rëࣁgƀlmr⛿✍✔eftĀar০✇ightá৲apsto;柼ightá৽parrowĀlr✥✩efô⓭ight;憬ƀafl✶✹✽r;榅;쀀𝕝us;樭imes;樴š❋❏st;戗áፎƀ;ef❗❘᠀旊nge»❘arĀ;l❤❥䀨t;榓ʀachmt❳❶❼➅➇ròࢨorneòᶌarĀ;d྘➃;業;怎ri;抿̀achiqt➘➝ੀ➢➮➻quo;怹r;쀀𝓁mƀ;egল➪➬;檍;檏Ābu┪➳oĀ;rฟ➹;怚rok;䅂萀<;cdhilqrࠫ⟒☹⟜⟠⟥⟪⟰Āci⟗⟙;檦r;橹reå◲mes;拉arr;楶uest;橻ĀPi⟵⟹ar;榖ƀ;ef⠀भ᠛旃rĀdu⠇⠍shar;楊har;楦Āen⠗⠡rtneqq;쀀≨︀Å⠞܀Dacdefhilnopsu⡀⡅⢂⢎⢓⢠⢥⢨⣚⣢⣤ઃ⣳⤂Dot;戺Ȁclpr⡎⡒⡣⡽r耻¯䂯Āet⡗⡙;時Ā;e⡞⡟朠se»⡟Ā;sျ⡨toȀ;dluျ⡳⡷⡻owîҌefôएðᏑker;斮Āoy⢇⢌mma;権;䐼ash;怔asuredangle»ᘦr;쀀𝔪o;愧ƀcdn⢯⢴⣉ro耻µ䂵Ȁ;acdᑤ⢽⣀⣄sôᚧir;櫰ot肻·Ƶusƀ;bd⣒ᤃ⣓戒Ā;uᴼ⣘;横ţ⣞⣡p;櫛ò−ðઁĀdp⣩⣮els;抧f;쀀𝕞Āct⣸⣽r;쀀𝓂pos»ᖝƀ;lm⤉⤊⤍䎼timap;抸ఀGLRVabcdefghijlmoprstuvw⥂⥓⥾⦉⦘⧚⧩⨕⨚⩘⩝⪃⪕⪤⪨⬄⬇⭄⭿⮮ⰴⱧⱼ⳩Āgt⥇⥋;쀀⋙̸Ā;v⥐௏쀀≫⃒ƀelt⥚⥲⥶ftĀar⥡⥧rrow;懍ightarrow;懎;쀀⋘̸Ā;v⥻ే쀀≪⃒ightarrow;懏ĀDd⦎⦓ash;抯ash;抮ʀbcnpt⦣⦧⦬⦱⧌la»˞ute;䅄g;쀀∠⃒ʀ;Eiop඄⦼⧀⧅⧈;쀀⩰̸d;쀀≋̸s;䅉roø඄urĀ;a⧓⧔普lĀ;s⧓ସdz⧟\0⧣p肻 ଷmpĀ;e௹ఀʀaeouy⧴⧾⨃⨐⨓ǰ⧹\0⧻;橃on;䅈dil;䅆ngĀ;dൾ⨊ot;쀀⩭̸p;橂;䐽ash;怓΀;Aadqsxஒ⨩⨭⨻⩁⩅⩐rr;懗rĀhr⨳⨶k;椤Ā;oᏲᏰot;쀀≐̸uiöୣĀei⩊⩎ar;椨í஘istĀ;s஠டr;쀀𝔫ȀEest௅⩦⩹⩼ƀ;qs஼⩭௡ƀ;qs஼௅⩴lanô௢ií௪Ā;rஶ⪁»ஷƀAap⪊⪍⪑rò⥱rr;憮ar;櫲ƀ;svྍ⪜ྌĀ;d⪡⪢拼;拺cy;䑚΀AEadest⪷⪺⪾⫂⫅⫶⫹rò⥦;쀀≦̸rr;憚r;急Ȁ;fqs఻⫎⫣⫯tĀar⫔⫙rro÷⫁ightarro÷⪐ƀ;qs఻⪺⫪lanôౕĀ;sౕ⫴»శiíౝĀ;rవ⫾iĀ;eచథiäඐĀpt⬌⬑f;쀀𝕟膀¬;in⬙⬚⬶䂬nȀ;Edvஉ⬤⬨⬮;쀀⋹̸ot;쀀⋵̸ǡஉ⬳⬵;拷;拶iĀ;vಸ⬼ǡಸ⭁⭃;拾;拽ƀaor⭋⭣⭩rȀ;ast୻⭕⭚⭟lleì୻l;쀀⫽⃥;쀀∂̸lint;樔ƀ;ceಒ⭰⭳uåಥĀ;cಘ⭸Ā;eಒ⭽ñಘȀAait⮈⮋⮝⮧rò⦈rrƀ;cw⮔⮕⮙憛;쀀⤳̸;쀀↝̸ghtarrow»⮕riĀ;eೋೖ΀chimpqu⮽⯍⯙⬄୸⯤⯯Ȁ;cerല⯆ഷ⯉uå൅;쀀𝓃ortɭ⬅\0\0⯖ará⭖mĀ;e൮⯟Ā;q൴൳suĀbp⯫⯭å೸åഋƀbcp⯶ⰑⰙȀ;Ees⯿ⰀഢⰄ抄;쀀⫅̸etĀ;eഛⰋqĀ;qണⰀcĀ;eലⰗñസȀ;EesⰢⰣൟⰧ抅;쀀⫆̸etĀ;e൘ⰮqĀ;qൠⰣȀgilrⰽⰿⱅⱇìௗlde耻ñ䃱çృiangleĀlrⱒⱜeftĀ;eచⱚñదightĀ;eೋⱥñ೗Ā;mⱬⱭ䎽ƀ;esⱴⱵⱹ䀣ro;愖p;怇ҀDHadgilrsⲏⲔⲙⲞⲣⲰⲶⳓⳣash;抭arr;椄p;쀀≍⃒ash;抬ĀetⲨⲬ;쀀≥⃒;쀀>⃒nfin;槞ƀAetⲽⳁⳅrr;椂;쀀≤⃒Ā;rⳊⳍ쀀<⃒ie;쀀⊴⃒ĀAtⳘⳜrr;椃rie;쀀⊵⃒im;쀀∼⃒ƀAan⳰⳴ⴂrr;懖rĀhr⳺⳽k;椣Ā;oᏧᏥear;椧ቓ᪕\0\0\0\0\0\0\0\0\0\0\0\0\0ⴭ\0ⴸⵈⵠⵥ⵲ⶄᬇ\0\0ⶍⶫ\0ⷈⷎ\0ⷜ⸙⸫⸾⹃Ācsⴱ᪗ute耻ó䃳ĀiyⴼⵅrĀ;c᪞ⵂ耻ô䃴;䐾ʀabios᪠ⵒⵗLjⵚlac;䅑v;樸old;榼lig;䅓Ācr⵩⵭ir;榿;쀀𝔬ͯ⵹\0\0⵼\0ⶂn;䋛ave耻ò䃲;槁Ābmⶈ෴ar;榵Ȁacitⶕ⶘ⶥⶨrò᪀Āir⶝ⶠr;榾oss;榻nå๒;槀ƀaeiⶱⶵⶹcr;䅍ga;䏉ƀcdnⷀⷅǍron;䎿;榶pf;쀀𝕠ƀaelⷔ⷗ǒr;榷rp;榹΀;adiosvⷪⷫⷮ⸈⸍⸐⸖戨rò᪆Ȁ;efmⷷⷸ⸂⸅橝rĀ;oⷾⷿ愴f»ⷿ耻ª䂪耻º䂺gof;抶r;橖lope;橗;橛ƀclo⸟⸡⸧ò⸁ash耻ø䃸l;折iŬⸯ⸴de耻õ䃵esĀ;aǛ⸺s;樶ml耻ö䃶bar;挽ૡ⹞\0⹽\0⺀⺝\0⺢⺹\0\0⻋ຜ\0⼓\0\0⼫⾼\0⿈rȀ;astЃ⹧⹲຅脀¶;l⹭⹮䂶leìЃɩ⹸\0\0⹻m;櫳;櫽y;䐿rʀcimpt⺋⺏⺓ᡥ⺗nt;䀥od;䀮il;怰enk;怱r;쀀𝔭ƀimo⺨⺰⺴Ā;v⺭⺮䏆;䏕maô੶ne;明ƀ;tv⺿⻀⻈䏀chfork»´;䏖Āau⻏⻟nĀck⻕⻝kĀ;h⇴⻛;愎ö⇴sҀ;abcdemst⻳⻴ᤈ⻹⻽⼄⼆⼊⼎䀫cir;樣ir;樢Āouᵀ⼂;樥;橲n肻±ຝim;樦wo;樧ƀipu⼙⼠⼥ntint;樕f;쀀𝕡nd耻£䂣Ԁ;Eaceinosu່⼿⽁⽄⽇⾁⾉⾒⽾⾶;檳p;檷uå໙Ā;c໎⽌̀;acens່⽙⽟⽦⽨⽾pproø⽃urlyeñ໙ñ໎ƀaes⽯⽶⽺pprox;檹qq;檵im;拨iíໟmeĀ;s⾈ຮ怲ƀEas⽸⾐⽺ð⽵ƀdfp໬⾙⾯ƀals⾠⾥⾪lar;挮ine;挒urf;挓Ā;t໻⾴ï໻rel;抰Āci⿀⿅r;쀀𝓅;䏈ncsp;怈̀fiopsu⿚⋢⿟⿥⿫⿱r;쀀𝔮pf;쀀𝕢rime;恗cr;쀀𝓆ƀaeo⿸〉〓tĀei⿾々rnionóڰnt;樖stĀ;e【】䀿ñἙô༔઀ABHabcdefhilmnoprstux぀けさすムㄎㄫㅇㅢㅲㆎ㈆㈕㈤㈩㉘㉮㉲㊐㊰㊷ƀartぇおがròႳòϝail;検aròᱥar;楤΀cdenqrtとふへみわゔヌĀeuねぱ;쀀∽̱te;䅕iãᅮmptyv;榳gȀ;del࿑らるろ;榒;榥å࿑uo耻»䂻rր;abcfhlpstw࿜ガクシスゼゾダッデナp;極Ā;f࿠ゴs;椠;椳s;椞ë≝ð✮l;楅im;楴l;憣;憝Āaiパフil;椚oĀ;nホボ戶aló༞ƀabrョリヮrò៥rk;杳ĀakンヽcĀekヹ・;䁽;䁝Āes㄂㄄;榌lĀduㄊㄌ;榎;榐Ȁaeuyㄗㄜㄧㄩron;䅙Ādiㄡㄥil;䅗ì࿲âヺ;䑀Ȁclqsㄴㄷㄽㅄa;椷dhar;楩uoĀ;rȎȍh;憳ƀacgㅎㅟངlȀ;ipsླྀㅘㅛႜnåႻarôྩt;断ƀilrㅩဣㅮsht;楽;쀀𝔯ĀaoㅷㆆrĀduㅽㅿ»ѻĀ;l႑ㆄ;楬Ā;vㆋㆌ䏁;䏱ƀgns㆕ㇹㇼht̀ahlrstㆤㆰ㇂㇘㇤㇮rrowĀ;t࿜ㆭaéトarpoonĀduㆻㆿowîㅾp»႒eftĀah㇊㇐rrowó࿪arpoonóՑightarrows;應quigarro÷ニhreetimes;拌g;䋚ingdotseñἲƀahm㈍㈐㈓rò࿪aòՑ;怏oustĀ;a㈞㈟掱che»㈟mid;櫮Ȁabpt㈲㈽㉀㉒Ānr㈷㈺g;柭r;懾rëဃƀafl㉇㉊㉎r;榆;쀀𝕣us;樮imes;樵Āap㉝㉧rĀ;g㉣㉤䀩t;榔olint;樒arò㇣Ȁachq㉻㊀Ⴜ㊅quo;怺r;쀀𝓇Ābu・㊊oĀ;rȔȓƀhir㊗㊛㊠reåㇸmes;拊iȀ;efl㊪ၙᠡ㊫方tri;槎luhar;楨;愞ൡ㋕㋛㋟㌬㌸㍱\0㍺㎤\0\0㏬㏰\0㐨㑈㑚㒭㒱㓊㓱\0㘖\0\0㘳cute;䅛quï➺Ԁ;Eaceinpsyᇭ㋳㋵㋿㌂㌋㌏㌟㌦㌩;檴ǰ㋺\0㋼;檸on;䅡uåᇾĀ;dᇳ㌇il;䅟rc;䅝ƀEas㌖㌘㌛;檶p;檺im;择olint;樓iíሄ;䑁otƀ;be㌴ᵇ㌵担;橦΀Aacmstx㍆㍊㍗㍛㍞㍣㍭rr;懘rĀhr㍐㍒ë∨Ā;oਸ਼਴t耻§䂧i;䀻war;椩mĀin㍩ðnuóñt;朶rĀ;o㍶⁕쀀𝔰Ȁacoy㎂㎆㎑㎠rp;景Āhy㎋㎏cy;䑉;䑈rtɭ㎙\0\0㎜iäᑤaraì⹯耻­䂭Āgm㎨㎴maƀ;fv㎱㎲㎲䏃;䏂Ѐ;deglnprካ㏅㏉㏎㏖㏞㏡㏦ot;橪Ā;q኱ኰĀ;E㏓㏔檞;檠Ā;E㏛㏜檝;檟e;扆lus;樤arr;楲aròᄽȀaeit㏸㐈㐏㐗Āls㏽㐄lsetmé㍪hp;樳parsl;槤Ādlᑣ㐔e;挣Ā;e㐜㐝檪Ā;s㐢㐣檬;쀀⪬︀ƀflp㐮㐳㑂tcy;䑌Ā;b㐸㐹䀯Ā;a㐾㐿槄r;挿f;쀀𝕤aĀdr㑍ЂesĀ;u㑔㑕晠it»㑕ƀcsu㑠㑹㒟Āau㑥㑯pĀ;sᆈ㑫;쀀⊓︀pĀ;sᆴ㑵;쀀⊔︀uĀbp㑿㒏ƀ;esᆗᆜ㒆etĀ;eᆗ㒍ñᆝƀ;esᆨᆭ㒖etĀ;eᆨ㒝ñᆮƀ;afᅻ㒦ְrť㒫ֱ»ᅼaròᅈȀcemt㒹㒾㓂㓅r;쀀𝓈tmîñiì㐕aræᆾĀar㓎㓕rĀ;f㓔ឿ昆Āan㓚㓭ightĀep㓣㓪psiloîỠhé⺯s»⡒ʀbcmnp㓻㕞ሉ㖋㖎Ҁ;Edemnprs㔎㔏㔑㔕㔞㔣㔬㔱㔶抂;櫅ot;檽Ā;dᇚ㔚ot;櫃ult;櫁ĀEe㔨㔪;櫋;把lus;檿arr;楹ƀeiu㔽㕒㕕tƀ;en㔎㕅㕋qĀ;qᇚ㔏eqĀ;q㔫㔨m;櫇Ābp㕚㕜;櫕;櫓c̀;acensᇭ㕬㕲㕹㕻㌦pproø㋺urlyeñᇾñᇳƀaes㖂㖈㌛pproø㌚qñ㌗g;晪ڀ123;Edehlmnps㖩㖬㖯ሜ㖲㖴㗀㗉㗕㗚㗟㗨㗭耻¹䂹耻²䂲耻³䂳;櫆Āos㖹㖼t;檾ub;櫘Ā;dሢ㗅ot;櫄sĀou㗏㗒l;柉b;櫗arr;楻ult;櫂ĀEe㗤㗦;櫌;抋lus;櫀ƀeiu㗴㘉㘌tƀ;enሜ㗼㘂qĀ;qሢ㖲eqĀ;q㗧㗤m;櫈Ābp㘑㘓;櫔;櫖ƀAan㘜㘠㘭rr;懙rĀhr㘦㘨ë∮Ā;oਫ਩war;椪lig耻ß䃟௡㙑㙝㙠ዎ㙳㙹\0㙾㛂\0\0\0\0\0㛛㜃\0㜉㝬\0\0\0㞇ɲ㙖\0\0㙛get;挖;䏄rë๟ƀaey㙦㙫㙰ron;䅥dil;䅣;䑂lrec;挕r;쀀𝔱Ȁeiko㚆㚝㚵㚼Dz㚋\0㚑eĀ4fኄኁaƀ;sv㚘㚙㚛䎸ym;䏑Ācn㚢㚲kĀas㚨㚮pproø዁im»ኬsðኞĀas㚺㚮ð዁rn耻þ䃾Ǭ̟㛆⋧es膀×;bd㛏㛐㛘䃗Ā;aᤏ㛕r;樱;樰ƀeps㛡㛣㜀á⩍Ȁ;bcf҆㛬㛰㛴ot;挶ir;櫱Ā;o㛹㛼쀀𝕥rk;櫚á㍢rime;怴ƀaip㜏㜒㝤dåቈ΀adempst㜡㝍㝀㝑㝗㝜㝟ngleʀ;dlqr㜰㜱㜶㝀㝂斵own»ᶻeftĀ;e⠀㜾ñम;扜ightĀ;e㊪㝋ñၚot;旬inus;樺lus;樹b;槍ime;樻ezium;揢ƀcht㝲㝽㞁Āry㝷㝻;쀀𝓉;䑆cy;䑛rok;䅧Āio㞋㞎xô᝷headĀlr㞗㞠eftarro÷ࡏightarrow»ཝऀAHabcdfghlmoprstuw㟐㟓㟗㟤㟰㟼㠎㠜㠣㠴㡑㡝㡫㢩㣌㣒㣪㣶ròϭar;楣Ācr㟜㟢ute耻ú䃺òᅐrǣ㟪\0㟭y;䑞ve;䅭Āiy㟵㟺rc耻û䃻;䑃ƀabh㠃㠆㠋ròᎭlac;䅱aòᏃĀir㠓㠘sht;楾;쀀𝔲rave耻ù䃹š㠧㠱rĀlr㠬㠮»ॗ»ႃlk;斀Āct㠹㡍ɯ㠿\0\0㡊rnĀ;e㡅㡆挜r»㡆op;挏ri;旸Āal㡖㡚cr;䅫肻¨͉Āgp㡢㡦on;䅳f;쀀𝕦̀adhlsuᅋ㡸㡽፲㢑㢠ownáᎳarpoonĀlr㢈㢌efô㠭ighô㠯iƀ;hl㢙㢚㢜䏅»ᏺon»㢚parrows;懈ƀcit㢰㣄㣈ɯ㢶\0\0㣁rnĀ;e㢼㢽挝r»㢽op;挎ng;䅯ri;旹cr;쀀𝓊ƀdir㣙㣝㣢ot;拰lde;䅩iĀ;f㜰㣨»᠓Āam㣯㣲rò㢨l耻ü䃼angle;榧ހABDacdeflnoprsz㤜㤟㤩㤭㦵㦸㦽㧟㧤㧨㧳㧹㧽㨁㨠ròϷarĀ;v㤦㤧櫨;櫩asèϡĀnr㤲㤷grt;榜΀eknprst㓣㥆㥋㥒㥝㥤㦖appá␕othinçẖƀhir㓫⻈㥙opô⾵Ā;hᎷ㥢ïㆍĀiu㥩㥭gmá㎳Ābp㥲㦄setneqĀ;q㥽㦀쀀⊊︀;쀀⫋︀setneqĀ;q㦏㦒쀀⊋︀;쀀⫌︀Āhr㦛㦟etá㚜iangleĀlr㦪㦯eft»थight»ၑy;䐲ash»ံƀelr㧄㧒㧗ƀ;beⷪ㧋㧏ar;抻q;扚lip;拮Ābt㧜ᑨaòᑩr;쀀𝔳tré㦮suĀbp㧯㧱»ജ»൙pf;쀀𝕧roð໻tré㦴Ācu㨆㨋r;쀀𝓋Ābp㨐㨘nĀEe㦀㨖»㥾nĀEe㦒㨞»㦐igzag;榚΀cefoprs㨶㨻㩖㩛㩔㩡㩪irc;䅵Ādi㩀㩑Ābg㩅㩉ar;機eĀ;qᗺ㩏;扙erp;愘r;쀀𝔴pf;쀀𝕨Ā;eᑹ㩦atèᑹcr;쀀𝓌ૣណ㪇\0㪋\0㪐㪛\0\0㪝㪨㪫㪯\0\0㫃㫎\0㫘ៜ៟tré៑r;쀀𝔵ĀAa㪔㪗ròσrò৶;䎾ĀAa㪡㪤ròθrò৫að✓is;拻ƀdptឤ㪵㪾Āfl㪺ឩ;쀀𝕩imåឲĀAa㫇㫊ròώròਁĀcq㫒ីr;쀀𝓍Āpt៖㫜ré។Ѐacefiosu㫰㫽㬈㬌㬑㬕㬛㬡cĀuy㫶㫻te耻ý䃽;䑏Āiy㬂㬆rc;䅷;䑋n耻¥䂥r;쀀𝔶cy;䑗pf;쀀𝕪cr;쀀𝓎Ācm㬦㬩y;䑎l耻ÿ䃿Ԁacdefhiosw㭂㭈㭔㭘㭤㭩㭭㭴㭺㮀cute;䅺Āay㭍㭒ron;䅾;䐷ot;䅼Āet㭝㭡træᕟa;䎶r;쀀𝔷cy;䐶grarr;懝pf;쀀𝕫cr;쀀𝓏Ājn㮅㮇;怍j;怌'.split("").map((function(e){return e.charCodeAt(0)})))},8622:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=new Uint16Array("Ȁaglq\tɭ\0\0p;䀦os;䀧t;䀾t;䀼uot;䀢".split("").map((function(e){return e.charCodeAt(0)})))},8635:(e,t)=>{"use strict";function r(e){for(var t=1;t{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.decodeXMLStrict=t.decodeHTML5Strict=t.decodeHTML4Strict=t.decodeHTML5=t.decodeHTML4=t.decodeHTMLAttribute=t.decodeHTMLStrict=t.decodeHTML=t.decodeXML=t.DecodingMode=t.EntityDecoder=t.encodeHTML5=t.encodeHTML4=t.encodeNonAsciiHTML=t.encodeHTML=t.escapeText=t.escapeAttribute=t.escapeUTF8=t.escape=t.encodeXML=t.encode=t.decodeStrict=t.decode=t.EncodingMode=t.EntityLevel=void 0;var n,i,s=r(3379),o=r(3231),a=r(7078);function l(e,t){if(void 0===t&&(t=n.XML),("number"==typeof t?t:t.level)===n.HTML){var r="object"==typeof t?t.mode:void 0;return(0,s.decodeHTML)(e,r)}return(0,s.decodeXML)(e)}!function(e){e[e.XML=0]="XML",e[e.HTML=1]="HTML"}(n=t.EntityLevel||(t.EntityLevel={})),function(e){e[e.UTF8=0]="UTF8",e[e.ASCII=1]="ASCII",e[e.Extensive=2]="Extensive",e[e.Attribute=3]="Attribute",e[e.Text=4]="Text"}(i=t.EncodingMode||(t.EncodingMode={})),t.decode=l,t.decodeStrict=function(e,t){var r;void 0===t&&(t=n.XML);var i="number"==typeof t?{level:t}:t;return null!==(r=i.mode)&&void 0!==r||(i.mode=s.DecodingMode.Strict),l(e,i)},t.encode=function(e,t){void 0===t&&(t=n.XML);var r="number"==typeof t?{level:t}:t;return r.mode===i.UTF8?(0,a.escapeUTF8)(e):r.mode===i.Attribute?(0,a.escapeAttribute)(e):r.mode===i.Text?(0,a.escapeText)(e):r.level===n.HTML?r.mode===i.ASCII?(0,o.encodeNonAsciiHTML)(e):(0,o.encodeHTML)(e):(0,a.encodeXML)(e)};var c=r(7078);Object.defineProperty(t,"encodeXML",{enumerable:!0,get:function(){return c.encodeXML}}),Object.defineProperty(t,"escape",{enumerable:!0,get:function(){return c.escape}}),Object.defineProperty(t,"escapeUTF8",{enumerable:!0,get:function(){return c.escapeUTF8}}),Object.defineProperty(t,"escapeAttribute",{enumerable:!0,get:function(){return c.escapeAttribute}}),Object.defineProperty(t,"escapeText",{enumerable:!0,get:function(){return c.escapeText}});var u=r(3231);Object.defineProperty(t,"encodeHTML",{enumerable:!0,get:function(){return u.encodeHTML}}),Object.defineProperty(t,"encodeNonAsciiHTML",{enumerable:!0,get:function(){return u.encodeNonAsciiHTML}}),Object.defineProperty(t,"encodeHTML4",{enumerable:!0,get:function(){return u.encodeHTML}}),Object.defineProperty(t,"encodeHTML5",{enumerable:!0,get:function(){return u.encodeHTML}});var h=r(3379);Object.defineProperty(t,"EntityDecoder",{enumerable:!0,get:function(){return h.EntityDecoder}}),Object.defineProperty(t,"DecodingMode",{enumerable:!0,get:function(){return h.DecodingMode}}),Object.defineProperty(t,"decodeXML",{enumerable:!0,get:function(){return h.decodeXML}}),Object.defineProperty(t,"decodeHTML",{enumerable:!0,get:function(){return h.decodeHTML}}),Object.defineProperty(t,"decodeHTMLStrict",{enumerable:!0,get:function(){return h.decodeHTMLStrict}}),Object.defineProperty(t,"decodeHTMLAttribute",{enumerable:!0,get:function(){return h.decodeHTMLAttribute}}),Object.defineProperty(t,"decodeHTML4",{enumerable:!0,get:function(){return h.decodeHTML}}),Object.defineProperty(t,"decodeHTML5",{enumerable:!0,get:function(){return h.decodeHTML}}),Object.defineProperty(t,"decodeHTML4Strict",{enumerable:!0,get:function(){return h.decodeHTMLStrict}}),Object.defineProperty(t,"decodeHTML5Strict",{enumerable:!0,get:function(){return h.decodeHTMLStrict}}),Object.defineProperty(t,"decodeXMLStrict",{enumerable:!0,get:function(){return h.decodeXML}})},2189:e=>{"use strict";e.exports=e=>{if("string"!=typeof e)throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}},4291:function(e,t,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,i)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&n(t,e,r);return i(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.Parser=void 0;var o=s(r(6439)),a=r(3379),l=new Set(["input","option","optgroup","select","button","datalist","textarea"]),c=new Set(["p"]),u=new Set(["thead","tbody"]),h=new Set(["dd","dt"]),d=new Set(["rt","rp"]),p=new Map([["tr",new Set(["tr","th","td"])],["th",new Set(["th"])],["td",new Set(["thead","th","td"])],["body",new Set(["head","link","script"])],["li",new Set(["li"])],["p",c],["h1",c],["h2",c],["h3",c],["h4",c],["h5",c],["h6",c],["select",l],["input",l],["output",l],["button",l],["datalist",l],["textarea",l],["option",new Set(["option"])],["optgroup",new Set(["optgroup","option"])],["dd",h],["dt",h],["address",c],["article",c],["aside",c],["blockquote",c],["details",c],["div",c],["dl",c],["fieldset",c],["figcaption",c],["figure",c],["footer",c],["form",c],["header",c],["hr",c],["main",c],["nav",c],["ol",c],["pre",c],["section",c],["table",c],["ul",c],["rt",d],["rp",d],["tbody",u],["tfoot",u]]),f=new Set(["area","base","basefont","br","col","command","embed","frame","hr","img","input","isindex","keygen","link","meta","param","source","track","wbr"]),m=new Set(["math","svg"]),g=new Set(["mi","mo","mn","ms","mtext","annotation-xml","foreignobject","desc","title"]),b=/\s|\//,y=function(){function e(e,t){var r,n,i,s,a;void 0===t&&(t={}),this.options=t,this.startIndex=0,this.endIndex=0,this.openTagStart=0,this.tagname="",this.attribname="",this.attribvalue="",this.attribs=null,this.stack=[],this.foreignContext=[],this.buffers=[],this.bufferOffset=0,this.writeIndex=0,this.ended=!1,this.cbs=null!=e?e:{},this.lowerCaseTagNames=null!==(r=t.lowerCaseTags)&&void 0!==r?r:!t.xmlMode,this.lowerCaseAttributeNames=null!==(n=t.lowerCaseAttributeNames)&&void 0!==n?n:!t.xmlMode,this.tokenizer=new(null!==(i=t.Tokenizer)&&void 0!==i?i:o.default)(this.options,this),null===(a=(s=this.cbs).onparserinit)||void 0===a||a.call(s,this)}return e.prototype.ontext=function(e,t){var r,n,i=this.getSlice(e,t);this.endIndex=t-1,null===(n=(r=this.cbs).ontext)||void 0===n||n.call(r,i),this.startIndex=t},e.prototype.ontextentity=function(e){var t,r,n=this.tokenizer.getSectionStart();this.endIndex=n-1,null===(r=(t=this.cbs).ontext)||void 0===r||r.call(t,(0,a.fromCodePoint)(e)),this.startIndex=n},e.prototype.isVoidElement=function(e){return!this.options.xmlMode&&f.has(e)},e.prototype.onopentagname=function(e,t){this.endIndex=t;var r=this.getSlice(e,t);this.lowerCaseTagNames&&(r=r.toLowerCase()),this.emitOpenTag(r)},e.prototype.emitOpenTag=function(e){var t,r,n,i;this.openTagStart=this.startIndex,this.tagname=e;var s=!this.options.xmlMode&&p.get(e);if(s)for(;this.stack.length>0&&s.has(this.stack[this.stack.length-1]);){var o=this.stack.pop();null===(r=(t=this.cbs).onclosetag)||void 0===r||r.call(t,o,!0)}this.isVoidElement(e)||(this.stack.push(e),m.has(e)?this.foreignContext.push(!0):g.has(e)&&this.foreignContext.push(!1)),null===(i=(n=this.cbs).onopentagname)||void 0===i||i.call(n,e),this.cbs.onopentag&&(this.attribs={})},e.prototype.endOpenTag=function(e){var t,r;this.startIndex=this.openTagStart,this.attribs&&(null===(r=(t=this.cbs).onopentag)||void 0===r||r.call(t,this.tagname,this.attribs,e),this.attribs=null),this.cbs.onclosetag&&this.isVoidElement(this.tagname)&&this.cbs.onclosetag(this.tagname,!0),this.tagname=""},e.prototype.onopentagend=function(e){this.endIndex=e,this.endOpenTag(!1),this.startIndex=e+1},e.prototype.onclosetag=function(e,t){var r,n,i,s,o,a;this.endIndex=t;var l=this.getSlice(e,t);if(this.lowerCaseTagNames&&(l=l.toLowerCase()),(m.has(l)||g.has(l))&&this.foreignContext.pop(),this.isVoidElement(l))this.options.xmlMode||"br"!==l||(null===(n=(r=this.cbs).onopentagname)||void 0===n||n.call(r,"br"),null===(s=(i=this.cbs).onopentag)||void 0===s||s.call(i,"br",{},!0),null===(a=(o=this.cbs).onclosetag)||void 0===a||a.call(o,"br",!1));else{var c=this.stack.lastIndexOf(l);if(-1!==c)if(this.cbs.onclosetag)for(var u=this.stack.length-c;u--;)this.cbs.onclosetag(this.stack.pop(),0!==u);else this.stack.length=c;else this.options.xmlMode||"p"!==l||(this.emitOpenTag("p"),this.closeCurrentTag(!0))}this.startIndex=t+1},e.prototype.onselfclosingtag=function(e){this.endIndex=e,this.options.xmlMode||this.options.recognizeSelfClosing||this.foreignContext[this.foreignContext.length-1]?(this.closeCurrentTag(!1),this.startIndex=e+1):this.onopentagend(e)},e.prototype.closeCurrentTag=function(e){var t,r,n=this.tagname;this.endOpenTag(e),this.stack[this.stack.length-1]===n&&(null===(r=(t=this.cbs).onclosetag)||void 0===r||r.call(t,n,!e),this.stack.pop())},e.prototype.onattribname=function(e,t){this.startIndex=e;var r=this.getSlice(e,t);this.attribname=this.lowerCaseAttributeNames?r.toLowerCase():r},e.prototype.onattribdata=function(e,t){this.attribvalue+=this.getSlice(e,t)},e.prototype.onattribentity=function(e){this.attribvalue+=(0,a.fromCodePoint)(e)},e.prototype.onattribend=function(e,t){var r,n;this.endIndex=t,null===(n=(r=this.cbs).onattribute)||void 0===n||n.call(r,this.attribname,this.attribvalue,e===o.QuoteType.Double?'"':e===o.QuoteType.Single?"'":e===o.QuoteType.NoValue?void 0:null),this.attribs&&!Object.prototype.hasOwnProperty.call(this.attribs,this.attribname)&&(this.attribs[this.attribname]=this.attribvalue),this.attribvalue=""},e.prototype.getInstructionName=function(e){var t=e.search(b),r=t<0?e:e.substr(0,t);return this.lowerCaseTagNames&&(r=r.toLowerCase()),r},e.prototype.ondeclaration=function(e,t){this.endIndex=t;var r=this.getSlice(e,t);if(this.cbs.onprocessinginstruction){var n=this.getInstructionName(r);this.cbs.onprocessinginstruction("!".concat(n),"!".concat(r))}this.startIndex=t+1},e.prototype.onprocessinginstruction=function(e,t){this.endIndex=t;var r=this.getSlice(e,t);if(this.cbs.onprocessinginstruction){var n=this.getInstructionName(r);this.cbs.onprocessinginstruction("?".concat(n),"?".concat(r))}this.startIndex=t+1},e.prototype.oncomment=function(e,t,r){var n,i,s,o;this.endIndex=t,null===(i=(n=this.cbs).oncomment)||void 0===i||i.call(n,this.getSlice(e,t-r)),null===(o=(s=this.cbs).oncommentend)||void 0===o||o.call(s),this.startIndex=t+1},e.prototype.oncdata=function(e,t,r){var n,i,s,o,a,l,c,u,h,d;this.endIndex=t;var p=this.getSlice(e,t-r);this.options.xmlMode||this.options.recognizeCDATA?(null===(i=(n=this.cbs).oncdatastart)||void 0===i||i.call(n),null===(o=(s=this.cbs).ontext)||void 0===o||o.call(s,p),null===(l=(a=this.cbs).oncdataend)||void 0===l||l.call(a)):(null===(u=(c=this.cbs).oncomment)||void 0===u||u.call(c,"[CDATA[".concat(p,"]]")),null===(d=(h=this.cbs).oncommentend)||void 0===d||d.call(h)),this.startIndex=t+1},e.prototype.onend=function(){var e,t;if(this.cbs.onclosetag){this.endIndex=this.startIndex;for(var r=this.stack.length;r>0;this.cbs.onclosetag(this.stack[--r],!0));}null===(t=(e=this.cbs).onend)||void 0===t||t.call(e)},e.prototype.reset=function(){var e,t,r,n;null===(t=(e=this.cbs).onreset)||void 0===t||t.call(e),this.tokenizer.reset(),this.tagname="",this.attribname="",this.attribs=null,this.stack.length=0,this.startIndex=0,this.endIndex=0,null===(n=(r=this.cbs).onparserinit)||void 0===n||n.call(r,this),this.buffers.length=0,this.bufferOffset=0,this.writeIndex=0,this.ended=!1},e.prototype.parseComplete=function(e){this.reset(),this.end(e)},e.prototype.getSlice=function(e,t){for(;e-this.bufferOffset>=this.buffers[0].length;)this.shiftBuffer();for(var r=this.buffers[0].slice(e-this.bufferOffset,t-this.bufferOffset);t-this.bufferOffset>this.buffers[0].length;)this.shiftBuffer(),r+=this.buffers[0].slice(0,t-this.bufferOffset);return r},e.prototype.shiftBuffer=function(){this.bufferOffset+=this.buffers[0].length,this.writeIndex--,this.buffers.shift()},e.prototype.write=function(e){var t,r;this.ended?null===(r=(t=this.cbs).onerror)||void 0===r||r.call(t,new Error(".write() after done!")):(this.buffers.push(e),this.tokenizer.running&&(this.tokenizer.write(e),this.writeIndex++))},e.prototype.end=function(e){var t,r;this.ended?null===(r=(t=this.cbs).onerror)||void 0===r||r.call(t,new Error(".end() after done!")):(e&&this.write(e),this.ended=!0,this.tokenizer.end())},e.prototype.pause=function(){this.tokenizer.pause()},e.prototype.resume=function(){for(this.tokenizer.resume();this.tokenizer.running&&this.writeIndex{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.QuoteType=void 0;var n,i,s,o=r(3379);function a(e){return e===n.Space||e===n.NewLine||e===n.Tab||e===n.FormFeed||e===n.CarriageReturn}function l(e){return e===n.Slash||e===n.Gt||a(e)}function c(e){return e>=n.Zero&&e<=n.Nine}!function(e){e[e.Tab=9]="Tab",e[e.NewLine=10]="NewLine",e[e.FormFeed=12]="FormFeed",e[e.CarriageReturn=13]="CarriageReturn",e[e.Space=32]="Space",e[e.ExclamationMark=33]="ExclamationMark",e[e.Number=35]="Number",e[e.Amp=38]="Amp",e[e.SingleQuote=39]="SingleQuote",e[e.DoubleQuote=34]="DoubleQuote",e[e.Dash=45]="Dash",e[e.Slash=47]="Slash",e[e.Zero=48]="Zero",e[e.Nine=57]="Nine",e[e.Semi=59]="Semi",e[e.Lt=60]="Lt",e[e.Eq=61]="Eq",e[e.Gt=62]="Gt",e[e.Questionmark=63]="Questionmark",e[e.UpperA=65]="UpperA",e[e.LowerA=97]="LowerA",e[e.UpperF=70]="UpperF",e[e.LowerF=102]="LowerF",e[e.UpperZ=90]="UpperZ",e[e.LowerZ=122]="LowerZ",e[e.LowerX=120]="LowerX",e[e.OpeningSquareBracket=91]="OpeningSquareBracket"}(n||(n={})),function(e){e[e.Text=1]="Text",e[e.BeforeTagName=2]="BeforeTagName",e[e.InTagName=3]="InTagName",e[e.InSelfClosingTag=4]="InSelfClosingTag",e[e.BeforeClosingTagName=5]="BeforeClosingTagName",e[e.InClosingTagName=6]="InClosingTagName",e[e.AfterClosingTagName=7]="AfterClosingTagName",e[e.BeforeAttributeName=8]="BeforeAttributeName",e[e.InAttributeName=9]="InAttributeName",e[e.AfterAttributeName=10]="AfterAttributeName",e[e.BeforeAttributeValue=11]="BeforeAttributeValue",e[e.InAttributeValueDq=12]="InAttributeValueDq",e[e.InAttributeValueSq=13]="InAttributeValueSq",e[e.InAttributeValueNq=14]="InAttributeValueNq",e[e.BeforeDeclaration=15]="BeforeDeclaration",e[e.InDeclaration=16]="InDeclaration",e[e.InProcessingInstruction=17]="InProcessingInstruction",e[e.BeforeComment=18]="BeforeComment",e[e.CDATASequence=19]="CDATASequence",e[e.InSpecialComment=20]="InSpecialComment",e[e.InCommentLike=21]="InCommentLike",e[e.BeforeSpecialS=22]="BeforeSpecialS",e[e.SpecialStartSequence=23]="SpecialStartSequence",e[e.InSpecialTag=24]="InSpecialTag",e[e.BeforeEntity=25]="BeforeEntity",e[e.BeforeNumericEntity=26]="BeforeNumericEntity",e[e.InNamedEntity=27]="InNamedEntity",e[e.InNumericEntity=28]="InNumericEntity",e[e.InHexEntity=29]="InHexEntity"}(i||(i={})),function(e){e[e.NoValue=0]="NoValue",e[e.Unquoted=1]="Unquoted",e[e.Single=2]="Single",e[e.Double=3]="Double"}(s=t.QuoteType||(t.QuoteType={}));var u={Cdata:new Uint8Array([67,68,65,84,65,91]),CdataEnd:new Uint8Array([93,93,62]),CommentEnd:new Uint8Array([45,45,62]),ScriptEnd:new Uint8Array([60,47,115,99,114,105,112,116]),StyleEnd:new Uint8Array([60,47,115,116,121,108,101]),TitleEnd:new Uint8Array([60,47,116,105,116,108,101])},h=function(){function e(e,t){var r=e.xmlMode,n=void 0!==r&&r,s=e.decodeEntities,a=void 0===s||s;this.cbs=t,this.state=i.Text,this.buffer="",this.sectionStart=0,this.index=0,this.baseState=i.Text,this.isSpecial=!1,this.running=!0,this.offset=0,this.currentSequence=void 0,this.sequenceIndex=0,this.trieIndex=0,this.trieCurrent=0,this.entityResult=0,this.entityExcess=0,this.xmlMode=n,this.decodeEntities=a,this.entityTrie=n?o.xmlDecodeTree:o.htmlDecodeTree}return e.prototype.reset=function(){this.state=i.Text,this.buffer="",this.sectionStart=0,this.index=0,this.baseState=i.Text,this.currentSequence=void 0,this.running=!0,this.offset=0},e.prototype.write=function(e){this.offset+=this.buffer.length,this.buffer=e,this.parse()},e.prototype.end=function(){this.running&&this.finish()},e.prototype.pause=function(){this.running=!1},e.prototype.resume=function(){this.running=!0,this.indexthis.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=i.BeforeTagName,this.sectionStart=this.index):this.decodeEntities&&e===n.Amp&&(this.state=i.BeforeEntity)},e.prototype.stateSpecialStartSequence=function(e){var t=this.sequenceIndex===this.currentSequence.length;if(t?l(e):(32|e)===this.currentSequence[this.sequenceIndex]){if(!t)return void this.sequenceIndex++}else this.isSpecial=!1;this.sequenceIndex=0,this.state=i.InTagName,this.stateInTagName(e)},e.prototype.stateInSpecialTag=function(e){if(this.sequenceIndex===this.currentSequence.length){if(e===n.Gt||a(e)){var t=this.index-this.currentSequence.length;if(this.sectionStart=n.LowerA&&e<=n.LowerZ||e>=n.UpperA&&e<=n.UpperZ}(e)},e.prototype.startSpecial=function(e,t){this.isSpecial=!0,this.currentSequence=e,this.sequenceIndex=t,this.state=i.SpecialStartSequence},e.prototype.stateBeforeTagName=function(e){if(e===n.ExclamationMark)this.state=i.BeforeDeclaration,this.sectionStart=this.index+1;else if(e===n.Questionmark)this.state=i.InProcessingInstruction,this.sectionStart=this.index+1;else if(this.isTagStartChar(e)){var t=32|e;this.sectionStart=this.index,this.xmlMode||t!==u.TitleEnd[2]?this.state=this.xmlMode||t!==u.ScriptEnd[2]?i.InTagName:i.BeforeSpecialS:this.startSpecial(u.TitleEnd,3)}else e===n.Slash?this.state=i.BeforeClosingTagName:(this.state=i.Text,this.stateText(e))},e.prototype.stateInTagName=function(e){l(e)&&(this.cbs.onopentagname(this.sectionStart,this.index),this.sectionStart=-1,this.state=i.BeforeAttributeName,this.stateBeforeAttributeName(e))},e.prototype.stateBeforeClosingTagName=function(e){a(e)||(e===n.Gt?this.state=i.Text:(this.state=this.isTagStartChar(e)?i.InClosingTagName:i.InSpecialComment,this.sectionStart=this.index))},e.prototype.stateInClosingTagName=function(e){(e===n.Gt||a(e))&&(this.cbs.onclosetag(this.sectionStart,this.index),this.sectionStart=-1,this.state=i.AfterClosingTagName,this.stateAfterClosingTagName(e))},e.prototype.stateAfterClosingTagName=function(e){(e===n.Gt||this.fastForwardTo(n.Gt))&&(this.state=i.Text,this.baseState=i.Text,this.sectionStart=this.index+1)},e.prototype.stateBeforeAttributeName=function(e){e===n.Gt?(this.cbs.onopentagend(this.index),this.isSpecial?(this.state=i.InSpecialTag,this.sequenceIndex=0):this.state=i.Text,this.baseState=this.state,this.sectionStart=this.index+1):e===n.Slash?this.state=i.InSelfClosingTag:a(e)||(this.state=i.InAttributeName,this.sectionStart=this.index)},e.prototype.stateInSelfClosingTag=function(e){e===n.Gt?(this.cbs.onselfclosingtag(this.index),this.state=i.Text,this.baseState=i.Text,this.sectionStart=this.index+1,this.isSpecial=!1):a(e)||(this.state=i.BeforeAttributeName,this.stateBeforeAttributeName(e))},e.prototype.stateInAttributeName=function(e){(e===n.Eq||l(e))&&(this.cbs.onattribname(this.sectionStart,this.index),this.sectionStart=-1,this.state=i.AfterAttributeName,this.stateAfterAttributeName(e))},e.prototype.stateAfterAttributeName=function(e){e===n.Eq?this.state=i.BeforeAttributeValue:e===n.Slash||e===n.Gt?(this.cbs.onattribend(s.NoValue,this.index),this.state=i.BeforeAttributeName,this.stateBeforeAttributeName(e)):a(e)||(this.cbs.onattribend(s.NoValue,this.index),this.state=i.InAttributeName,this.sectionStart=this.index)},e.prototype.stateBeforeAttributeValue=function(e){e===n.DoubleQuote?(this.state=i.InAttributeValueDq,this.sectionStart=this.index+1):e===n.SingleQuote?(this.state=i.InAttributeValueSq,this.sectionStart=this.index+1):a(e)||(this.sectionStart=this.index,this.state=i.InAttributeValueNq,this.stateInAttributeValueNoQuotes(e))},e.prototype.handleInAttributeValue=function(e,t){e===t||!this.decodeEntities&&this.fastForwardTo(t)?(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=-1,this.cbs.onattribend(t===n.DoubleQuote?s.Double:s.Single,this.index),this.state=i.BeforeAttributeName):this.decodeEntities&&e===n.Amp&&(this.baseState=this.state,this.state=i.BeforeEntity)},e.prototype.stateInAttributeValueDoubleQuotes=function(e){this.handleInAttributeValue(e,n.DoubleQuote)},e.prototype.stateInAttributeValueSingleQuotes=function(e){this.handleInAttributeValue(e,n.SingleQuote)},e.prototype.stateInAttributeValueNoQuotes=function(e){a(e)||e===n.Gt?(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=-1,this.cbs.onattribend(s.Unquoted,this.index),this.state=i.BeforeAttributeName,this.stateBeforeAttributeName(e)):this.decodeEntities&&e===n.Amp&&(this.baseState=this.state,this.state=i.BeforeEntity)},e.prototype.stateBeforeDeclaration=function(e){e===n.OpeningSquareBracket?(this.state=i.CDATASequence,this.sequenceIndex=0):this.state=e===n.Dash?i.BeforeComment:i.InDeclaration},e.prototype.stateInDeclaration=function(e){(e===n.Gt||this.fastForwardTo(n.Gt))&&(this.cbs.ondeclaration(this.sectionStart,this.index),this.state=i.Text,this.sectionStart=this.index+1)},e.prototype.stateInProcessingInstruction=function(e){(e===n.Gt||this.fastForwardTo(n.Gt))&&(this.cbs.onprocessinginstruction(this.sectionStart,this.index),this.state=i.Text,this.sectionStart=this.index+1)},e.prototype.stateBeforeComment=function(e){e===n.Dash?(this.state=i.InCommentLike,this.currentSequence=u.CommentEnd,this.sequenceIndex=2,this.sectionStart=this.index+1):this.state=i.InDeclaration},e.prototype.stateInSpecialComment=function(e){(e===n.Gt||this.fastForwardTo(n.Gt))&&(this.cbs.oncomment(this.sectionStart,this.index,0),this.state=i.Text,this.sectionStart=this.index+1)},e.prototype.stateBeforeSpecialS=function(e){var t=32|e;t===u.ScriptEnd[3]?this.startSpecial(u.ScriptEnd,4):t===u.StyleEnd[3]?this.startSpecial(u.StyleEnd,4):(this.state=i.InTagName,this.stateInTagName(e))},e.prototype.stateBeforeEntity=function(e){this.entityExcess=1,this.entityResult=0,e===n.Number?this.state=i.BeforeNumericEntity:e===n.Amp||(this.trieIndex=0,this.trieCurrent=this.entityTrie[0],this.state=i.InNamedEntity,this.stateInNamedEntity(e))},e.prototype.stateInNamedEntity=function(e){if(this.entityExcess+=1,this.trieIndex=(0,o.determineBranch)(this.entityTrie,this.trieCurrent,this.trieIndex+1,e),this.trieIndex<0)return this.emitNamedEntity(),void this.index--;this.trieCurrent=this.entityTrie[this.trieIndex];var t=this.trieCurrent&o.BinTrieFlags.VALUE_LENGTH;if(t){var r=(t>>14)-1;if(this.allowLegacyEntity()||e===n.Semi){var i=this.index-this.entityExcess+1;i>this.sectionStart&&this.emitPartial(this.sectionStart,i),this.entityResult=this.trieIndex,this.trieIndex+=r,this.entityExcess=0,this.sectionStart=this.index+1,0===r&&this.emitNamedEntity()}else this.trieIndex+=r}},e.prototype.emitNamedEntity=function(){if(this.state=this.baseState,0!==this.entityResult)switch((this.entityTrie[this.entityResult]&o.BinTrieFlags.VALUE_LENGTH)>>14){case 1:this.emitCodePoint(this.entityTrie[this.entityResult]&~o.BinTrieFlags.VALUE_LENGTH);break;case 2:this.emitCodePoint(this.entityTrie[this.entityResult+1]);break;case 3:this.emitCodePoint(this.entityTrie[this.entityResult+1]),this.emitCodePoint(this.entityTrie[this.entityResult+2])}},e.prototype.stateBeforeNumericEntity=function(e){(32|e)===n.LowerX?(this.entityExcess++,this.state=i.InHexEntity):(this.state=i.InNumericEntity,this.stateInNumericEntity(e))},e.prototype.emitNumericEntity=function(e){var t=this.index-this.entityExcess-1;t+2+Number(this.state===i.InHexEntity)!==this.index&&(t>this.sectionStart&&this.emitPartial(this.sectionStart,t),this.sectionStart=this.index+Number(e),this.emitCodePoint((0,o.replaceCodePoint)(this.entityResult))),this.state=this.baseState},e.prototype.stateInNumericEntity=function(e){e===n.Semi?this.emitNumericEntity(!0):c(e)?(this.entityResult=10*this.entityResult+(e-n.Zero),this.entityExcess++):(this.allowLegacyEntity()?this.emitNumericEntity(!1):this.state=this.baseState,this.index--)},e.prototype.stateInHexEntity=function(e){e===n.Semi?this.emitNumericEntity(!0):c(e)?(this.entityResult=16*this.entityResult+(e-n.Zero),this.entityExcess++):function(e){return e>=n.UpperA&&e<=n.UpperF||e>=n.LowerA&&e<=n.LowerF}(e)?(this.entityResult=16*this.entityResult+((32|e)-n.LowerA+10),this.entityExcess++):(this.allowLegacyEntity()?this.emitNumericEntity(!1):this.state=this.baseState,this.index--)},e.prototype.allowLegacyEntity=function(){return!this.xmlMode&&(this.baseState===i.Text||this.baseState===i.InSpecialTag)},e.prototype.cleanup=function(){this.running&&this.sectionStart!==this.index&&(this.state===i.Text||this.state===i.InSpecialTag&&0===this.sequenceIndex?(this.cbs.ontext(this.sectionStart,this.index),this.sectionStart=this.index):this.state!==i.InAttributeValueDq&&this.state!==i.InAttributeValueSq&&this.state!==i.InAttributeValueNq||(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=this.index))},e.prototype.shouldContinue=function(){return this.index{"use strict";function r(e){return"[object Object]"===Object.prototype.toString.call(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.isPlainObject=function(e){var t,n;return!1!==r(e)&&(void 0===(t=e.constructor)||!1!==r(n=t.prototype)&&!1!==n.hasOwnProperty("isPrototypeOf"))}},8287:function(e,t){var r,n;void 0===(n="function"==typeof(r=function(){return function(e){function t(e){return" "===e||"\t"===e||"\n"===e||"\f"===e||"\r"===e}function r(t){var r,n=t.exec(e.substring(m));if(n)return r=n[0],m+=r.length,r}for(var n,i,s,o,a,l=e.length,c=/^[ \t\n\r\u000c]+/,u=/^[, \t\n\r\u000c]+/,h=/^[^ \t\n\r\u000c]+/,d=/[,]+$/,p=/^\d+$/,f=/^-?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/,m=0,g=[];;){if(r(u),m>=l)return g;n=r(h),i=[],","===n.slice(-1)?(n=n.replace(d,""),y()):b()}function b(){for(r(c),s="",o="in descriptor";;){if(a=e.charAt(m),"in descriptor"===o)if(t(a))s&&(i.push(s),s="",o="after descriptor");else{if(","===a)return m+=1,s&&i.push(s),void y();if("("===a)s+=a,o="in parens";else{if(""===a)return s&&i.push(s),void y();s+=a}}else if("in parens"===o)if(")"===a)s+=a,o="in descriptor";else{if(""===a)return i.push(s),void y();s+=a}else if("after descriptor"===o)if(t(a));else{if(""===a)return void y();o="in descriptor",m-=1}m+=1}}function y(){var t,r,s,o,a,l,c,u,h,d=!1,m={};for(o=0;o{var t=String,r=function(){return{isColorSupported:!1,reset:t,bold:t,dim:t,italic:t,underline:t,inverse:t,hidden:t,strikethrough:t,black:t,red:t,green:t,yellow:t,blue:t,magenta:t,cyan:t,white:t,gray:t,bgBlack:t,bgRed:t,bgGreen:t,bgYellow:t,bgBlue:t,bgMagenta:t,bgCyan:t,bgWhite:t,blackBright:t,redBright:t,greenBright:t,yellowBright:t,blueBright:t,magentaBright:t,cyanBright:t,whiteBright:t,bgBlackBright:t,bgRedBright:t,bgGreenBright:t,bgYellowBright:t,bgBlueBright:t,bgMagentaBright:t,bgCyanBright:t,bgWhiteBright:t}};e.exports=r(),e.exports.createColors=r},697:(e,t,r)=>{"use strict";let n=r(2780);class i extends n{constructor(e){super(e),this.type="atrule"}append(...e){return this.proxyOf.nodes||(this.nodes=[]),super.append(...e)}prepend(...e){return this.proxyOf.nodes||(this.nodes=[]),super.prepend(...e)}}e.exports=i,i.default=i,n.registerAtRule(i)},7910:(e,t,r)=>{"use strict";let n=r(1051);class i extends n{constructor(e){super(e),this.type="comment"}}e.exports=i,i.default=i},2780:(e,t,r)=>{"use strict";let n,i,s,o,a=r(7910),l=r(3531),c=r(1051),{isClean:u,my:h}=r(2990);function d(e){return e.map((e=>(e.nodes&&(e.nodes=d(e.nodes)),delete e.source,e)))}function p(e){if(e[u]=!1,e.proxyOf.nodes)for(let t of e.proxyOf.nodes)p(t)}class f extends c{append(...e){for(let t of e){let e=this.normalize(t,this.last);for(let t of e)this.proxyOf.nodes.push(t)}return this.markDirty(),this}cleanRaws(e){if(super.cleanRaws(e),this.nodes)for(let t of this.nodes)t.cleanRaws(e)}each(e){if(!this.proxyOf.nodes)return;let t,r,n=this.getIterator();for(;this.indexes[n]"proxyOf"===t?e:e[t]?"each"===t||"string"==typeof t&&t.startsWith("walk")?(...r)=>e[t](...r.map((e=>"function"==typeof e?(t,r)=>e(t.toProxy(),r):e))):"every"===t||"some"===t?r=>e[t](((e,...t)=>r(e.toProxy(),...t))):"root"===t?()=>e.root().toProxy():"nodes"===t?e.nodes.map((e=>e.toProxy())):"first"===t||"last"===t?e[t].toProxy():e[t]:e[t],set:(e,t,r)=>(e[t]===r||(e[t]=r,"name"!==t&&"params"!==t&&"selector"!==t||e.markDirty()),!0)}}index(e){return"number"==typeof e?e:(e.proxyOf&&(e=e.proxyOf),this.proxyOf.nodes.indexOf(e))}insertAfter(e,t){let r,n=this.index(e),i=this.normalize(t,this.proxyOf.nodes[n]).reverse();n=this.index(e);for(let e of i)this.proxyOf.nodes.splice(n+1,0,e);for(let e in this.indexes)r=this.indexes[e],n(e[h]||f.rebuild(e),(e=e.proxyOf).parent&&e.parent.removeChild(e),e[u]&&p(e),e.raws||(e.raws={}),void 0===e.raws.before&&t&&void 0!==t.raws.before&&(e.raws.before=t.raws.before.replace(/\S/g,"")),e.parent=this.proxyOf,e)))}prepend(...e){e=e.reverse();for(let t of e){let e=this.normalize(t,this.first,"prepend").reverse();for(let t of e)this.proxyOf.nodes.unshift(t);for(let t in this.indexes)this.indexes[t]=this.indexes[t]+e.length}return this.markDirty(),this}push(e){return e.parent=this,this.proxyOf.nodes.push(e),this}removeAll(){for(let e of this.proxyOf.nodes)e.parent=void 0;return this.proxyOf.nodes=[],this.markDirty(),this}removeChild(e){let t;e=this.index(e),this.proxyOf.nodes[e].parent=void 0,this.proxyOf.nodes.splice(e,1);for(let r in this.indexes)t=this.indexes[r],t>=e&&(this.indexes[r]=t-1);return this.markDirty(),this}replaceValues(e,t,r){return r||(r=t,t={}),this.walkDecls((n=>{t.props&&!t.props.includes(n.prop)||t.fast&&!n.value.includes(t.fast)||(n.value=n.value.replace(e,r))})),this.markDirty(),this}some(e){return this.nodes.some(e)}walk(e){return this.each(((t,r)=>{let n;try{n=e(t,r)}catch(e){throw t.addToError(e)}return!1!==n&&t.walk&&(n=t.walk(e)),n}))}walkAtRules(e,t){return t?e instanceof RegExp?this.walk(((r,n)=>{if("atrule"===r.type&&e.test(r.name))return t(r,n)})):this.walk(((r,n)=>{if("atrule"===r.type&&r.name===e)return t(r,n)})):(t=e,this.walk(((e,r)=>{if("atrule"===e.type)return t(e,r)})))}walkComments(e){return this.walk(((t,r)=>{if("comment"===t.type)return e(t,r)}))}walkDecls(e,t){return t?e instanceof RegExp?this.walk(((r,n)=>{if("decl"===r.type&&e.test(r.prop))return t(r,n)})):this.walk(((r,n)=>{if("decl"===r.type&&r.prop===e)return t(r,n)})):(t=e,this.walk(((e,r)=>{if("decl"===e.type)return t(e,r)})))}walkRules(e,t){return t?e instanceof RegExp?this.walk(((r,n)=>{if("rule"===r.type&&e.test(r.selector))return t(r,n)})):this.walk(((r,n)=>{if("rule"===r.type&&r.selector===e)return t(r,n)})):(t=e,this.walk(((e,r)=>{if("rule"===e.type)return t(e,r)})))}get first(){if(this.proxyOf.nodes)return this.proxyOf.nodes[0]}get last(){if(this.proxyOf.nodes)return this.proxyOf.nodes[this.proxyOf.nodes.length-1]}}f.registerParse=e=>{i=e},f.registerRule=e=>{o=e},f.registerAtRule=e=>{n=e},f.registerRoot=e=>{s=e},e.exports=f,f.default=f,f.rebuild=e=>{"atrule"===e.type?Object.setPrototypeOf(e,n.prototype):"rule"===e.type?Object.setPrototypeOf(e,o.prototype):"decl"===e.type?Object.setPrototypeOf(e,l.prototype):"comment"===e.type?Object.setPrototypeOf(e,a.prototype):"root"===e.type&&Object.setPrototypeOf(e,s.prototype),e[h]=!0,e.nodes&&e.nodes.forEach((e=>{f.rebuild(e)}))}},6069:(e,t,r)=>{"use strict";let n=r(8952),i=r(3215);class s extends Error{constructor(e,t,r,n,i,o){super(e),this.name="CssSyntaxError",this.reason=e,i&&(this.file=i),n&&(this.source=n),o&&(this.plugin=o),void 0!==t&&void 0!==r&&("number"==typeof t?(this.line=t,this.column=r):(this.line=t.line,this.column=t.column,this.endLine=r.line,this.endColumn=r.column)),this.setMessage(),Error.captureStackTrace&&Error.captureStackTrace(this,s)}setMessage(){this.message=this.plugin?this.plugin+": ":"",this.message+=this.file?this.file:"",void 0!==this.line&&(this.message+=":"+this.line+":"+this.column),this.message+=": "+this.reason}showSourceCode(e){if(!this.source)return"";let t=this.source;null==e&&(e=n.isColorSupported);let r=e=>e,s=e=>e,o=e=>e;if(e){let{bold:e,gray:t,red:a}=n.createColors(!0);s=t=>e(a(t)),r=e=>t(e),i&&(o=e=>i(e))}let a=t.split(/\r?\n/),l=Math.max(this.line-3,0),c=Math.min(this.line+2,a.length),u=String(c).length;return a.slice(l,c).map(((e,t)=>{let n=l+1+t,i=" "+(" "+n).slice(-u)+" | ";if(n===this.line){if(e.length>160){let t=20,n=Math.max(0,this.column-t),a=Math.max(this.column+t,this.endColumn+t),l=e.slice(n,a),c=r(i.replace(/\d/g," "))+e.slice(0,Math.min(this.column-1,t-1)).replace(/[^\t]/g," ");return s(">")+r(i)+o(l)+"\n "+c+s("^")}let t=r(i.replace(/\d/g," "))+e.slice(0,this.column-1).replace(/[^\t]/g," ");return s(">")+r(i)+o(e)+"\n "+t+s("^")}return" "+r(i)+o(e)})).join("\n")}toString(){let e=this.showSourceCode();return e&&(e="\n\n"+e+"\n"),this.name+": "+this.message+e}}e.exports=s,s.default=s},3531:(e,t,r)=>{"use strict";let n=r(1051);class i extends n{constructor(e){e&&void 0!==e.value&&"string"!=typeof e.value&&(e={...e,value:String(e.value)}),super(e),this.type="decl"}get variable(){return this.prop.startsWith("--")||"$"===this.prop[0]}}e.exports=i,i.default=i},7890:(e,t,r)=>{"use strict";let n,i,s=r(2780);class o extends s{constructor(e){super({type:"document",...e}),this.nodes||(this.nodes=[])}toResult(e={}){return new n(new i,this,e).stringify()}}o.registerLazyResult=e=>{n=e},o.registerProcessor=e=>{i=e},e.exports=o,o.default=o},2357:(e,t,r)=>{"use strict";let n=r(697),i=r(7910),s=r(3531),o=r(611),a=r(833),l=r(199),c=r(6825);function u(e,t){if(Array.isArray(e))return e.map((e=>u(e)));let{inputs:r,...h}=e;if(r){t=[];for(let e of r){let r={...e,__proto__:o.prototype};r.map&&(r.map={...r.map,__proto__:a.prototype}),t.push(r)}}if(h.nodes&&(h.nodes=e.nodes.map((e=>u(e,t)))),h.source){let{inputId:e,...r}=h.source;h.source=r,null!=e&&(h.source.input=t[e])}if("root"===h.type)return new l(h);if("decl"===h.type)return new s(h);if("rule"===h.type)return new c(h);if("comment"===h.type)return new i(h);if("atrule"===h.type)return new n(h);throw new Error("Unknown node type: "+e.type)}e.exports=u,u.default=u},611:(e,t,r)=>{"use strict";let{nanoid:n}=r(945),{isAbsolute:i,resolve:s}=r(5324),{SourceMapConsumer:o,SourceMapGenerator:a}=r(8645),{fileURLToPath:l,pathToFileURL:c}=r(588),u=r(6069),h=r(833),d=r(3215),p=Symbol("fromOffsetCache"),f=Boolean(o&&a),m=Boolean(s&&i);class g{constructor(e,t={}){if(null==e||"object"==typeof e&&!e.toString)throw new Error(`PostCSS received ${e} instead of CSS string`);if(this.css=e.toString(),"\ufeff"===this.css[0]||"￾"===this.css[0]?(this.hasBOM=!0,this.css=this.css.slice(1)):this.hasBOM=!1,t.from&&(!m||/^\w+:\/\//.test(t.from)||i(t.from)?this.file=t.from:this.file=s(t.from)),m&&f){let e=new h(this.css,t);if(e.text){this.map=e;let t=e.consumer().file;!this.file&&t&&(this.file=this.mapResolve(t))}}this.file||(this.id=""),this.map&&(this.map.file=this.from)}error(e,t,r,n={}){let i,s,o;if(t&&"object"==typeof t){let e=t,n=r;if("number"==typeof e.offset){let n=this.fromOffset(e.offset);t=n.line,r=n.col}else t=e.line,r=e.column;if("number"==typeof n.offset){let e=this.fromOffset(n.offset);s=e.line,i=e.col}else s=n.line,i=n.column}else if(!r){let e=this.fromOffset(t);t=e.line,r=e.col}let a=this.origin(t,r,s,i);return o=a?new u(e,void 0===a.endLine?a.line:{column:a.column,line:a.line},void 0===a.endLine?a.column:{column:a.endColumn,line:a.endLine},a.source,a.file,n.plugin):new u(e,void 0===s?t:{column:r,line:t},void 0===s?r:{column:i,line:s},this.css,this.file,n.plugin),o.input={column:r,endColumn:i,endLine:s,line:t,source:this.css},this.file&&(c&&(o.input.url=c(this.file).toString()),o.input.file=this.file),o}fromOffset(e){let t,r;if(this[p])r=this[p];else{let e=this.css.split("\n");r=new Array(e.length);let t=0;for(let n=0,i=e.length;n=t)n=r.length-1;else{let t,i=r.length-2;for(;n>1),e=r[t+1])){n=t;break}n=t+1}}return{col:e-r[n]+1,line:n+1}}mapResolve(e){return/^\w+:\/\//.test(e)?e:s(this.map.consumer().sourceRoot||this.map.root||".",e)}origin(e,t,r,n){if(!this.map)return!1;let s,o,a=this.map.consumer(),u=a.originalPositionFor({column:t,line:e});if(!u.source)return!1;"number"==typeof r&&(s=a.originalPositionFor({column:n,line:r})),o=i(u.source)?c(u.source):new URL(u.source,this.map.consumer().sourceRoot||c(this.map.mapFile));let h={column:u.column,endColumn:s&&s.column,endLine:s&&s.line,line:u.line,url:o.toString()};if("file:"===o.protocol){if(!l)throw new Error("file: protocol is not available in this PostCSS build");h.file=l(o)}let d=a.sourceContentFor(u.source);return d&&(h.source=d),h}toJSON(){let e={};for(let t of["hasBOM","css","file","id"])null!=this[t]&&(e[t]=this[t]);return this.map&&(e.map={...this.map},e.map.consumerCache&&(e.map.consumerCache=void 0)),e}get from(){return this.file||this.id}}e.exports=g,g.default=g,d&&d.registerInput&&d.registerInput(g)},3907:(e,t,r)=>{"use strict";let n=r(2780),i=r(7890),s=r(609),o=r(3300),a=r(8298),l=r(199),c=r(5930),{isClean:u,my:h}=r(2990);r(1393);const d={atrule:"AtRule",comment:"Comment",decl:"Declaration",document:"Document",root:"Root",rule:"Rule"},p={AtRule:!0,AtRuleExit:!0,Comment:!0,CommentExit:!0,Declaration:!0,DeclarationExit:!0,Document:!0,DocumentExit:!0,Once:!0,OnceExit:!0,postcssPlugin:!0,prepare:!0,Root:!0,RootExit:!0,Rule:!0,RuleExit:!0},f={Once:!0,postcssPlugin:!0,prepare:!0};function m(e){return"object"==typeof e&&"function"==typeof e.then}function g(e){let t=!1,r=d[e.type];return"decl"===e.type?t=e.prop.toLowerCase():"atrule"===e.type&&(t=e.name.toLowerCase()),t&&e.append?[r,r+"-"+t,0,r+"Exit",r+"Exit-"+t]:t?[r,r+"-"+t,r+"Exit",r+"Exit-"+t]:e.append?[r,0,r+"Exit"]:[r,r+"Exit"]}function b(e){let t;return t="document"===e.type?["Document",0,"DocumentExit"]:"root"===e.type?["Root",0,"RootExit"]:g(e),{eventIndex:0,events:t,iterator:0,node:e,visitorIndex:0,visitors:[]}}function y(e){return e[u]=!1,e.nodes&&e.nodes.forEach((e=>y(e))),e}let v={};class w{constructor(e,t,r){let i;if(this.stringified=!1,this.processed=!1,"object"!=typeof t||null===t||"root"!==t.type&&"document"!==t.type)if(t instanceof w||t instanceof a)i=y(t.root),t.map&&(void 0===r.map&&(r.map={}),r.map.inline||(r.map.inline=!1),r.map.prev=t.map);else{let e=o;r.syntax&&(e=r.syntax.parse),r.parser&&(e=r.parser),e.parse&&(e=e.parse);try{i=e(t,r)}catch(e){this.processed=!0,this.error=e}i&&!i[h]&&n.rebuild(i)}else i=y(t);this.result=new a(e,i,r),this.helpers={...v,postcss:v,result:this.result},this.plugins=this.processor.plugins.map((e=>"object"==typeof e&&e.prepare?{...e,...e.prepare(this.result)}:e))}async(){return this.error?Promise.reject(this.error):this.processed?Promise.resolve(this.result):(this.processing||(this.processing=this.runAsync()),this.processing)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}getAsyncError(){throw new Error("Use process(css).then(cb) to work with async plugins")}handleError(e,t){let r=this.result.lastPlugin;try{t&&t.addToError(e),this.error=e,"CssSyntaxError"!==e.name||e.plugin?r.postcssVersion:(e.plugin=r.postcssPlugin,e.setMessage())}catch(e){console&&console.error&&console.error(e)}return e}prepareVisitors(){this.listeners={};let e=(e,t,r)=>{this.listeners[t]||(this.listeners[t]=[]),this.listeners[t].push([e,r])};for(let t of this.plugins)if("object"==typeof t)for(let r in t){if(!p[r]&&/^[A-Z]/.test(r))throw new Error(`Unknown event ${r} in ${t.postcssPlugin}. Try to update PostCSS (${this.processor.version} now).`);if(!f[r])if("object"==typeof t[r])for(let n in t[r])e(t,"*"===n?r:r+"-"+n.toLowerCase(),t[r][n]);else"function"==typeof t[r]&&e(t,r,t[r])}this.hasListener=Object.keys(this.listeners).length>0}async runAsync(){this.plugin=0;for(let e=0;e0;){let e=this.visitTick(t);if(m(e))try{await e}catch(e){let r=t[t.length-1].node;throw this.handleError(e,r)}}}if(this.listeners.OnceExit)for(let[t,r]of this.listeners.OnceExit){this.result.lastPlugin=t;try{if("document"===e.type){let t=e.nodes.map((e=>r(e,this.helpers)));await Promise.all(t)}else await r(e,this.helpers)}catch(e){throw this.handleError(e)}}}return this.processed=!0,this.stringify()}runOnRoot(e){this.result.lastPlugin=e;try{if("object"==typeof e&&e.Once){if("document"===this.result.root.type){let t=this.result.root.nodes.map((t=>e.Once(t,this.helpers)));return m(t[0])?Promise.all(t):t}return e.Once(this.result.root,this.helpers)}if("function"==typeof e)return e(this.result.root,this.result)}catch(e){throw this.handleError(e)}}stringify(){if(this.error)throw this.error;if(this.stringified)return this.result;this.stringified=!0,this.sync();let e=this.result.opts,t=c;e.syntax&&(t=e.syntax.stringify),e.stringifier&&(t=e.stringifier),t.stringify&&(t=t.stringify);let r=new s(t,this.result.root,this.result.opts).generate();return this.result.css=r[0],this.result.map=r[1],this.result}sync(){if(this.error)throw this.error;if(this.processed)return this.result;if(this.processed=!0,this.processing)throw this.getAsyncError();for(let e of this.plugins)if(m(this.runOnRoot(e)))throw this.getAsyncError();if(this.prepareVisitors(),this.hasListener){let e=this.result.root;for(;!e[u];)e[u]=!0,this.walkSync(e);if(this.listeners.OnceExit)if("document"===e.type)for(let t of e.nodes)this.visitSync(this.listeners.OnceExit,t);else this.visitSync(this.listeners.OnceExit,e)}return this.result}then(e,t){return this.async().then(e,t)}toString(){return this.css}visitSync(e,t){for(let[r,n]of e){let e;this.result.lastPlugin=r;try{e=n(t,this.helpers)}catch(e){throw this.handleError(e,t.proxyOf)}if("root"!==t.type&&"document"!==t.type&&!t.parent)return!0;if(m(e))throw this.getAsyncError()}}visitTick(e){let t=e[e.length-1],{node:r,visitors:n}=t;if("root"!==r.type&&"document"!==r.type&&!r.parent)return void e.pop();if(n.length>0&&t.visitorIndex{e[u]||this.walkSync(e)}));else{let t=this.listeners[r];if(t&&this.visitSync(t,e.toProxy()))return}}warnings(){return this.sync().warnings()}get content(){return this.stringify().content}get css(){return this.stringify().css}get map(){return this.stringify().map}get messages(){return this.sync().messages}get opts(){return this.result.opts}get processor(){return this.result.processor}get root(){return this.sync().root}get[Symbol.toStringTag](){return"LazyResult"}}w.registerPostcss=e=>{v=e},e.exports=w,w.default=w,l.registerLazyResult(w),i.registerLazyResult(w)},2767:e=>{"use strict";let t={comma:e=>t.split(e,[","],!0),space:e=>t.split(e,[" ","\n","\t"]),split(e,t,r){let n=[],i="",s=!1,o=0,a=!1,l="",c=!1;for(let r of e)c?c=!1:"\\"===r?c=!0:a?r===l&&(a=!1):'"'===r||"'"===r?(a=!0,l=r):"("===r?o+=1:")"===r?o>0&&(o-=1):0===o&&t.includes(r)&&(s=!0),s?(""!==i&&n.push(i.trim()),i="",s=!1):i+=r;return(r||""!==i)&&n.push(i.trim()),n}};e.exports=t,t.default=t},609:(e,t,r)=>{"use strict";let{dirname:n,relative:i,resolve:s,sep:o}=r(5324),{SourceMapConsumer:a,SourceMapGenerator:l}=r(8645),{pathToFileURL:c}=r(588),u=r(611),h=Boolean(a&&l),d=Boolean(n&&s&&i&&o);e.exports=class{constructor(e,t,r,n){this.stringify=e,this.mapOpts=r.map||{},this.root=t,this.opts=r,this.css=n,this.originalCSS=n,this.usesFileUrls=!this.mapOpts.from&&this.mapOpts.absolute,this.memoizedFileURLs=new Map,this.memoizedPaths=new Map,this.memoizedURLs=new Map}addAnnotation(){let e;e=this.isInline()?"data:application/json;base64,"+this.toBase64(this.map.toString()):"string"==typeof this.mapOpts.annotation?this.mapOpts.annotation:"function"==typeof this.mapOpts.annotation?this.mapOpts.annotation(this.opts.to,this.root):this.outputFile()+".map";let t="\n";this.css.includes("\r\n")&&(t="\r\n"),this.css+=t+"/*# sourceMappingURL="+e+" */"}applyPrevMaps(){for(let e of this.previous()){let t,r=this.toUrl(this.path(e.file)),i=e.root||n(e.file);!1===this.mapOpts.sourcesContent?(t=new a(e.text),t.sourcesContent&&(t.sourcesContent=null)):t=e.consumer(),this.map.applySourceMap(t,r,this.toUrl(this.path(i)))}}clearAnnotation(){if(!1!==this.mapOpts.annotation)if(this.root){let e;for(let t=this.root.nodes.length-1;t>=0;t--)e=this.root.nodes[t],"comment"===e.type&&e.text.startsWith("# sourceMappingURL=")&&this.root.removeChild(t)}else this.css&&(this.css=this.css.replace(/\n*\/\*#[\S\s]*?\*\/$/gm,""))}generate(){if(this.clearAnnotation(),d&&h&&this.isMap())return this.generateMap();{let e="";return this.stringify(this.root,(t=>{e+=t})),[e]}}generateMap(){if(this.root)this.generateString();else if(1===this.previous().length){let e=this.previous()[0].consumer();e.file=this.outputFile(),this.map=l.fromSourceMap(e,{ignoreInvalidMapping:!0})}else this.map=new l({file:this.outputFile(),ignoreInvalidMapping:!0}),this.map.addMapping({generated:{column:0,line:1},original:{column:0,line:1},source:this.opts.from?this.toUrl(this.path(this.opts.from)):""});return this.isSourcesContent()&&this.setSourcesContent(),this.root&&this.previous().length>0&&this.applyPrevMaps(),this.isAnnotation()&&this.addAnnotation(),this.isInline()?[this.css]:[this.css,this.map]}generateString(){this.css="",this.map=new l({file:this.outputFile(),ignoreInvalidMapping:!0});let e,t,r=1,n=1,i="",s={generated:{column:0,line:0},original:{column:0,line:0},source:""};this.stringify(this.root,((o,a,l)=>{if(this.css+=o,a&&"end"!==l&&(s.generated.line=r,s.generated.column=n-1,a.source&&a.source.start?(s.source=this.sourcePath(a),s.original.line=a.source.start.line,s.original.column=a.source.start.column-1,this.map.addMapping(s)):(s.source=i,s.original.line=1,s.original.column=0,this.map.addMapping(s))),t=o.match(/\n/g),t?(r+=t.length,e=o.lastIndexOf("\n"),n=o.length-e):n+=o.length,a&&"start"!==l){let e=a.parent||{raws:{}};("decl"===a.type||"atrule"===a.type&&!a.nodes)&&a===e.last&&!e.raws.semicolon||(a.source&&a.source.end?(s.source=this.sourcePath(a),s.original.line=a.source.end.line,s.original.column=a.source.end.column-1,s.generated.line=r,s.generated.column=n-2,this.map.addMapping(s)):(s.source=i,s.original.line=1,s.original.column=0,s.generated.line=r,s.generated.column=n-1,this.map.addMapping(s)))}}))}isAnnotation(){return!!this.isInline()||(void 0!==this.mapOpts.annotation?this.mapOpts.annotation:!this.previous().length||this.previous().some((e=>e.annotation)))}isInline(){if(void 0!==this.mapOpts.inline)return this.mapOpts.inline;let e=this.mapOpts.annotation;return(void 0===e||!0===e)&&(!this.previous().length||this.previous().some((e=>e.inline)))}isMap(){return void 0!==this.opts.map?!!this.opts.map:this.previous().length>0}isSourcesContent(){return void 0!==this.mapOpts.sourcesContent?this.mapOpts.sourcesContent:!this.previous().length||this.previous().some((e=>e.withContent()))}outputFile(){return this.opts.to?this.path(this.opts.to):this.opts.from?this.path(this.opts.from):"to.css"}path(e){if(this.mapOpts.absolute)return e;if(60===e.charCodeAt(0))return e;if(/^\w+:\/\//.test(e))return e;let t=this.memoizedPaths.get(e);if(t)return t;let r=this.opts.to?n(this.opts.to):".";"string"==typeof this.mapOpts.annotation&&(r=n(s(r,this.mapOpts.annotation)));let o=i(r,e);return this.memoizedPaths.set(e,o),o}previous(){if(!this.previousMaps)if(this.previousMaps=[],this.root)this.root.walk((e=>{if(e.source&&e.source.input.map){let t=e.source.input.map;this.previousMaps.includes(t)||this.previousMaps.push(t)}}));else{let e=new u(this.originalCSS,this.opts);e.map&&this.previousMaps.push(e.map)}return this.previousMaps}setSourcesContent(){let e={};if(this.root)this.root.walk((t=>{if(t.source){let r=t.source.input.from;if(r&&!e[r]){e[r]=!0;let n=this.usesFileUrls?this.toFileUrl(r):this.toUrl(this.path(r));this.map.setSourceContent(n,t.source.input.css)}}}));else if(this.css){let e=this.opts.from?this.toUrl(this.path(this.opts.from)):"";this.map.setSourceContent(e,this.css)}}sourcePath(e){return this.mapOpts.from?this.toUrl(this.mapOpts.from):this.usesFileUrls?this.toFileUrl(e.source.input.from):this.toUrl(this.path(e.source.input.from))}toBase64(e){return Buffer?Buffer.from(e).toString("base64"):window.btoa(unescape(encodeURIComponent(e)))}toFileUrl(e){let t=this.memoizedFileURLs.get(e);if(t)return t;if(c){let t=c(e).toString();return this.memoizedFileURLs.set(e,t),t}throw new Error("`map.absolute` option is not available in this PostCSS build")}toUrl(e){let t=this.memoizedURLs.get(e);if(t)return t;"\\"===o&&(e=e.replace(/\\/g,"/"));let r=encodeURI(e).replace(/[#?]/g,encodeURIComponent);return this.memoizedURLs.set(e,r),r}}},8424:(e,t,r)=>{"use strict";let n=r(609),i=r(3300);const s=r(8298);let o=r(5930);r(1393);class a{constructor(e,t,r){let i;t=t.toString(),this.stringified=!1,this._processor=e,this._css=t,this._opts=r,this._map=void 0;let a=o;this.result=new s(this._processor,i,this._opts),this.result.css=t;let l=this;Object.defineProperty(this.result,"root",{get:()=>l.root});let c=new n(a,i,this._opts,t);if(c.isMap()){let[e,t]=c.generate();e&&(this.result.css=e),t&&(this.result.map=t)}else c.clearAnnotation(),this.result.css=c.css}async(){return this.error?Promise.reject(this.error):Promise.resolve(this.result)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}sync(){if(this.error)throw this.error;return this.result}then(e,t){return this.async().then(e,t)}toString(){return this._css}warnings(){return[]}get content(){return this.result.css}get css(){return this.result.css}get map(){return this.result.map}get messages(){return[]}get opts(){return this.result.opts}get processor(){return this.result.processor}get root(){if(this._root)return this._root;let e,t=i;try{e=t(this._css,this._opts)}catch(e){this.error=e}if(this.error)throw this.error;return this._root=e,e}get[Symbol.toStringTag](){return"NoWorkResult"}}e.exports=a,a.default=a},1051:(e,t,r)=>{"use strict";let n=r(6069),i=r(9845),s=r(5930),{isClean:o,my:a}=r(2990);function l(e,t){let r=new e.constructor;for(let n in e){if(!Object.prototype.hasOwnProperty.call(e,n))continue;if("proxyCache"===n)continue;let i=e[n],s=typeof i;"parent"===n&&"object"===s?t&&(r[n]=t):"source"===n?r[n]=i:Array.isArray(i)?r[n]=i.map((e=>l(e,r))):("object"===s&&null!==i&&(i=l(i)),r[n]=i)}return r}class c{constructor(e={}){this.raws={},this[o]=!1,this[a]=!0;for(let t in e)if("nodes"===t){this.nodes=[];for(let r of e[t])"function"==typeof r.clone?this.append(r.clone()):this.append(r)}else this[t]=e[t]}addToError(e){if(e.postcssNode=this,e.stack&&this.source&&/\n\s{4}at /.test(e.stack)){let t=this.source;e.stack=e.stack.replace(/\n\s{4}at /,`$&${t.input.from}:${t.start.line}:${t.start.column}$&`)}return e}after(e){return this.parent.insertAfter(this,e),this}assign(e={}){for(let t in e)this[t]=e[t];return this}before(e){return this.parent.insertBefore(this,e),this}cleanRaws(e){delete this.raws.before,delete this.raws.after,e||delete this.raws.between}clone(e={}){let t=l(this);for(let r in e)t[r]=e[r];return t}cloneAfter(e={}){let t=this.clone(e);return this.parent.insertAfter(this,t),t}cloneBefore(e={}){let t=this.clone(e);return this.parent.insertBefore(this,t),t}error(e,t={}){if(this.source){let{end:r,start:n}=this.rangeBy(t);return this.source.input.error(e,{column:n.column,line:n.line},{column:r.column,line:r.line},t)}return new n(e)}getProxyProcessor(){return{get:(e,t)=>"proxyOf"===t?e:"root"===t?()=>e.root().toProxy():e[t],set:(e,t,r)=>(e[t]===r||(e[t]=r,"prop"!==t&&"value"!==t&&"name"!==t&&"params"!==t&&"important"!==t&&"text"!==t||e.markDirty()),!0)}}markClean(){this[o]=!0}markDirty(){if(this[o]){this[o]=!1;let e=this;for(;e=e.parent;)e[o]=!1}}next(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e+1]}positionBy(e,t){let r=this.source.start;if(e.index)r=this.positionInside(e.index,t);else if(e.word){let n=(t=this.toString()).indexOf(e.word);-1!==n&&(r=this.positionInside(n,t))}return r}positionInside(e,t){let r=t||this.toString(),n=this.source.start.column,i=this.source.start.line;for(let t=0;t"object"==typeof e&&e.toJSON?e.toJSON(null,t):e));else if("object"==typeof n&&n.toJSON)r[e]=n.toJSON(null,t);else if("source"===e){let s=t.get(n.input);null==s&&(s=i,t.set(n.input,i),i++),r[e]={end:n.end,inputId:s,start:n.start}}else r[e]=n}return n&&(r.inputs=[...t.keys()].map((e=>e.toJSON()))),r}toProxy(){return this.proxyCache||(this.proxyCache=new Proxy(this,this.getProxyProcessor())),this.proxyCache}toString(e=s){e.stringify&&(e=e.stringify);let t="";return e(this,(e=>{t+=e})),t}warn(e,t,r){let n={node:this};for(let e in r)n[e]=r[e];return e.warn(t,n)}get proxyOf(){return this}}e.exports=c,c.default=c},3300:(e,t,r)=>{"use strict";let n=r(2780),i=r(611),s=r(612);function o(e,t){let r=new i(e,t),n=new s(r);try{n.parse()}catch(e){throw e}return n.root}e.exports=o,o.default=o,n.registerParse(o)},612:(e,t,r)=>{"use strict";let n=r(697),i=r(7910),s=r(3531),o=r(199),a=r(6825),l=r(1374);const c={empty:!0,space:!0};e.exports=class{constructor(e){this.input=e,this.root=new o,this.current=this.root,this.spaces="",this.semicolon=!1,this.createTokenizer(),this.root.source={input:e,start:{column:1,line:1,offset:0}}}atrule(e){let t,r,i,s=new n;s.name=e[1].slice(1),""===s.name&&this.unnamedAtrule(s,e),this.init(s,e[2]);let o=!1,a=!1,l=[],c=[];for(;!this.tokenizer.endOfFile();){if(t=(e=this.tokenizer.nextToken())[0],"("===t||"["===t?c.push("("===t?")":"]"):"{"===t&&c.length>0?c.push("}"):t===c[c.length-1]&&c.pop(),0===c.length){if(";"===t){s.source.end=this.getPosition(e[2]),s.source.end.offset++,this.semicolon=!0;break}if("{"===t){a=!0;break}if("}"===t){if(l.length>0){for(i=l.length-1,r=l[i];r&&"space"===r[0];)r=l[--i];r&&(s.source.end=this.getPosition(r[3]||r[2]),s.source.end.offset++)}this.end(e);break}l.push(e)}else l.push(e);if(this.tokenizer.endOfFile()){o=!0;break}}s.raws.between=this.spacesAndCommentsFromEnd(l),l.length?(s.raws.afterName=this.spacesAndCommentsFromStart(l),this.raw(s,"params",l),o&&(e=l[l.length-1],s.source.end=this.getPosition(e[3]||e[2]),s.source.end.offset++,this.spaces=s.raws.between,s.raws.between="")):(s.raws.afterName="",s.params=""),a&&(s.nodes=[],this.current=s)}checkMissedSemicolon(e){let t=this.colon(e);if(!1===t)return;let r,n=0;for(let i=t-1;i>=0&&(r=e[i],"space"===r[0]||(n+=1,2!==n));i--);throw this.input.error("Missed semicolon","word"===r[0]?r[3]+1:r[2])}colon(e){let t,r,n,i=0;for(let[s,o]of e.entries()){if(r=o,n=r[0],"("===n&&(i+=1),")"===n&&(i-=1),0===i&&":"===n){if(t){if("word"===t[0]&&"progid"===t[1])continue;return s}this.doubleColon(r)}t=r}return!1}comment(e){let t=new i;this.init(t,e[2]),t.source.end=this.getPosition(e[3]||e[2]),t.source.end.offset++;let r=e[1].slice(2,-2);if(/^\s*$/.test(r))t.text="",t.raws.left=r,t.raws.right="";else{let e=r.match(/^(\s*)([^]*\S)(\s*)$/);t.text=e[2],t.raws.left=e[1],t.raws.right=e[3]}}createTokenizer(){this.tokenizer=l(this.input)}decl(e,t){let r=new s;this.init(r,e[0][2]);let n,i=e[e.length-1];for(";"===i[0]&&(this.semicolon=!0,e.pop()),r.source.end=this.getPosition(i[3]||i[2]||function(e){for(let t=e.length-1;t>=0;t--){let r=e[t],n=r[3]||r[2];if(n)return n}}(e)),r.source.end.offset++;"word"!==e[0][0];)1===e.length&&this.unknownWord(e),r.raws.before+=e.shift()[1];for(r.source.start=this.getPosition(e[0][2]),r.prop="";e.length;){let t=e[0][0];if(":"===t||"space"===t||"comment"===t)break;r.prop+=e.shift()[1]}for(r.raws.between="";e.length;){if(n=e.shift(),":"===n[0]){r.raws.between+=n[1];break}"word"===n[0]&&/\w/.test(n[1])&&this.unknownWord([n]),r.raws.between+=n[1]}"_"!==r.prop[0]&&"*"!==r.prop[0]||(r.raws.before+=r.prop[0],r.prop=r.prop.slice(1));let o,a=[];for(;e.length&&(o=e[0][0],"space"===o||"comment"===o);)a.push(e.shift());this.precheckMissedSemicolon(e);for(let t=e.length-1;t>=0;t--){if(n=e[t],"!important"===n[1].toLowerCase()){r.important=!0;let n=this.stringFrom(e,t);n=this.spacesFromEnd(e)+n," !important"!==n&&(r.raws.important=n);break}if("important"===n[1].toLowerCase()){let n=e.slice(0),i="";for(let e=t;e>0;e--){let t=n[e][0];if(i.trim().startsWith("!")&&"space"!==t)break;i=n.pop()[1]+i}i.trim().startsWith("!")&&(r.important=!0,r.raws.important=i,e=n)}if("space"!==n[0]&&"comment"!==n[0])break}e.some((e=>"space"!==e[0]&&"comment"!==e[0]))&&(r.raws.between+=a.map((e=>e[1])).join(""),a=[]),this.raw(r,"value",a.concat(e),t),r.value.includes(":")&&!t&&this.checkMissedSemicolon(e)}doubleColon(e){throw this.input.error("Double colon",{offset:e[2]},{offset:e[2]+e[1].length})}emptyRule(e){let t=new a;this.init(t,e[2]),t.selector="",t.raws.between="",this.current=t}end(e){this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.semicolon=!1,this.current.raws.after=(this.current.raws.after||"")+this.spaces,this.spaces="",this.current.parent?(this.current.source.end=this.getPosition(e[2]),this.current.source.end.offset++,this.current=this.current.parent):this.unexpectedClose(e)}endFile(){this.current.parent&&this.unclosedBlock(),this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.current.raws.after=(this.current.raws.after||"")+this.spaces,this.root.source.end=this.getPosition(this.tokenizer.position())}freeSemicolon(e){if(this.spaces+=e[1],this.current.nodes){let e=this.current.nodes[this.current.nodes.length-1];e&&"rule"===e.type&&!e.raws.ownSemicolon&&(e.raws.ownSemicolon=this.spaces,this.spaces="")}}getPosition(e){let t=this.input.fromOffset(e);return{column:t.col,line:t.line,offset:e}}init(e,t){this.current.push(e),e.source={input:this.input,start:this.getPosition(t)},e.raws.before=this.spaces,this.spaces="","comment"!==e.type&&(this.semicolon=!1)}other(e){let t=!1,r=null,n=!1,i=null,s=[],o=e[1].startsWith("--"),a=[],l=e;for(;l;){if(r=l[0],a.push(l),"("===r||"["===r)i||(i=l),s.push("("===r?")":"]");else if(o&&n&&"{"===r)i||(i=l),s.push("}");else if(0===s.length){if(";"===r){if(n)return void this.decl(a,o);break}if("{"===r)return void this.rule(a);if("}"===r){this.tokenizer.back(a.pop()),t=!0;break}":"===r&&(n=!0)}else r===s[s.length-1]&&(s.pop(),0===s.length&&(i=null));l=this.tokenizer.nextToken()}if(this.tokenizer.endOfFile()&&(t=!0),s.length>0&&this.unclosedBracket(i),t&&n){if(!o)for(;a.length&&(l=a[a.length-1][0],"space"===l||"comment"===l);)this.tokenizer.back(a.pop());this.decl(a,o)}else this.unknownWord(a)}parse(){let e;for(;!this.tokenizer.endOfFile();)switch(e=this.tokenizer.nextToken(),e[0]){case"space":this.spaces+=e[1];break;case";":this.freeSemicolon(e);break;case"}":this.end(e);break;case"comment":this.comment(e);break;case"at-word":this.atrule(e);break;case"{":this.emptyRule(e);break;default:this.other(e)}this.endFile()}precheckMissedSemicolon(){}raw(e,t,r,n){let i,s,o,a,l=r.length,u="",h=!0;for(let e=0;ee+t[1]),"");e.raws[t]={raw:n,value:u}}e[t]=u}rule(e){e.pop();let t=new a;this.init(t,e[0][2]),t.raws.between=this.spacesAndCommentsFromEnd(e),this.raw(t,"selector",e),this.current=t}spacesAndCommentsFromEnd(e){let t,r="";for(;e.length&&(t=e[e.length-1][0],"space"===t||"comment"===t);)r=e.pop()[1]+r;return r}spacesAndCommentsFromStart(e){let t,r="";for(;e.length&&(t=e[0][0],"space"===t||"comment"===t);)r+=e.shift()[1];return r}spacesFromEnd(e){let t,r="";for(;e.length&&(t=e[e.length-1][0],"space"===t);)r=e.pop()[1]+r;return r}stringFrom(e,t){let r="";for(let n=t;n{"use strict";var n=r(9907);let i=r(697),s=r(7910),o=r(2780),a=r(6069),l=r(3531),c=r(7890),u=r(2357),h=r(611),d=r(3907),p=r(2767),f=r(1051),m=r(3300),g=r(2315),b=r(8298),y=r(199),v=r(6825),w=r(5930),x=r(7107);function S(...e){return 1===e.length&&Array.isArray(e[0])&&(e=e[0]),new g(e)}S.plugin=function(e,t){let r,i=!1;function s(...r){console&&console.warn&&!i&&(i=!0,console.warn(e+": postcss.plugin was deprecated. Migration guide:\nhttps://evilmartians.com/chronicles/postcss-8-plugin-migration"),n.env.LANG&&n.env.LANG.startsWith("cn")&&console.warn(e+": 里面 postcss.plugin 被弃用. 迁移指南:\nhttps://www.w3ctech.com/topic/2226"));let s=t(...r);return s.postcssPlugin=e,s.postcssVersion=(new g).version,s}return Object.defineProperty(s,"postcss",{get:()=>(r||(r=s()),r)}),s.process=function(e,t,r){return S([s(r)]).process(e,t)},s},S.stringify=w,S.parse=m,S.fromJSON=u,S.list=p,S.comment=e=>new s(e),S.atRule=e=>new i(e),S.decl=e=>new l(e),S.rule=e=>new v(e),S.root=e=>new y(e),S.document=e=>new c(e),S.CssSyntaxError=a,S.Declaration=l,S.Container=o,S.Processor=g,S.Document=c,S.Comment=s,S.Warning=x,S.AtRule=i,S.Result=b,S.Input=h,S.Rule=v,S.Root=y,S.Node=f,d.registerPostcss(S),e.exports=S,S.default=S},833:(e,t,r)=>{"use strict";let{existsSync:n,readFileSync:i}=r(8892),{dirname:s,join:o}=r(5324),{SourceMapConsumer:a,SourceMapGenerator:l}=r(8645);class c{constructor(e,t){if(!1===t.map)return;this.loadAnnotation(e),this.inline=this.startWith(this.annotation,"data:");let r=t.map?t.map.prev:void 0,n=this.loadMap(t.from,r);!this.mapFile&&t.from&&(this.mapFile=t.from),this.mapFile&&(this.root=s(this.mapFile)),n&&(this.text=n)}consumer(){return this.consumerCache||(this.consumerCache=new a(this.text)),this.consumerCache}decodeInline(e){let t=e.match(/^data:application\/json;charset=utf-?8,/)||e.match(/^data:application\/json,/);if(t)return decodeURIComponent(e.substr(t[0].length));let r=e.match(/^data:application\/json;charset=utf-?8;base64,/)||e.match(/^data:application\/json;base64,/);if(r)return n=e.substr(r[0].length),Buffer?Buffer.from(n,"base64").toString():window.atob(n);var n;let i=e.match(/data:application\/json;([^,]+),/)[1];throw new Error("Unsupported source map encoding "+i)}getAnnotationURL(e){return e.replace(/^\/\*\s*# sourceMappingURL=/,"").trim()}isMap(e){return"object"==typeof e&&("string"==typeof e.mappings||"string"==typeof e._mappings||Array.isArray(e.sections))}loadAnnotation(e){let t=e.match(/\/\*\s*# sourceMappingURL=/g);if(!t)return;let r=e.lastIndexOf(t.pop()),n=e.indexOf("*/",r);r>-1&&n>-1&&(this.annotation=this.getAnnotationURL(e.substring(r,n)))}loadFile(e){if(this.root=s(e),n(e))return this.mapFile=e,i(e,"utf-8").toString().trim()}loadMap(e,t){if(!1===t)return!1;if(t){if("string"==typeof t)return t;if("function"!=typeof t){if(t instanceof a)return l.fromSourceMap(t).toString();if(t instanceof l)return t.toString();if(this.isMap(t))return JSON.stringify(t);throw new Error("Unsupported previous source map format: "+t.toString())}{let r=t(e);if(r){let e=this.loadFile(r);if(!e)throw new Error("Unable to load previous source map: "+r.toString());return e}}}else{if(this.inline)return this.decodeInline(this.annotation);if(this.annotation){let t=this.annotation;return e&&(t=o(s(e),t)),this.loadFile(t)}}}startWith(e,t){return!!e&&e.substr(0,t.length)===t}withContent(){return!!(this.consumer().sourcesContent&&this.consumer().sourcesContent.length>0)}}e.exports=c,c.default=c},2315:(e,t,r)=>{"use strict";let n=r(7890),i=r(3907),s=r(8424),o=r(199);class a{constructor(e=[]){this.version="8.4.47",this.plugins=this.normalize(e)}normalize(e){let t=[];for(let r of e)if(!0===r.postcss?r=r():r.postcss&&(r=r.postcss),"object"==typeof r&&Array.isArray(r.plugins))t=t.concat(r.plugins);else if("object"==typeof r&&r.postcssPlugin)t.push(r);else if("function"==typeof r)t.push(r);else if("object"!=typeof r||!r.parse&&!r.stringify)throw new Error(r+" is not a PostCSS plugin");return t}process(e,t={}){return this.plugins.length||t.parser||t.stringifier||t.syntax?new i(this,e,t):new s(this,e,t)}use(e){return this.plugins=this.plugins.concat(this.normalize([e])),this}}e.exports=a,a.default=a,o.registerProcessor(a),n.registerProcessor(a)},8298:(e,t,r)=>{"use strict";let n=r(7107);class i{constructor(e,t,r){this.processor=e,this.messages=[],this.root=t,this.opts=r,this.css=void 0,this.map=void 0}toString(){return this.css}warn(e,t={}){t.plugin||this.lastPlugin&&this.lastPlugin.postcssPlugin&&(t.plugin=this.lastPlugin.postcssPlugin);let r=new n(e,t);return this.messages.push(r),r}warnings(){return this.messages.filter((e=>"warning"===e.type))}get content(){return this.css}}e.exports=i,i.default=i},199:(e,t,r)=>{"use strict";let n,i,s=r(2780);class o extends s{constructor(e){super(e),this.type="root",this.nodes||(this.nodes=[])}normalize(e,t,r){let n=super.normalize(e);if(t)if("prepend"===r)this.nodes.length>1?t.raws.before=this.nodes[1].raws.before:delete t.raws.before;else if(this.first!==t)for(let e of n)e.raws.before=t.raws.before;return n}removeChild(e,t){let r=this.index(e);return!t&&0===r&&this.nodes.length>1&&(this.nodes[1].raws.before=this.nodes[r].raws.before),super.removeChild(e)}toResult(e={}){return new n(new i,this,e).stringify()}}o.registerLazyResult=e=>{n=e},o.registerProcessor=e=>{i=e},e.exports=o,o.default=o,s.registerRoot(o)},6825:(e,t,r)=>{"use strict";let n=r(2780),i=r(2767);class s extends n{constructor(e){super(e),this.type="rule",this.nodes||(this.nodes=[])}get selectors(){return i.comma(this.selector)}set selectors(e){let t=this.selector?this.selector.match(/,\s*/):null,r=t?t[0]:","+this.raw("between","beforeOpen");this.selector=e.join(r)}}e.exports=s,s.default=s,n.registerRule(s)},9845:e=>{"use strict";const t={after:"\n",beforeClose:"\n",beforeComment:"\n",beforeDecl:"\n",beforeOpen:" ",beforeRule:"\n",colon:": ",commentLeft:" ",commentRight:" ",emptyBody:"",indent:" ",semicolon:!1};class r{constructor(e){this.builder=e}atrule(e,t){let r="@"+e.name,n=e.params?this.rawValue(e,"params"):"";if(void 0!==e.raws.afterName?r+=e.raws.afterName:n&&(r+=" "),e.nodes)this.block(e,r+n);else{let i=(e.raws.between||"")+(t?";":"");this.builder(r+n+i,e)}}beforeAfter(e,t){let r;r="decl"===e.type?this.raw(e,null,"beforeDecl"):"comment"===e.type?this.raw(e,null,"beforeComment"):"before"===t?this.raw(e,null,"beforeRule"):this.raw(e,null,"beforeClose");let n=e.parent,i=0;for(;n&&"root"!==n.type;)i+=1,n=n.parent;if(r.includes("\n")){let t=this.raw(e,null,"indent");if(t.length)for(let e=0;e0&&"comment"===e.nodes[t].type;)t-=1;let r=this.raw(e,"semicolon");for(let n=0;n{if(i=e.raws[r],void 0!==i)return!1}))}var a;return void 0===i&&(i=t[n]),o.rawCache[n]=i,i}rawBeforeClose(e){let t;return e.walk((e=>{if(e.nodes&&e.nodes.length>0&&void 0!==e.raws.after)return t=e.raws.after,t.includes("\n")&&(t=t.replace(/[^\n]+$/,"")),!1})),t&&(t=t.replace(/\S/g,"")),t}rawBeforeComment(e,t){let r;return e.walkComments((e=>{if(void 0!==e.raws.before)return r=e.raws.before,r.includes("\n")&&(r=r.replace(/[^\n]+$/,"")),!1})),void 0===r?r=this.raw(t,null,"beforeDecl"):r&&(r=r.replace(/\S/g,"")),r}rawBeforeDecl(e,t){let r;return e.walkDecls((e=>{if(void 0!==e.raws.before)return r=e.raws.before,r.includes("\n")&&(r=r.replace(/[^\n]+$/,"")),!1})),void 0===r?r=this.raw(t,null,"beforeRule"):r&&(r=r.replace(/\S/g,"")),r}rawBeforeOpen(e){let t;return e.walk((e=>{if("decl"!==e.type&&(t=e.raws.between,void 0!==t))return!1})),t}rawBeforeRule(e){let t;return e.walk((r=>{if(r.nodes&&(r.parent!==e||e.first!==r)&&void 0!==r.raws.before)return t=r.raws.before,t.includes("\n")&&(t=t.replace(/[^\n]+$/,"")),!1})),t&&(t=t.replace(/\S/g,"")),t}rawColon(e){let t;return e.walkDecls((e=>{if(void 0!==e.raws.between)return t=e.raws.between.replace(/[^\s:]/g,""),!1})),t}rawEmptyBody(e){let t;return e.walk((e=>{if(e.nodes&&0===e.nodes.length&&(t=e.raws.after,void 0!==t))return!1})),t}rawIndent(e){if(e.raws.indent)return e.raws.indent;let t;return e.walk((r=>{let n=r.parent;if(n&&n!==e&&n.parent&&n.parent===e&&void 0!==r.raws.before){let e=r.raws.before.split("\n");return t=e[e.length-1],t=t.replace(/\S/g,""),!1}})),t}rawSemicolon(e){let t;return e.walk((e=>{if(e.nodes&&e.nodes.length&&"decl"===e.last.type&&(t=e.raws.semicolon,void 0!==t))return!1})),t}rawValue(e,t){let r=e[t],n=e.raws[t];return n&&n.value===r?n.raw:r}root(e){this.body(e),e.raws.after&&this.builder(e.raws.after)}rule(e){this.block(e,this.rawValue(e,"selector")),e.raws.ownSemicolon&&this.builder(e.raws.ownSemicolon,e,"end")}stringify(e,t){if(!this[e.type])throw new Error("Unknown AST node type "+e.type+". Maybe you need to change PostCSS stringifier.");this[e.type](e,t)}}e.exports=r,r.default=r},5930:(e,t,r)=>{"use strict";let n=r(9845);function i(e,t){new n(t).stringify(e)}e.exports=i,i.default=i},2990:e=>{"use strict";e.exports.isClean=Symbol("isClean"),e.exports.my=Symbol("my")},1374:e=>{"use strict";const t="'".charCodeAt(0),r='"'.charCodeAt(0),n="\\".charCodeAt(0),i="/".charCodeAt(0),s="\n".charCodeAt(0),o=" ".charCodeAt(0),a="\f".charCodeAt(0),l="\t".charCodeAt(0),c="\r".charCodeAt(0),u="[".charCodeAt(0),h="]".charCodeAt(0),d="(".charCodeAt(0),p=")".charCodeAt(0),f="{".charCodeAt(0),m="}".charCodeAt(0),g=";".charCodeAt(0),b="*".charCodeAt(0),y=":".charCodeAt(0),v="@".charCodeAt(0),w=/[\t\n\f\r "#'()/;[\\\]{}]/g,x=/[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g,S=/.[\r\n"'(/\\]/,T=/[\da-f]/i;e.exports=function(e,E={}){let A,C,k,O,I,N,D,P,L,M,q=e.css.valueOf(),B=E.ignoreErrors,R=q.length,j=0,_=[],U=[];function H(t){throw e.error("Unclosed "+t,j)}return{back:function(e){U.push(e)},endOfFile:function(){return 0===U.length&&j>=R},nextToken:function(e){if(U.length)return U.pop();if(j>=R)return;let E=!!e&&e.ignoreUnclosed;switch(A=q.charCodeAt(j),A){case s:case o:case l:case c:case a:O=j;do{O+=1,A=q.charCodeAt(O)}while(A===o||A===s||A===l||A===c||A===a);N=["space",q.slice(j,O)],j=O-1;break;case u:case h:case f:case m:case y:case g:case p:{let e=String.fromCharCode(A);N=[e,e,j];break}case d:if(M=_.length?_.pop()[1]:"",L=q.charCodeAt(j+1),"url"===M&&L!==t&&L!==r&&L!==o&&L!==s&&L!==l&&L!==a&&L!==c){O=j;do{if(D=!1,O=q.indexOf(")",O+1),-1===O){if(B||E){O=j;break}H("bracket")}for(P=O;q.charCodeAt(P-1)===n;)P-=1,D=!D}while(D);N=["brackets",q.slice(j,O+1),j,O],j=O}else O=q.indexOf(")",j+1),C=q.slice(j,O+1),-1===O||S.test(C)?N=["(","(",j]:(N=["brackets",C,j,O],j=O);break;case t:case r:I=A===t?"'":'"',O=j;do{if(D=!1,O=q.indexOf(I,O+1),-1===O){if(B||E){O=j+1;break}H("string")}for(P=O;q.charCodeAt(P-1)===n;)P-=1,D=!D}while(D);N=["string",q.slice(j,O+1),j,O],j=O;break;case v:w.lastIndex=j+1,w.test(q),O=0===w.lastIndex?q.length-1:w.lastIndex-2,N=["at-word",q.slice(j,O+1),j,O],j=O;break;case n:for(O=j,k=!0;q.charCodeAt(O+1)===n;)O+=1,k=!k;if(A=q.charCodeAt(O+1),k&&A!==i&&A!==o&&A!==s&&A!==l&&A!==c&&A!==a&&(O+=1,T.test(q.charAt(O)))){for(;T.test(q.charAt(O+1));)O+=1;q.charCodeAt(O+1)===o&&(O+=1)}N=["word",q.slice(j,O+1),j,O],j=O;break;default:A===i&&q.charCodeAt(j+1)===b?(O=q.indexOf("*/",j+2)+1,0===O&&(B||E?O=q.length:H("comment")),N=["comment",q.slice(j,O+1),j,O],j=O):(x.lastIndex=j+1,x.test(q),O=0===x.lastIndex?q.length-1:x.lastIndex-2,N=["word",q.slice(j,O+1),j,O],_.push(N),j=O)}return j++,N},position:function(){return j}}}},1393:e=>{"use strict";let t={};e.exports=function(e){t[e]||(t[e]=!0,"undefined"!=typeof console&&console.warn&&console.warn(e))}},7107:e=>{"use strict";class t{constructor(e,t={}){if(this.type="warning",this.text=e,t.node&&t.node.source){let e=t.node.rangeBy(t);this.line=e.start.line,this.column=e.start.column,this.endLine=e.end.line,this.endColumn=e.end.column}for(let e in t)this[e]=t[e]}toString(){return this.node?this.node.error(this.text,{index:this.index,plugin:this.plugin,word:this.word}).message:this.plugin?this.plugin+": "+this.text:this.text}}e.exports=t,t.default=t},9907:e=>{var t,r,n=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function o(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(r){try{return t.call(null,e,0)}catch(r){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:i}catch(e){t=i}try{r="function"==typeof clearTimeout?clearTimeout:s}catch(e){r=s}}();var a,l=[],c=!1,u=-1;function h(){c&&a&&(c=!1,a.length?l=a.concat(l):u=-1,l.length&&d())}function d(){if(!c){var e=o(h);c=!0;for(var t=l.length;t;){for(a=l,l=[];++u1)for(var r=1;r{const n=r(5482),i=r(2189),{isPlainObject:s}=r(993),o=r(2743),a=r(8287),{parse:l}=r(9274),c=["img","audio","video","picture","svg","object","map","iframe","embed"],u=["script","style"];function h(e,t){e&&Object.keys(e).forEach((function(r){t(e[r],r)}))}function d(e,t){return{}.hasOwnProperty.call(e,t)}function p(e,t){const r=[];return h(e,(function(e){t(e)&&r.push(e)})),r}e.exports=m;const f=/^[^\0\t\n\f\r /<=>]+$/;function m(e,t,r){if(null==e)return"";"number"==typeof e&&(e=e.toString());let b="",y="";function v(e,t){const r=this;this.tag=e,this.attribs=t||{},this.tagPosition=b.length,this.text="",this.mediaChildren=[],this.updateParentNodeText=function(){N.length&&(N[N.length-1].text+=r.text)},this.updateParentNodeMediaChildren=function(){N.length&&c.includes(this.tag)&&N[N.length-1].mediaChildren.push(this.tag)}}(t=Object.assign({},m.defaults,t)).parser=Object.assign({},g,t.parser);const w=function(e){return!1===t.allowedTags||(t.allowedTags||[]).indexOf(e)>-1};u.forEach((function(e){w(e)&&!t.allowVulnerableTags&&console.warn(`\n\n⚠️ Your \`allowedTags\` option includes, \`${e}\`, which is inherently\nvulnerable to XSS attacks. Please remove it from \`allowedTags\`.\nOr, to disable this warning, add the \`allowVulnerableTags\` option\nand ensure you are accounting for this risk.\n\n`)}));const x=t.nonTextTags||["script","style","textarea","option"];let S,T;t.allowedAttributes&&(S={},T={},h(t.allowedAttributes,(function(e,t){S[t]=[];const r=[];e.forEach((function(e){"string"==typeof e&&e.indexOf("*")>=0?r.push(i(e).replace(/\\\*/g,".*")):S[t].push(e)})),r.length&&(T[t]=new RegExp("^("+r.join("|")+")$"))})));const E={},A={},C={};h(t.allowedClasses,(function(e,t){if(S&&(d(S,t)||(S[t]=[]),S[t].push("class")),E[t]=e,Array.isArray(e)){const r=[];E[t]=[],C[t]=[],e.forEach((function(e){"string"==typeof e&&e.indexOf("*")>=0?r.push(i(e).replace(/\\\*/g,".*")):e instanceof RegExp?C[t].push(e):E[t].push(e)})),r.length&&(A[t]=new RegExp("^("+r.join("|")+")$"))}}));const k={};let O,I,N,D,P,L,M;h(t.transformTags,(function(e,t){let r;"function"==typeof e?r=e:"string"==typeof e&&(r=m.simpleTransform(e)),"*"===t?O=r:k[t]=r}));let q=!1;R();const B=new n.Parser({onopentag:function(e,r){if(t.enforceHtmlBoundary&&"html"===e&&R(),L)return void M++;const n=new v(e,r);N.push(n);let i=!1;const c=!!n.text;let u;if(d(k,e)&&(u=k[e](e,r),n.attribs=r=u.attribs,void 0!==u.text&&(n.innerText=u.text),e!==u.tagName&&(n.name=e=u.tagName,P[I]=u.tagName)),O&&(u=O(e,r),n.attribs=r=u.attribs,e!==u.tagName&&(n.name=e=u.tagName,P[I]=u.tagName)),(!w(e)||"recursiveEscape"===t.disallowedTagsMode&&!function(e){for(const t in e)if(d(e,t))return!1;return!0}(D)||null!=t.nestingLimit&&I>=t.nestingLimit)&&(i=!0,D[I]=!0,"discard"!==t.disallowedTagsMode&&"completelyDiscard"!==t.disallowedTagsMode||-1!==x.indexOf(e)&&(L=!0,M=1),D[I]=!0),I++,i){if("discard"===t.disallowedTagsMode||"completelyDiscard"===t.disallowedTagsMode)return;y=b,b=""}b+="<"+e,"script"===e&&(t.allowedScriptHostnames||t.allowedScriptDomains)&&(n.innerText=""),(!S||d(S,e)||S["*"])&&h(r,(function(r,i){if(!f.test(i))return void delete n.attribs[i];if(""===r&&!t.allowedEmptyAttributes.includes(i)&&(t.nonBooleanAttributes.includes(i)||t.nonBooleanAttributes.includes("*")))return void delete n.attribs[i];let c=!1;if(!S||d(S,e)&&-1!==S[e].indexOf(i)||S["*"]&&-1!==S["*"].indexOf(i)||d(T,e)&&T[e].test(i)||T["*"]&&T["*"].test(i))c=!0;else if(S&&S[e])for(const t of S[e])if(s(t)&&t.name&&t.name===i){c=!0;let e="";if(!0===t.multiple){const n=r.split(" ");for(const r of n)-1!==t.values.indexOf(r)&&(""===e?e=r:e+=" "+r)}else t.values.indexOf(r)>=0&&(e=r);r=e}if(c){if(-1!==t.allowedSchemesAppliedToAttributes.indexOf(i)&&_(e,r))return void delete n.attribs[i];if("script"===e&&"src"===i){let e=!0;try{const n=U(r);if(t.allowedScriptHostnames||t.allowedScriptDomains){const r=(t.allowedScriptHostnames||[]).find((function(e){return e===n.url.hostname})),i=(t.allowedScriptDomains||[]).find((function(e){return n.url.hostname===e||n.url.hostname.endsWith(`.${e}`)}));e=r||i}}catch(t){e=!1}if(!e)return void delete n.attribs[i]}if("iframe"===e&&"src"===i){let e=!0;try{const n=U(r);if(n.isRelativeUrl)e=d(t,"allowIframeRelativeUrls")?t.allowIframeRelativeUrls:!t.allowedIframeHostnames&&!t.allowedIframeDomains;else if(t.allowedIframeHostnames||t.allowedIframeDomains){const r=(t.allowedIframeHostnames||[]).find((function(e){return e===n.url.hostname})),i=(t.allowedIframeDomains||[]).find((function(e){return n.url.hostname===e||n.url.hostname.endsWith(`.${e}`)}));e=r||i}}catch(t){e=!1}if(!e)return void delete n.attribs[i]}if("srcset"===i)try{let e=a(r);if(e.forEach((function(e){_("srcset",e.url)&&(e.evil=!0)})),e=p(e,(function(e){return!e.evil})),!e.length)return void delete n.attribs[i];r=p(e,(function(e){return!e.evil})).map((function(e){if(!e.url)throw new Error("URL missing");return e.url+(e.w?` ${e.w}w`:"")+(e.h?` ${e.h}h`:"")+(e.d?` ${e.d}x`:"")})).join(", "),n.attribs[i]=r}catch(e){return void delete n.attribs[i]}if("class"===i){const t=E[e],s=E["*"],a=A[e],l=C[e],c=C["*"],d=[a,A["*"]].concat(l,c).filter((function(e){return e}));if(!(u=r,h=t&&s?o(t,s):t||s,m=d,r=h?(u=u.split(/\s+/)).filter((function(e){return-1!==h.indexOf(e)||m.some((function(t){return t.test(e)}))})).join(" "):u).length)return void delete n.attribs[i]}if("style"===i)if(t.parseStyleAttributes)try{if(r=function(e){return e.nodes[0].nodes.reduce((function(e,t){return e.push(`${t.prop}:${t.value}${t.important?" !important":""}`),e}),[]).join(";")}(function(e,t){if(!t)return e;const r=e.nodes[0];let n;return n=t[r.selector]&&t["*"]?o(t[r.selector],t["*"]):t[r.selector]||t["*"],n&&(e.nodes[0].nodes=r.nodes.reduce(function(e){return function(t,r){return d(e,r.prop)&&e[r.prop].some((function(e){return e.test(r.value)}))&&t.push(r),t}}(n),[])),e}(l(e+" {"+r+"}",{map:!1}),t.allowedStyles)),0===r.length)return void delete n.attribs[i]}catch(t){return"undefined"!=typeof window&&console.warn('Failed to parse "'+e+" {"+r+"}\", If you're running this in a browser, we recommend to disable style parsing: options.parseStyleAttributes: false, since this only works in a node environment due to a postcss dependency, More info: https://github.com/apostrophecms/sanitize-html/issues/547"),void delete n.attribs[i]}else if(t.allowedStyles)throw new Error("allowedStyles option cannot be used together with parseStyleAttributes: false.");b+=" "+i,r&&r.length?b+='="'+j(r,!0)+'"':t.allowedEmptyAttributes.includes(i)&&(b+='=""')}else delete n.attribs[i];var u,h,m})),-1!==t.selfClosing.indexOf(e)?b+=" />":(b+=">",!n.innerText||c||t.textFilter||(b+=j(n.innerText),q=!0)),i&&(b=y+j(b),y="")},ontext:function(e){if(L)return;const r=N[N.length-1];let n;if(r&&(n=r.tag,e=void 0!==r.innerText?r.innerText:e),"completelyDiscard"!==t.disallowedTagsMode||w(n))if("discard"!==t.disallowedTagsMode&&"completelyDiscard"!==t.disallowedTagsMode||"script"!==n&&"style"!==n){const r=j(e,!1);t.textFilter&&!q?b+=t.textFilter(r,n):q||(b+=r)}else b+=e;else e="";N.length&&(N[N.length-1].text+=e)},onclosetag:function(e,r){if(L){if(M--,M)return;L=!1}const n=N.pop();if(!n)return;if(n.tag!==e)return void N.push(n);L=!!t.enforceHtmlBoundary&&"html"===e,I--;const i=D[I];if(i){if(delete D[I],"discard"===t.disallowedTagsMode||"completelyDiscard"===t.disallowedTagsMode)return void n.updateParentNodeText();y=b,b=""}P[I]&&(e=P[I],delete P[I]),t.exclusiveFilter&&t.exclusiveFilter(n)?b=b.substr(0,n.tagPosition):(n.updateParentNodeMediaChildren(),n.updateParentNodeText(),-1!==t.selfClosing.indexOf(e)||r&&!w(e)&&["escape","recursiveEscape"].indexOf(t.disallowedTagsMode)>=0?i&&(b=y,y=""):(b+="",i&&(b=y+j(b),y=""),q=!1))}},t.parser);return B.write(e),B.end(),b;function R(){b="",I=0,N=[],D={},P={},L=!1,M=0}function j(e,r){return"string"!=typeof e&&(e+=""),t.parser.decodeEntities&&(e=e.replace(/&/g,"&").replace(//g,">"),r&&(e=e.replace(/"/g,"""))),e=e.replace(/&(?![a-zA-Z0-9#]{1,20};)/g,"&").replace(//g,">"),r&&(e=e.replace(/"/g,""")),e}function _(e,r){for(r=r.replace(/[\x00-\x20]+/g,"");;){const e=r.indexOf("\x3c!--");if(-1===e)break;const t=r.indexOf("--\x3e",e+4);if(-1===t)break;r=r.substring(0,e)+r.substring(t+3)}const n=r.match(/^([a-zA-Z][a-zA-Z0-9.\-+]*):/);if(!n)return!!r.match(/^[/\\]{2}/)&&!t.allowProtocolRelative;const i=n[1].toLowerCase();return d(t.allowedSchemesByTag,e)?-1===t.allowedSchemesByTag[e].indexOf(i):!t.allowedSchemes||-1===t.allowedSchemes.indexOf(i)}function U(e){if((e=e.replace(/^(\w+:)?\s*[\\/]\s*[\\/]/,"$1//")).startsWith("relative:"))throw new Error("relative: exploit attempt");let t="relative://relative-site";for(let e=0;e<100;e++)t+=`/${e}`;const r=new URL(e,t);return{isRelativeUrl:r&&"relative-site"===r.hostname&&"relative:"===r.protocol,url:r}}}const g={decodeEntities:!0};m.defaults={allowedTags:["address","article","aside","footer","header","h1","h2","h3","h4","h5","h6","hgroup","main","nav","section","blockquote","dd","div","dl","dt","figcaption","figure","hr","li","main","ol","p","pre","ul","a","abbr","b","bdi","bdo","br","cite","code","data","dfn","em","i","kbd","mark","q","rb","rp","rt","rtc","ruby","s","samp","small","span","strong","sub","sup","time","u","var","wbr","caption","col","colgroup","table","tbody","td","tfoot","th","thead","tr"],nonBooleanAttributes:["abbr","accept","accept-charset","accesskey","action","allow","alt","as","autocapitalize","autocomplete","blocking","charset","cite","class","color","cols","colspan","content","contenteditable","coords","crossorigin","data","datetime","decoding","dir","dirname","download","draggable","enctype","enterkeyhint","fetchpriority","for","form","formaction","formenctype","formmethod","formtarget","headers","height","hidden","high","href","hreflang","http-equiv","id","imagesizes","imagesrcset","inputmode","integrity","is","itemid","itemprop","itemref","itemtype","kind","label","lang","list","loading","low","max","maxlength","media","method","min","minlength","name","nonce","optimum","pattern","ping","placeholder","popover","popovertarget","popovertargetaction","poster","preload","referrerpolicy","rel","rows","rowspan","sandbox","scope","shape","size","sizes","slot","span","spellcheck","src","srcdoc","srclang","srcset","start","step","style","tabindex","target","title","translate","type","usemap","value","width","wrap","onauxclick","onafterprint","onbeforematch","onbeforeprint","onbeforeunload","onbeforetoggle","onblur","oncancel","oncanplay","oncanplaythrough","onchange","onclick","onclose","oncontextlost","oncontextmenu","oncontextrestored","oncopy","oncuechange","oncut","ondblclick","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","onformdata","onhashchange","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onlanguagechange","onload","onloadeddata","onloadedmetadata","onloadstart","onmessage","onmessageerror","onmousedown","onmouseenter","onmouseleave","onmousemove","onmouseout","onmouseover","onmouseup","onoffline","ononline","onpagehide","onpageshow","onpaste","onpause","onplay","onplaying","onpopstate","onprogress","onratechange","onreset","onresize","onrejectionhandled","onscroll","onscrollend","onsecuritypolicyviolation","onseeked","onseeking","onselect","onslotchange","onstalled","onstorage","onsubmit","onsuspend","ontimeupdate","ontoggle","onunhandledrejection","onunload","onvolumechange","onwaiting","onwheel"],disallowedTagsMode:"discard",allowedAttributes:{a:["href","name","target"],img:["src","srcset","alt","title","width","height","loading"]},allowedEmptyAttributes:["alt"],selfClosing:["img","br","hr","area","base","basefont","input","link","meta"],allowedSchemes:["http","https","ftp","mailto","tel"],allowedSchemesByTag:{},allowedSchemesAppliedToAttributes:["href","src","cite"],allowProtocolRelative:!0,enforceHtmlBoundary:!1,parseStyleAttributes:!0},m.simpleTransform=function(e,t,r){return r=void 0===r||r,t=t||{},function(n,i){let s;if(r)for(s in t)i[s]=t[s];else i=t;return{tagName:e,attribs:i}}}},945:e=>{e.exports={nanoid:(e=21)=>{let t="",r=e;for(;r--;)t+="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[64*Math.random()|0];return t},customAlphabet:(e,t=21)=>(r=t)=>{let n="",i=r;for(;i--;)n+=e[Math.random()*e.length|0];return n}}}}]); \ No newline at end of file diff --git a/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/439.b350310d057b43cdd50f.js.LICENSE.txt b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/439.b350310d057b43cdd50f.js.LICENSE.txt new file mode 100644 index 0000000..fe4c1fe --- /dev/null +++ b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/439.b350310d057b43cdd50f.js.LICENSE.txt @@ -0,0 +1,6 @@ +/*! + * is-plain-object + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ diff --git a/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/446.f8696ce72124c78273da.js b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/446.f8696ce72124c78273da.js new file mode 100644 index 0000000..5a288c6 --- /dev/null +++ b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/446.f8696ce72124c78273da.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_jupyter_widgets_jupyterlab_manager=self.webpackChunk_jupyter_widgets_jupyterlab_manager||[]).push([[446,701],{1556:(e,n,t)=>{t.d(n,{A:()=>d});var i=t(4786),r=t.n(i),o=t(9451),a=t.n(o)()(r());a.push([e.id,"/* Copyright (c) Jupyter Development Team.\n * Distributed under the terms of the Modified BSD License.\n */\n\n.jupyter-widgets-disconnected::before {\n content: '\\f127'; /* chain-broken */\n display: inline-block;\n font: normal normal 900 14px/1 'Font Awesome 5 Free', 'FontAwesome';\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n color: #d9534f;\n padding: 3px;\n align-self: flex-start;\n}\n\n.jupyter-widgets-error-widget {\n display: flex;\n flex-direction: column;\n justify-content: center;\n height: 100%;\n border: solid 1px red;\n margin: 0 auto;\n}\n\n.jupyter-widgets-error-widget.icon-error {\n min-width: var(--jp-widgets-inline-width-short);\n}\n.jupyter-widgets-error-widget.text-error {\n min-width: calc(2 * var(--jp-widgets-inline-width));\n min-height: calc(3 * var(--jp-widgets-inline-height));\n}\n\n.jupyter-widgets-error-widget p {\n text-align: center;\n}\n\n.jupyter-widgets-error-widget.text-error pre::first-line {\n font-weight: bold;\n}\n",""]);const d=a},1451:(e,n,t)=>{t.d(n,{A:()=>d});var i=t(4786),r=t.n(i),o=t(9451),a=t.n(o)()(r());a.push([e.id,"/* This file has code derived from Lumino CSS files, as noted below. The license for this Lumino code is:\n\nCopyright (c) 2019 Project Jupyter Contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\nCopyright (c) 2014-2017, PhosphorJS Contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/*\n * The following section is derived from https://github.com/jupyterlab/lumino/blob/23b9d075ebc5b73ab148b6ebfc20af97f85714c4/packages/widgets/style/tabbar.css \n * We've scoped the rules so that they are consistent with exactly our code.\n */\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar, /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar {\n display: flex;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar[data-orientation='horizontal'], /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar[data-orientation='horizontal'], /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar[data-orientation='horizontal'] {\n flex-direction: row;\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar[data-orientation='vertical'], /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar[data-orientation='vertical'], /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar[data-orientation='vertical'] {\n flex-direction: column;\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar > .p-TabBar-content, /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar > .p-TabBar-content, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar > .lm-TabBar-content {\n margin: 0;\n padding: 0;\n display: flex;\n flex: 1 1 auto;\n list-style-type: none;\n}\n\n/* */\n.jupyter-widgets.widget-tab\n > .p-TabBar[data-orientation='horizontal']\n > .p-TabBar-content,\n/* */\n/* */\n.jupyter-widgets.jupyter-widget-tab\n> .p-TabBar[data-orientation='horizontal']\n> .p-TabBar-content,\n/* */\n.jupyter-widgets.jupyter-widget-tab\n > .lm-TabBar[data-orientation='horizontal']\n > .lm-TabBar-content {\n flex-direction: row;\n}\n\n/* */\n.jupyter-widgets.widget-tab\n > .p-TabBar[data-orientation='vertical']\n > .p-TabBar-content,\n/* */\n/* */\n.jupyter-widgets.jupyter-widget-tab\n> .p-TabBar[data-orientation='vertical']\n> .p-TabBar-content,\n/* */\n.jupyter-widgets.jupyter-widget-tab\n > .lm-TabBar[data-orientation='vertical']\n > .lm-TabBar-content {\n flex-direction: column;\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tab, /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tab, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tab {\n display: flex;\n flex-direction: row;\n box-sizing: border-box;\n overflow: hidden;\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tabIcon, /* */\n/* */ .jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tabCloseIcon, /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tabIcon, /* */\n/* */ .jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tabCloseIcon, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tabIcon,\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tabCloseIcon {\n flex: 0 0 auto;\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tabLabel, /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tabLabel, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tabLabel {\n flex: 1 1 auto;\n overflow: hidden;\n white-space: nowrap;\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tab.p-mod-hidden, /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tab.p-mod-hidden, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tab.lm-mod-hidden {\n display: none !important;\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar.p-mod-dragging .p-TabBar-tab, /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar.p-mod-dragging .p-TabBar-tab, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar.lm-mod-dragging .lm-TabBar-tab {\n position: relative;\n}\n\n/* */\n.jupyter-widgets.widget-tab\n > .p-TabBar.p-mod-dragging[data-orientation='horizontal']\n .p-TabBar-tab,\n/* */\n/* */\n.jupyter-widgets.jupyter-widget-tab\n > .p-TabBar.p-mod-dragging[data-orientation='horizontal']\n .p-TabBar-tab,\n/* */\n.jupyter-widgets.jupyter-widget-tab\n > .lm-TabBar.lm-mod-dragging[data-orientation='horizontal']\n .lm-TabBar-tab {\n left: 0;\n transition: left 150ms ease;\n}\n\n/* */\n.jupyter-widgets.widget-tab\n > .p-TabBar.p-mod-dragging[data-orientation='vertical']\n .p-TabBar-tab,\n/* */\n/* */\n.jupyter-widgets.jupyter-widget-tab\n> .p-TabBar.p-mod-dragging[data-orientation='vertical']\n.p-TabBar-tab,\n/* */\n.jupyter-widgets.jupyter-widget-tab\n > .lm-TabBar.lm-mod-dragging[data-orientation='vertical']\n .lm-TabBar-tab {\n top: 0;\n transition: top 150ms ease;\n}\n\n/* */\n.jupyter-widgets.widget-tab\n > .p-TabBar.p-mod-dragging\n .p-TabBar-tab.p-mod-dragging,\n/* */\n/* */\n.jupyter-widgets.jupyter-widget-tab\n> .p-TabBar.p-mod-dragging\n.p-TabBar-tab.p-mod-dragging,\n/* */\n.jupyter-widgets.jupyter-widget-tab\n > .lm-TabBar.lm-mod-dragging\n .lm-TabBar-tab.lm-mod-dragging {\n transition: none;\n}\n\n/* End tabbar.css */\n",""]);const d=a},9013:(e,n,t)=>{t.d(n,{A:()=>d});var i=t(4786),r=t.n(i),o=t(9451),a=t.n(o)()(r());a.push([e.id,'/*\n\nThe nouislider.css file is autogenerated from nouislider.less, which imports and wraps the nouislider/src/nouislider.less styles.\n\nMIT License\n\nCopyright (c) 2019 Léon Gersen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n/* The .widget-slider class is deprecated */\n.widget-slider,\n.jupyter-widget-slider {\n /* Functional styling;\n * These styles are required for noUiSlider to function.\n * You don\'t need to change these rules to apply your design.\n */\n /* Wrapper for all connect elements.\n */\n /* Offset direction\n */\n /* Give origins 0 height/width so they don\'t interfere with clicking the\n * connect elements.\n */\n /* Slider size and handle placement;\n */\n /* Styling;\n * Giving the connect element a border radius causes issues with using transform: scale\n */\n /* Handles and cursors;\n */\n /* Handle stripes;\n */\n /* Disabled state;\n */\n /* Base;\n *\n */\n /* Values;\n *\n */\n /* Markings;\n *\n */\n /* Horizontal layout;\n *\n */\n /* Vertical layout;\n *\n */\n /* Copyright (c) Jupyter Development Team.\n * Distributed under the terms of the Modified BSD License.\n */\n /* Custom CSS for nouislider */\n}\n.widget-slider .noUi-target,\n.jupyter-widget-slider .noUi-target,\n.widget-slider .noUi-target *,\n.jupyter-widget-slider .noUi-target * {\n -webkit-touch-callout: none;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n -webkit-user-select: none;\n -ms-touch-action: none;\n touch-action: none;\n -ms-user-select: none;\n -moz-user-select: none;\n user-select: none;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n.widget-slider .noUi-target,\n.jupyter-widget-slider .noUi-target {\n position: relative;\n}\n.widget-slider .noUi-base,\n.jupyter-widget-slider .noUi-base,\n.widget-slider .noUi-connects,\n.jupyter-widget-slider .noUi-connects {\n width: 100%;\n height: 100%;\n position: relative;\n z-index: 1;\n}\n.widget-slider .noUi-connects,\n.jupyter-widget-slider .noUi-connects {\n overflow: hidden;\n z-index: 0;\n}\n.widget-slider .noUi-connect,\n.jupyter-widget-slider .noUi-connect,\n.widget-slider .noUi-origin,\n.jupyter-widget-slider .noUi-origin {\n will-change: transform;\n position: absolute;\n z-index: 1;\n top: 0;\n right: 0;\n -ms-transform-origin: 0 0;\n -webkit-transform-origin: 0 0;\n -webkit-transform-style: preserve-3d;\n transform-origin: 0 0;\n transform-style: flat;\n}\n.widget-slider .noUi-connect,\n.jupyter-widget-slider .noUi-connect {\n height: 100%;\n width: 100%;\n}\n.widget-slider .noUi-origin,\n.jupyter-widget-slider .noUi-origin {\n height: 10%;\n width: 10%;\n}\n.widget-slider .noUi-txt-dir-rtl.noUi-horizontal .noUi-origin,\n.jupyter-widget-slider .noUi-txt-dir-rtl.noUi-horizontal .noUi-origin {\n left: 0;\n right: auto;\n}\n.widget-slider .noUi-vertical .noUi-origin,\n.jupyter-widget-slider .noUi-vertical .noUi-origin {\n width: 0;\n}\n.widget-slider .noUi-horizontal .noUi-origin,\n.jupyter-widget-slider .noUi-horizontal .noUi-origin {\n height: 0;\n}\n.widget-slider .noUi-handle,\n.jupyter-widget-slider .noUi-handle {\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n position: absolute;\n}\n.widget-slider .noUi-touch-area,\n.jupyter-widget-slider .noUi-touch-area {\n height: 100%;\n width: 100%;\n}\n.widget-slider .noUi-state-tap .noUi-connect,\n.jupyter-widget-slider .noUi-state-tap .noUi-connect,\n.widget-slider .noUi-state-tap .noUi-origin,\n.jupyter-widget-slider .noUi-state-tap .noUi-origin {\n -webkit-transition: transform 0.3s;\n transition: transform 0.3s;\n}\n.widget-slider .noUi-state-drag *,\n.jupyter-widget-slider .noUi-state-drag * {\n cursor: inherit !important;\n}\n.widget-slider .noUi-horizontal,\n.jupyter-widget-slider .noUi-horizontal {\n height: 18px;\n}\n.widget-slider .noUi-horizontal .noUi-handle,\n.jupyter-widget-slider .noUi-horizontal .noUi-handle {\n width: 34px;\n height: 28px;\n right: -17px;\n top: -6px;\n}\n.widget-slider .noUi-vertical,\n.jupyter-widget-slider .noUi-vertical {\n width: 18px;\n}\n.widget-slider .noUi-vertical .noUi-handle,\n.jupyter-widget-slider .noUi-vertical .noUi-handle {\n width: 28px;\n height: 34px;\n right: -6px;\n top: -17px;\n}\n.widget-slider .noUi-txt-dir-rtl.noUi-horizontal .noUi-handle,\n.jupyter-widget-slider .noUi-txt-dir-rtl.noUi-horizontal .noUi-handle {\n left: -17px;\n right: auto;\n}\n.widget-slider .noUi-target,\n.jupyter-widget-slider .noUi-target {\n background: #FAFAFA;\n border-radius: 4px;\n border: 1px solid #D3D3D3;\n box-shadow: inset 0 1px 1px #F0F0F0, 0 3px 6px -5px #BBB;\n}\n.widget-slider .noUi-connects,\n.jupyter-widget-slider .noUi-connects {\n border-radius: 3px;\n}\n.widget-slider .noUi-connect,\n.jupyter-widget-slider .noUi-connect {\n background: #3FB8AF;\n}\n.widget-slider .noUi-draggable,\n.jupyter-widget-slider .noUi-draggable {\n cursor: ew-resize;\n}\n.widget-slider .noUi-vertical .noUi-draggable,\n.jupyter-widget-slider .noUi-vertical .noUi-draggable {\n cursor: ns-resize;\n}\n.widget-slider .noUi-handle,\n.jupyter-widget-slider .noUi-handle {\n border: 1px solid #D9D9D9;\n border-radius: 3px;\n background: #FFF;\n cursor: default;\n box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB;\n}\n.widget-slider .noUi-active,\n.jupyter-widget-slider .noUi-active {\n box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #DDD, 0 3px 6px -3px #BBB;\n}\n.widget-slider .noUi-handle:before,\n.jupyter-widget-slider .noUi-handle:before,\n.widget-slider .noUi-handle:after,\n.jupyter-widget-slider .noUi-handle:after {\n content: "";\n display: block;\n position: absolute;\n height: 14px;\n width: 1px;\n background: #E8E7E6;\n left: 14px;\n top: 6px;\n}\n.widget-slider .noUi-handle:after,\n.jupyter-widget-slider .noUi-handle:after {\n left: 17px;\n}\n.widget-slider .noUi-vertical .noUi-handle:before,\n.jupyter-widget-slider .noUi-vertical .noUi-handle:before,\n.widget-slider .noUi-vertical .noUi-handle:after,\n.jupyter-widget-slider .noUi-vertical .noUi-handle:after {\n width: 14px;\n height: 1px;\n left: 6px;\n top: 14px;\n}\n.widget-slider .noUi-vertical .noUi-handle:after,\n.jupyter-widget-slider .noUi-vertical .noUi-handle:after {\n top: 17px;\n}\n.widget-slider [disabled] .noUi-connect,\n.jupyter-widget-slider [disabled] .noUi-connect {\n background: #B8B8B8;\n}\n.widget-slider [disabled].noUi-target,\n.jupyter-widget-slider [disabled].noUi-target,\n.widget-slider [disabled].noUi-handle,\n.jupyter-widget-slider [disabled].noUi-handle,\n.widget-slider [disabled] .noUi-handle,\n.jupyter-widget-slider [disabled] .noUi-handle {\n cursor: not-allowed;\n}\n.widget-slider .noUi-pips,\n.jupyter-widget-slider .noUi-pips,\n.widget-slider .noUi-pips *,\n.jupyter-widget-slider .noUi-pips * {\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n.widget-slider .noUi-pips,\n.jupyter-widget-slider .noUi-pips {\n position: absolute;\n color: #999;\n}\n.widget-slider .noUi-value,\n.jupyter-widget-slider .noUi-value {\n position: absolute;\n white-space: nowrap;\n text-align: center;\n}\n.widget-slider .noUi-value-sub,\n.jupyter-widget-slider .noUi-value-sub {\n color: #ccc;\n font-size: 10px;\n}\n.widget-slider .noUi-marker,\n.jupyter-widget-slider .noUi-marker {\n position: absolute;\n background: #CCC;\n}\n.widget-slider .noUi-marker-sub,\n.jupyter-widget-slider .noUi-marker-sub {\n background: #AAA;\n}\n.widget-slider .noUi-marker-large,\n.jupyter-widget-slider .noUi-marker-large {\n background: #AAA;\n}\n.widget-slider .noUi-pips-horizontal,\n.jupyter-widget-slider .noUi-pips-horizontal {\n padding: 10px 0;\n height: 80px;\n top: 100%;\n left: 0;\n width: 100%;\n}\n.widget-slider .noUi-value-horizontal,\n.jupyter-widget-slider .noUi-value-horizontal {\n -webkit-transform: translate(-50%, 50%);\n transform: translate(-50%, 50%);\n}\n.noUi-rtl .widget-slider .noUi-value-horizontal,\n.noUi-rtl .jupyter-widget-slider .noUi-value-horizontal {\n -webkit-transform: translate(50%, 50%);\n transform: translate(50%, 50%);\n}\n.widget-slider .noUi-marker-horizontal.noUi-marker,\n.jupyter-widget-slider .noUi-marker-horizontal.noUi-marker {\n margin-left: -1px;\n width: 2px;\n height: 5px;\n}\n.widget-slider .noUi-marker-horizontal.noUi-marker-sub,\n.jupyter-widget-slider .noUi-marker-horizontal.noUi-marker-sub {\n height: 10px;\n}\n.widget-slider .noUi-marker-horizontal.noUi-marker-large,\n.jupyter-widget-slider .noUi-marker-horizontal.noUi-marker-large {\n height: 15px;\n}\n.widget-slider .noUi-pips-vertical,\n.jupyter-widget-slider .noUi-pips-vertical {\n padding: 0 10px;\n height: 100%;\n top: 0;\n left: 100%;\n}\n.widget-slider .noUi-value-vertical,\n.jupyter-widget-slider .noUi-value-vertical {\n -webkit-transform: translate(0, -50%);\n transform: translate(0, -50%);\n padding-left: 25px;\n}\n.noUi-rtl .widget-slider .noUi-value-vertical,\n.noUi-rtl .jupyter-widget-slider .noUi-value-vertical {\n -webkit-transform: translate(0, 50%);\n transform: translate(0, 50%);\n}\n.widget-slider .noUi-marker-vertical.noUi-marker,\n.jupyter-widget-slider .noUi-marker-vertical.noUi-marker {\n width: 5px;\n height: 2px;\n margin-top: -1px;\n}\n.widget-slider .noUi-marker-vertical.noUi-marker-sub,\n.jupyter-widget-slider .noUi-marker-vertical.noUi-marker-sub {\n width: 10px;\n}\n.widget-slider .noUi-marker-vertical.noUi-marker-large,\n.jupyter-widget-slider .noUi-marker-vertical.noUi-marker-large {\n width: 15px;\n}\n.widget-slider .noUi-tooltip,\n.jupyter-widget-slider .noUi-tooltip {\n display: block;\n position: absolute;\n border: 1px solid #D9D9D9;\n border-radius: 3px;\n background: #fff;\n color: #000;\n padding: 5px;\n text-align: center;\n white-space: nowrap;\n}\n.widget-slider .noUi-horizontal .noUi-tooltip,\n.jupyter-widget-slider .noUi-horizontal .noUi-tooltip {\n -webkit-transform: translate(-50%, 0);\n transform: translate(-50%, 0);\n left: 50%;\n bottom: 120%;\n}\n.widget-slider .noUi-vertical .noUi-tooltip,\n.jupyter-widget-slider .noUi-vertical .noUi-tooltip {\n -webkit-transform: translate(0, -50%);\n transform: translate(0, -50%);\n top: 50%;\n right: 120%;\n}\n.widget-slider .noUi-horizontal .noUi-origin > .noUi-tooltip,\n.jupyter-widget-slider .noUi-horizontal .noUi-origin > .noUi-tooltip {\n -webkit-transform: translate(50%, 0);\n transform: translate(50%, 0);\n left: auto;\n bottom: 10px;\n}\n.widget-slider .noUi-vertical .noUi-origin > .noUi-tooltip,\n.jupyter-widget-slider .noUi-vertical .noUi-origin > .noUi-tooltip {\n -webkit-transform: translate(0, -18px);\n transform: translate(0, -18px);\n top: auto;\n right: 28px;\n}\n.widget-slider .noUi-connect,\n.jupyter-widget-slider .noUi-connect {\n background: #2196f3;\n}\n.widget-slider .noUi-horizontal,\n.jupyter-widget-slider .noUi-horizontal {\n height: var(--jp-widgets-slider-track-thickness);\n}\n.widget-slider .noUi-vertical,\n.jupyter-widget-slider .noUi-vertical {\n width: var(--jp-widgets-slider-track-thickness);\n height: 100%;\n}\n.widget-slider .noUi-horizontal .noUi-handle,\n.jupyter-widget-slider .noUi-horizontal .noUi-handle {\n width: var(--jp-widgets-slider-handle-size);\n height: var(--jp-widgets-slider-handle-size);\n border-radius: 50%;\n top: calc((var(--jp-widgets-slider-track-thickness) - var(--jp-widgets-slider-handle-size)) / 2);\n right: calc(var(--jp-widgets-slider-handle-size) / -2);\n}\n.widget-slider .noUi-vertical .noUi-handle,\n.jupyter-widget-slider .noUi-vertical .noUi-handle {\n height: var(--jp-widgets-slider-handle-size);\n width: var(--jp-widgets-slider-handle-size);\n border-radius: 50%;\n right: calc((var(--jp-widgets-slider-handle-size) - var(--jp-widgets-slider-track-thickness)) / -2);\n top: calc(var(--jp-widgets-slider-handle-size) / -2);\n}\n.widget-slider .noUi-handle:after,\n.jupyter-widget-slider .noUi-handle:after {\n content: none;\n}\n.widget-slider .noUi-handle:before,\n.jupyter-widget-slider .noUi-handle:before {\n content: none;\n}\n.widget-slider .noUi-target,\n.jupyter-widget-slider .noUi-target {\n background: #fafafa;\n border-radius: 4px;\n border: 1px;\n /* box-shadow: inset 0 1px 1px #F0F0F0, 0 3px 6px -5px #BBB; */\n}\n.widget-slider .ui-slider,\n.jupyter-widget-slider .ui-slider {\n border: var(--jp-widgets-slider-border-width) solid var(--jp-layout-color3);\n background: var(--jp-layout-color3);\n box-sizing: border-box;\n position: relative;\n border-radius: 0px;\n}\n.widget-slider .noUi-handle,\n.jupyter-widget-slider .noUi-handle {\n width: var(--jp-widgets-slider-handle-size);\n border: 1px solid #d9d9d9;\n border-radius: 3px;\n background: #fff;\n cursor: default;\n box-shadow: none;\n outline: none;\n}\n.widget-slider .noUi-target:not([disabled]) .noUi-handle:hover,\n.jupyter-widget-slider .noUi-target:not([disabled]) .noUi-handle:hover,\n.widget-slider .noUi-target:not([disabled]) .noUi-handle:focus,\n.jupyter-widget-slider .noUi-target:not([disabled]) .noUi-handle:focus {\n background-color: var(--jp-widgets-slider-active-handle-color);\n border: var(--jp-widgets-slider-border-width) solid var(--jp-widgets-slider-active-handle-color);\n}\n.widget-slider [disabled].noUi-target,\n.jupyter-widget-slider [disabled].noUi-target {\n opacity: 0.35;\n}\n.widget-slider .noUi-connects,\n.jupyter-widget-slider .noUi-connects {\n overflow: visible;\n z-index: 0;\n background: var(--jp-layout-color3);\n}\n.widget-slider .noUi-vertical .noUi-connect,\n.jupyter-widget-slider .noUi-vertical .noUi-connect {\n width: calc(100% + 2px);\n right: -1px;\n}\n.widget-slider .noUi-horizontal .noUi-connect,\n.jupyter-widget-slider .noUi-horizontal .noUi-connect {\n height: calc(100% + 2px);\n top: -1px;\n}\n',""]);const d=a},7654:(e,n,t)=>{t.d(n,{A:()=>w});var i=t(4786),r=t.n(i),o=t(9451),a=t.n(o),d=t(1451),s=t(9013),l=t(7298),g=t.n(l),p=new URL(t(2426),t.b),c=a()(r());c.i(d.A),c.i(s.A);var u=g()(p);c.push([e.id,`/* Copyright (c) Jupyter Development Team.\n * Distributed under the terms of the Modified BSD License.\n */\n\n/*\n * We assume that the CSS variables in\n * https://github.com/jupyterlab/jupyterlab/blob/master/src/default-theme/variables.css\n * have been defined.\n */\n\n:root {\n --jp-widgets-color: var(--jp-content-font-color1);\n --jp-widgets-label-color: var(--jp-widgets-color);\n --jp-widgets-readout-color: var(--jp-widgets-color);\n --jp-widgets-font-size: var(--jp-ui-font-size1);\n --jp-widgets-margin: 2px;\n --jp-widgets-inline-height: 28px;\n --jp-widgets-inline-width: 300px;\n --jp-widgets-inline-width-short: calc(\n var(--jp-widgets-inline-width) / 2 - var(--jp-widgets-margin)\n );\n --jp-widgets-inline-width-tiny: calc(\n var(--jp-widgets-inline-width-short) / 2 - var(--jp-widgets-margin)\n );\n --jp-widgets-inline-margin: 4px; /* margin between inline elements */\n --jp-widgets-inline-label-width: 80px;\n --jp-widgets-border-width: var(--jp-border-width);\n --jp-widgets-vertical-height: 200px;\n --jp-widgets-horizontal-tab-height: 24px;\n --jp-widgets-horizontal-tab-width: 144px;\n --jp-widgets-horizontal-tab-top-border: 2px;\n --jp-widgets-progress-thickness: 20px;\n --jp-widgets-container-padding: 15px;\n --jp-widgets-input-padding: 4px;\n --jp-widgets-radio-item-height-adjustment: 8px;\n --jp-widgets-radio-item-height: calc(\n var(--jp-widgets-inline-height) -\n var(--jp-widgets-radio-item-height-adjustment)\n );\n --jp-widgets-slider-track-thickness: 4px;\n --jp-widgets-slider-border-width: var(--jp-widgets-border-width);\n --jp-widgets-slider-handle-size: 16px;\n --jp-widgets-slider-handle-border-color: var(--jp-border-color1);\n --jp-widgets-slider-handle-background-color: var(--jp-layout-color1);\n --jp-widgets-slider-active-handle-color: var(--jp-brand-color1);\n --jp-widgets-menu-item-height: 24px;\n --jp-widgets-dropdown-arrow: url(${u});\n --jp-widgets-input-color: var(--jp-ui-font-color1);\n --jp-widgets-input-background-color: var(--jp-layout-color1);\n --jp-widgets-input-border-color: var(--jp-border-color1);\n --jp-widgets-input-focus-border-color: var(--jp-brand-color2);\n --jp-widgets-input-border-width: var(--jp-widgets-border-width);\n --jp-widgets-disabled-opacity: 0.6;\n\n /* From Material Design Lite */\n --md-shadow-key-umbra-opacity: 0.2;\n --md-shadow-key-penumbra-opacity: 0.14;\n --md-shadow-ambient-shadow-opacity: 0.12;\n}\n\n.jupyter-widgets {\n margin: var(--jp-widgets-margin);\n box-sizing: border-box;\n color: var(--jp-widgets-color);\n overflow: visible;\n}\n\n.jp-Output-result > .jupyter-widgets {\n margin-left: 0;\n margin-right: 0;\n}\n\n/* vbox and hbox */\n\n/* */\n.widget-inline-hbox, /* */\n .jupyter-widget-inline-hbox {\n /* Horizontal widgets */\n box-sizing: border-box;\n display: flex;\n flex-direction: row;\n align-items: baseline;\n}\n\n/* */\n.widget-inline-vbox, /* */\n .jupyter-widget-inline-vbox {\n /* Vertical Widgets */\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n/* */\n.widget-box, /* */\n.jupyter-widget-box {\n box-sizing: border-box;\n display: flex;\n margin: 0;\n overflow: auto;\n}\n\n/* */\n.widget-gridbox, /* */\n.jupyter-widget-gridbox {\n box-sizing: border-box;\n display: grid;\n margin: 0;\n overflow: auto;\n}\n\n/* */\n.widget-hbox, /* */\n.jupyter-widget-hbox {\n flex-direction: row;\n}\n\n/* */\n.widget-vbox, /* */\n.jupyter-widget-vbox {\n flex-direction: column;\n}\n\n/* General Tags Styling */\n\n.jupyter-widget-tagsinput {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n overflow: auto;\n\n cursor: text;\n}\n\n.jupyter-widget-tag {\n padding-left: 10px;\n padding-right: 10px;\n padding-top: 0px;\n padding-bottom: 0px;\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-align: center;\n font-size: var(--jp-widgets-font-size);\n\n height: calc(var(--jp-widgets-inline-height) - 2px);\n border: 0px solid;\n line-height: calc(var(--jp-widgets-inline-height) - 2px);\n box-shadow: none;\n\n color: var(--jp-ui-font-color1);\n background-color: var(--jp-layout-color2);\n border-color: var(--jp-border-color2);\n border: none;\n user-select: none;\n\n cursor: grab;\n transition: margin-left 200ms;\n margin: 1px 1px 1px 1px;\n}\n\n.jupyter-widget-tag.mod-active {\n /* MD Lite 4dp shadow */\n box-shadow: 0 4px 5px 0 rgba(0, 0, 0, var(--md-shadow-key-penumbra-opacity)),\n 0 1px 10px 0 rgba(0, 0, 0, var(--md-shadow-ambient-shadow-opacity)),\n 0 2px 4px -1px rgba(0, 0, 0, var(--md-shadow-key-umbra-opacity));\n color: var(--jp-ui-font-color1);\n background-color: var(--jp-layout-color3);\n}\n\n.jupyter-widget-colortag {\n color: var(--jp-inverse-ui-font-color1);\n}\n\n.jupyter-widget-colortag.mod-active {\n color: var(--jp-inverse-ui-font-color0);\n}\n\n.jupyter-widget-taginput {\n color: var(--jp-ui-font-color0);\n background-color: var(--jp-layout-color0);\n\n cursor: text;\n text-align: left;\n}\n\n.jupyter-widget-taginput:focus {\n outline: none;\n}\n\n.jupyter-widget-tag-close {\n margin-left: var(--jp-widgets-inline-margin);\n padding: 2px 0px 2px 2px;\n}\n\n.jupyter-widget-tag-close:hover {\n cursor: pointer;\n}\n\n/* Tag "Primary" Styling */\n\n.jupyter-widget-tag.mod-primary {\n color: var(--jp-inverse-ui-font-color1);\n background-color: var(--jp-brand-color1);\n}\n\n.jupyter-widget-tag.mod-primary.mod-active {\n color: var(--jp-inverse-ui-font-color0);\n background-color: var(--jp-brand-color0);\n}\n\n/* Tag "Success" Styling */\n\n.jupyter-widget-tag.mod-success {\n color: var(--jp-inverse-ui-font-color1);\n background-color: var(--jp-success-color1);\n}\n\n.jupyter-widget-tag.mod-success.mod-active {\n color: var(--jp-inverse-ui-font-color0);\n background-color: var(--jp-success-color0);\n}\n\n/* Tag "Info" Styling */\n\n.jupyter-widget-tag.mod-info {\n color: var(--jp-inverse-ui-font-color1);\n background-color: var(--jp-info-color1);\n}\n\n.jupyter-widget-tag.mod-info.mod-active {\n color: var(--jp-inverse-ui-font-color0);\n background-color: var(--jp-info-color0);\n}\n\n/* Tag "Warning" Styling */\n\n.jupyter-widget-tag.mod-warning {\n color: var(--jp-inverse-ui-font-color1);\n background-color: var(--jp-warn-color1);\n}\n\n.jupyter-widget-tag.mod-warning.mod-active {\n color: var(--jp-inverse-ui-font-color0);\n background-color: var(--jp-warn-color0);\n}\n\n/* Tag "Danger" Styling */\n\n.jupyter-widget-tag.mod-danger {\n color: var(--jp-inverse-ui-font-color1);\n background-color: var(--jp-error-color1);\n}\n\n.jupyter-widget-tag.mod-danger.mod-active {\n color: var(--jp-inverse-ui-font-color0);\n background-color: var(--jp-error-color0);\n}\n\n/* General Button Styling */\n\n.jupyter-button {\n padding-left: 10px;\n padding-right: 10px;\n padding-top: 0px;\n padding-bottom: 0px;\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-align: center;\n font-size: var(--jp-widgets-font-size);\n cursor: pointer;\n\n height: var(--jp-widgets-inline-height);\n border: 0px solid;\n line-height: var(--jp-widgets-inline-height);\n box-shadow: none;\n\n color: var(--jp-ui-font-color1);\n background-color: var(--jp-layout-color2);\n border-color: var(--jp-border-color2);\n border: none;\n user-select: none;\n}\n\n.jupyter-button i.fa {\n margin-right: var(--jp-widgets-inline-margin);\n pointer-events: none;\n}\n\n.jupyter-button:empty:before {\n content: '\\200b'; /* zero-width space */\n}\n\n.jupyter-widgets.jupyter-button:disabled {\n opacity: var(--jp-widgets-disabled-opacity);\n}\n\n.jupyter-button i.fa.center {\n margin-right: 0;\n}\n\n.jupyter-button:hover:enabled,\n.jupyter-button:focus:enabled {\n /* MD Lite 2dp shadow */\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, var(--md-shadow-key-penumbra-opacity)),\n 0 3px 1px -2px rgba(0, 0, 0, var(--md-shadow-key-umbra-opacity)),\n 0 1px 5px 0 rgba(0, 0, 0, var(--md-shadow-ambient-shadow-opacity));\n}\n\n.jupyter-button:active,\n.jupyter-button.mod-active {\n /* MD Lite 4dp shadow */\n box-shadow: 0 4px 5px 0 rgba(0, 0, 0, var(--md-shadow-key-penumbra-opacity)),\n 0 1px 10px 0 rgba(0, 0, 0, var(--md-shadow-ambient-shadow-opacity)),\n 0 2px 4px -1px rgba(0, 0, 0, var(--md-shadow-key-umbra-opacity));\n color: var(--jp-ui-font-color1);\n background-color: var(--jp-layout-color3);\n}\n\n.jupyter-button:focus:enabled {\n outline: 1px solid var(--jp-widgets-input-focus-border-color);\n}\n\n/* Button "Primary" Styling */\n\n.jupyter-button.mod-primary {\n color: var(--jp-ui-inverse-font-color1);\n background-color: var(--jp-brand-color1);\n}\n\n.jupyter-button.mod-primary.mod-active {\n color: var(--jp-ui-inverse-font-color0);\n background-color: var(--jp-brand-color0);\n}\n\n.jupyter-button.mod-primary:active {\n color: var(--jp-ui-inverse-font-color0);\n background-color: var(--jp-brand-color0);\n}\n\n/* Button "Success" Styling */\n\n.jupyter-button.mod-success {\n color: var(--jp-ui-inverse-font-color1);\n background-color: var(--jp-success-color1);\n}\n\n.jupyter-button.mod-success.mod-active {\n color: var(--jp-ui-inverse-font-color0);\n background-color: var(--jp-success-color0);\n}\n\n.jupyter-button.mod-success:active {\n color: var(--jp-ui-inverse-font-color0);\n background-color: var(--jp-success-color0);\n}\n\n/* Button "Info" Styling */\n\n.jupyter-button.mod-info {\n color: var(--jp-ui-inverse-font-color1);\n background-color: var(--jp-info-color1);\n}\n\n.jupyter-button.mod-info.mod-active {\n color: var(--jp-ui-inverse-font-color0);\n background-color: var(--jp-info-color0);\n}\n\n.jupyter-button.mod-info:active {\n color: var(--jp-ui-inverse-font-color0);\n background-color: var(--jp-info-color0);\n}\n\n/* Button "Warning" Styling */\n\n.jupyter-button.mod-warning {\n color: var(--jp-ui-inverse-font-color1);\n background-color: var(--jp-warn-color1);\n}\n\n.jupyter-button.mod-warning.mod-active {\n color: var(--jp-ui-inverse-font-color0);\n background-color: var(--jp-warn-color0);\n}\n\n.jupyter-button.mod-warning:active {\n color: var(--jp-ui-inverse-font-color0);\n background-color: var(--jp-warn-color0);\n}\n\n/* Button "Danger" Styling */\n\n.jupyter-button.mod-danger {\n color: var(--jp-ui-inverse-font-color1);\n background-color: var(--jp-error-color1);\n}\n\n.jupyter-button.mod-danger.mod-active {\n color: var(--jp-ui-inverse-font-color0);\n background-color: var(--jp-error-color0);\n}\n\n.jupyter-button.mod-danger:active {\n color: var(--jp-ui-inverse-font-color0);\n background-color: var(--jp-error-color0);\n}\n\n/* Widget Button, Widget Toggle Button, Widget Upload */\n\n/* */\n.widget-button, /* */\n/* */ .widget-toggle-button, /* */\n/* */ .widget-upload, /* */\n.jupyter-widget-button,\n.jupyter-widget-toggle-button,\n.jupyter-widget-upload {\n width: var(--jp-widgets-inline-width-short);\n}\n\n/* Widget Label Styling */\n\n/* Override Bootstrap label css */\n.jupyter-widgets label {\n margin-bottom: initial;\n}\n\n/* */\n.widget-label-basic, /* */\n.jupyter-widget-label-basic {\n /* Basic Label */\n color: var(--jp-widgets-label-color);\n font-size: var(--jp-widgets-font-size);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n line-height: var(--jp-widgets-inline-height);\n}\n\n/* */\n.widget-label, /* */\n.jupyter-widget-label {\n /* Label */\n color: var(--jp-widgets-label-color);\n font-size: var(--jp-widgets-font-size);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n line-height: var(--jp-widgets-inline-height);\n}\n\n/* */\n.widget-inline-hbox .widget-label, /* */\n.jupyter-widget-inline-hbox .jupyter-widget-label {\n /* Horizontal Widget Label */\n color: var(--jp-widgets-label-color);\n text-align: right;\n margin-right: calc(var(--jp-widgets-inline-margin) * 2);\n width: var(--jp-widgets-inline-label-width);\n flex-shrink: 0;\n}\n\n/* */\n.widget-inline-vbox .widget-label, /* */\n.jupyter-widget-inline-vbox .jupyter-widget-label {\n /* Vertical Widget Label */\n color: var(--jp-widgets-label-color);\n text-align: center;\n line-height: var(--jp-widgets-inline-height);\n}\n\n/* Widget Readout Styling */\n\n/* */\n.widget-readout, /* */\n.jupyter-widget-readout {\n color: var(--jp-widgets-readout-color);\n font-size: var(--jp-widgets-font-size);\n height: var(--jp-widgets-inline-height);\n line-height: var(--jp-widgets-inline-height);\n overflow: hidden;\n white-space: nowrap;\n text-align: center;\n}\n\n/* */\n.widget-readout.overflow, /* */\n.jupyter-widget-readout.overflow {\n /* Overflowing Readout */\n\n /* From Material Design Lite\n shadow-key-umbra-opacity: 0.2;\n shadow-key-penumbra-opacity: 0.14;\n shadow-ambient-shadow-opacity: 0.12;\n */\n -webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2),\n 0 3px 1px -2px rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12);\n\n -moz-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2),\n 0 3px 1px -2px rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12);\n\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2), 0 3px 1px -2px rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\n}\n\n/* */\n.widget-inline-hbox .widget-readout, /* */\n.jupyter-widget-inline-hbox .jupyter-widget-readout {\n /* Horizontal Readout */\n text-align: center;\n max-width: var(--jp-widgets-inline-width-short);\n min-width: var(--jp-widgets-inline-width-tiny);\n margin-left: var(--jp-widgets-inline-margin);\n}\n\n/* */\n.widget-inline-vbox .widget-readout, /* */\n.jupyter-widget-inline-vbox .jupyter-widget-readout {\n /* Vertical Readout */\n margin-top: var(--jp-widgets-inline-margin);\n /* as wide as the widget */\n width: inherit;\n}\n\n/* Widget Checkbox Styling */\n\n/* */\n.widget-checkbox, /* */\n.jupyter-widget-checkbox {\n width: var(--jp-widgets-inline-width);\n height: var(--jp-widgets-inline-height);\n line-height: var(--jp-widgets-inline-height);\n}\n\n/* */\n.widget-checkbox input[type='checkbox'], /* */\n.jupyter-widget-checkbox input[type='checkbox'] {\n margin: 0px calc(var(--jp-widgets-inline-margin) * 2) 0px 0px;\n line-height: var(--jp-widgets-inline-height);\n font-size: large;\n flex-grow: 1;\n flex-shrink: 0;\n align-self: center;\n}\n\n/* Widget Valid Styling */\n\n/* */\n.widget-valid, /* */\n.jupyter-widget-valid {\n height: var(--jp-widgets-inline-height);\n line-height: var(--jp-widgets-inline-height);\n width: var(--jp-widgets-inline-width-short);\n font-size: var(--jp-widgets-font-size);\n}\n\n/* */\n.widget-valid i, /* */\n.jupyter-widget-valid i {\n line-height: var(--jp-widgets-inline-height);\n margin-right: var(--jp-widgets-inline-margin);\n margin-left: var(--jp-widgets-inline-margin);\n}\n\n/* */\n.widget-valid.mod-valid i, /* */\n.jupyter-widget-valid.mod-valid i {\n color: green;\n}\n\n/* */\n.widget-valid.mod-invalid i, /* */\n.jupyter-widget-valid.mod-invalid i {\n color: red;\n}\n\n/* */\n.widget-valid.mod-valid .widget-valid-readout, /* */\n.jupyter-widget-valid.mod-valid .jupyter-widget-valid-readout {\n display: none;\n}\n\n/* Widget Text and TextArea Styling */\n\n/* */\n.widget-textarea, /* */\n/* */ .widget-text, /* */\n.jupyter-widget-textarea,\n.jupyter-widget-text {\n width: var(--jp-widgets-inline-width);\n}\n\n/* */\n.widget-text input[type='text'], /* */\n/* */ .widget-text input[type='number'], /* */\n/* */ .widget-text input[type='password'], /* */\n.jupyter-widget-text input[type='text'],\n.jupyter-widget-text input[type='number'],\n.jupyter-widget-text input[type='password'] {\n height: var(--jp-widgets-inline-height);\n}\n\n/* */\n.widget-text input[type='text']:disabled, /* */\n/* */ .widget-text input[type='number']:disabled, /* */\n/* */ .widget-text input[type='password']:disabled, /* */\n/* */ .widget-textarea textarea:disabled, /* */\n.jupyter-widget-text input[type='text']:disabled,\n.jupyter-widget-text input[type='number']:disabled,\n.jupyter-widget-text input[type='password']:disabled,\n.jupyter-widget-textarea textarea:disabled {\n opacity: var(--jp-widgets-disabled-opacity);\n}\n\n/* */\n.widget-text input[type='text'], /* */\n/* */ .widget-text input[type='number'], /* */\n/* */ .widget-text input[type='password'], /* */\n/* */ .widget-textarea textarea, /* */\n.jupyter-widget-text input[type='text'],\n.jupyter-widget-text input[type='number'],\n.jupyter-widget-text input[type='password'],\n.jupyter-widget-textarea textarea {\n box-sizing: border-box;\n border: var(--jp-widgets-input-border-width) solid\n var(--jp-widgets-input-border-color);\n background-color: var(--jp-widgets-input-background-color);\n color: var(--jp-widgets-input-color);\n font-size: var(--jp-widgets-font-size);\n flex-grow: 1;\n min-width: 0; /* This makes it possible for the flexbox to shrink this input */\n flex-shrink: 1;\n outline: none !important;\n}\n\n/* */\n.widget-text input[type='text'], /* */\n/* */ .widget-text input[type='password'], /* */\n/* */ .widget-textarea textarea, /* */\n.jupyter-widget-text input[type='text'],\n.jupyter-widget-text input[type='password'],\n.jupyter-widget-textarea textarea {\n padding: var(--jp-widgets-input-padding)\n calc(var(--jp-widgets-input-padding) * 2);\n}\n\n/* */\n.widget-text input[type='number'], /* */\n.jupyter-widget-text input[type='number'] {\n padding: var(--jp-widgets-input-padding) 0 var(--jp-widgets-input-padding)\n calc(var(--jp-widgets-input-padding) * 2);\n}\n\n/* */\n.widget-textarea textarea, /* */\n.jupyter-widget-textarea textarea {\n height: inherit;\n width: inherit;\n}\n\n/* */\n.widget-text input:focus, /* */\n/* */ .widget-textarea textarea:focus, /* */\n.jupyter-widget-text input:focus,\n.jupyter-widget-textarea textarea:focus {\n border-color: var(--jp-widgets-input-focus-border-color);\n}\n\n/* Horizontal Slider */\n/* */\n.widget-hslider, /* */\n.jupyter-widget-hslider {\n width: var(--jp-widgets-inline-width);\n height: var(--jp-widgets-inline-height);\n line-height: var(--jp-widgets-inline-height);\n\n /* Override the align-items baseline. This way, the description and readout\n still seem to align their baseline properly, and we don't have to have\n align-self: stretch in the .slider-container. */\n align-items: center;\n}\n\n/* */\n.widgets-slider .slider-container, /* */\n.jupyter-widgets-slider .slider-container {\n overflow: visible;\n}\n\n/* */\n.widget-hslider .slider-container, /* */\n.jupyter-widget-hslider .slider-container {\n margin-left: calc(\n var(--jp-widgets-slider-handle-size) / 2 - 2 *\n var(--jp-widgets-slider-border-width)\n );\n margin-right: calc(\n var(--jp-widgets-slider-handle-size) / 2 - 2 *\n var(--jp-widgets-slider-border-width)\n );\n flex: 1 1 var(--jp-widgets-inline-width-short);\n}\n\n/* Vertical Slider */\n\n/* */\n.widget-vbox .widget-label, /* */\n.jupyter-widget-vbox .jupyter-widget-label {\n height: var(--jp-widgets-inline-height);\n line-height: var(--jp-widgets-inline-height);\n}\n\n/* */\n.widget-vslider, /* */\n.jupyter-widget-vslider {\n /* Vertical Slider */\n height: var(--jp-widgets-vertical-height);\n width: var(--jp-widgets-inline-width-tiny);\n}\n\n/* */\n.widget-vslider .slider-container, /* */\n.jupyter-widget-vslider .slider-container {\n flex: 1 1 var(--jp-widgets-inline-width-short);\n margin-left: auto;\n margin-right: auto;\n margin-bottom: calc(\n var(--jp-widgets-slider-handle-size) / 2 - 2 *\n var(--jp-widgets-slider-border-width)\n );\n margin-top: calc(\n var(--jp-widgets-slider-handle-size) / 2 - 2 *\n var(--jp-widgets-slider-border-width)\n );\n display: flex;\n flex-direction: column;\n}\n\n/* Widget Progress Styling */\n\n.progress-bar {\n -webkit-transition: none;\n -moz-transition: none;\n -ms-transition: none;\n -o-transition: none;\n transition: none;\n}\n\n.progress-bar {\n height: var(--jp-widgets-inline-height);\n}\n\n.progress-bar {\n background-color: var(--jp-brand-color1);\n}\n\n.progress-bar-success {\n background-color: var(--jp-success-color1);\n}\n\n.progress-bar-info {\n background-color: var(--jp-info-color1);\n}\n\n.progress-bar-warning {\n background-color: var(--jp-warn-color1);\n}\n\n.progress-bar-danger {\n background-color: var(--jp-error-color1);\n}\n\n.progress {\n background-color: var(--jp-layout-color2);\n border: none;\n box-shadow: none;\n}\n\n/* Horisontal Progress */\n\n/* */\n.widget-hprogress, /* */\n.jupyter-widget-hprogress {\n /* Progress Bar */\n height: var(--jp-widgets-inline-height);\n line-height: var(--jp-widgets-inline-height);\n width: var(--jp-widgets-inline-width);\n align-items: center;\n}\n\n/* */\n.widget-hprogress .progress, /* */\n.jupyter-widget-hprogress .progress {\n flex-grow: 1;\n margin-top: var(--jp-widgets-input-padding);\n margin-bottom: var(--jp-widgets-input-padding);\n align-self: stretch;\n /* Override bootstrap style */\n height: initial;\n}\n\n/* Vertical Progress */\n\n/* */\n.widget-vprogress, /* */\n.jupyter-widget-vprogress {\n height: var(--jp-widgets-vertical-height);\n width: var(--jp-widgets-inline-width-tiny);\n}\n\n/* */\n.widget-vprogress .progress, /* */\n.jupyter-widget-vprogress .progress {\n flex-grow: 1;\n width: var(--jp-widgets-progress-thickness);\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 0;\n}\n\n/* Select Widget Styling */\n\n/* */\n.widget-dropdown, /* */\n.jupyter-widget-dropdown {\n height: var(--jp-widgets-inline-height);\n width: var(--jp-widgets-inline-width);\n line-height: var(--jp-widgets-inline-height);\n}\n\n/* */\n.widget-dropdown > select, /* */\n.jupyter-widget-dropdown > select {\n padding-right: 20px;\n border: var(--jp-widgets-input-border-width) solid\n var(--jp-widgets-input-border-color);\n border-radius: 0;\n height: inherit;\n flex: 1 1 var(--jp-widgets-inline-width-short);\n min-width: 0; /* This makes it possible for the flexbox to shrink this input */\n box-sizing: border-box;\n outline: none !important;\n box-shadow: none;\n background-color: var(--jp-widgets-input-background-color);\n color: var(--jp-widgets-input-color);\n font-size: var(--jp-widgets-font-size);\n vertical-align: top;\n padding-left: calc(var(--jp-widgets-input-padding) * 2);\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n background-repeat: no-repeat;\n background-size: 20px;\n background-position: right center;\n background-image: var(--jp-widgets-dropdown-arrow);\n}\n/* */\n.widget-dropdown > select:focus, /* */\n.jupyter-widget-dropdown > select:focus {\n border-color: var(--jp-widgets-input-focus-border-color);\n}\n\n/* */\n.widget-dropdown > select:disabled, /* */\n.jupyter-widget-dropdown > select:disabled {\n opacity: var(--jp-widgets-disabled-opacity);\n}\n\n/* To disable the dotted border in Firefox around select controls.\n See http://stackoverflow.com/a/18853002 */\n/* */\n.widget-dropdown > select:-moz-focusring, /* */\n.jupyter-widget-dropdown > select:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 #000;\n}\n\n/* Select and SelectMultiple */\n\n/* */\n.widget-select, /* */\n.jupyter-widget-select {\n width: var(--jp-widgets-inline-width);\n line-height: var(--jp-widgets-inline-height);\n\n /* Because Firefox defines the baseline of a select as the bottom of the\n control, we align the entire control to the top and add padding to the\n select to get an approximate first line baseline alignment. */\n align-items: flex-start;\n}\n\n/* */\n.widget-select > select, /* */\n.jupyter-widget-select > select {\n border: var(--jp-widgets-input-border-width) solid\n var(--jp-widgets-input-border-color);\n background-color: var(--jp-widgets-input-background-color);\n color: var(--jp-widgets-input-color);\n font-size: var(--jp-widgets-font-size);\n flex: 1 1 var(--jp-widgets-inline-width-short);\n outline: none !important;\n overflow: auto;\n height: inherit;\n\n /* Because Firefox defines the baseline of a select as the bottom of the\n control, we align the entire control to the top and add padding to the\n select to get an approximate first line baseline alignment. */\n padding-top: 5px;\n}\n\n/* */\n.widget-select > select:focus, /* */\n.jupyter-widget-select > select:focus {\n border-color: var(--jp-widgets-input-focus-border-color);\n}\n\n.wiget-select > select > option,\n.jupyter-wiget-select > select > option {\n padding-left: var(--jp-widgets-input-padding);\n line-height: var(--jp-widgets-inline-height);\n /* line-height doesn't work on some browsers for select options */\n padding-top: calc(\n var(--jp-widgets-inline-height) - var(--jp-widgets-font-size) / 2\n );\n padding-bottom: calc(\n var(--jp-widgets-inline-height) - var(--jp-widgets-font-size) / 2\n );\n}\n\n/* Toggle Buttons Styling */\n\n/* */\n.widget-toggle-buttons, /* */\n.jupyter-widget-toggle-buttons {\n line-height: var(--jp-widgets-inline-height);\n}\n\n/* */\n.widget-toggle-buttons .widget-toggle-button, /* */\n.jupyter-widget-toggle-buttons .jupyter-widget-toggle-button {\n margin-left: var(--jp-widgets-margin);\n margin-right: var(--jp-widgets-margin);\n}\n\n/* */\n.widget-toggle-buttons .jupyter-button:disabled, /* */\n.jupyter-widget-toggle-buttons .jupyter-button:disabled {\n opacity: var(--jp-widgets-disabled-opacity);\n}\n\n/* Radio Buttons Styling */\n\n/* */\n.widget-radio, /* */\n.jupyter-widget-radio {\n width: var(--jp-widgets-inline-width);\n line-height: var(--jp-widgets-inline-height);\n}\n\n/* */\n.widget-radio-box, /* */\n.jupyter-widget-radio-box {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n box-sizing: border-box;\n flex-grow: 1;\n margin-bottom: var(--jp-widgets-radio-item-height-adjustment);\n}\n\n/* */\n.widget-radio-box-vertical, /* */\n.jupyter-widget-radio-box-vertical {\n flex-direction: column;\n}\n\n/* */\n.widget-radio-box-horizontal, /* */\n.jupyter-widget-radio-box-horizontal {\n flex-direction: row;\n}\n\n/* */\n.widget-radio-box label, /* */\n.jupyter-widget-radio-box label {\n height: var(--jp-widgets-radio-item-height);\n line-height: var(--jp-widgets-radio-item-height);\n font-size: var(--jp-widgets-font-size);\n}\n\n.widget-radio-box-horizontal label,\n.jupyter-widget-radio-box-horizontal label {\n margin: 0 calc(var(--jp-widgets-input-padding) * 2) 0 0;\n}\n\n/* */\n.widget-radio-box input, /* */\n.jupyter-widget-radio-box input {\n height: var(--jp-widgets-radio-item-height);\n line-height: var(--jp-widgets-radio-item-height);\n margin: 0 calc(var(--jp-widgets-input-padding) * 2) 0 1px;\n float: left;\n}\n\n/* Color Picker Styling */\n\n/* */\n.widget-colorpicker, /* */\n.jupyter-widget-colorpicker {\n width: var(--jp-widgets-inline-width);\n height: var(--jp-widgets-inline-height);\n line-height: var(--jp-widgets-inline-height);\n}\n\n/* */\n.widget-colorpicker > .widget-colorpicker-input, /* */\n.jupyter-widget-colorpicker > .jupyter-widget-colorpicker-input {\n flex-grow: 1;\n flex-shrink: 1;\n min-width: var(--jp-widgets-inline-width-tiny);\n}\n\n/* */\n.widget-colorpicker input[type='color'], /* */\n.jupyter-widget-colorpicker input[type='color'] {\n width: var(--jp-widgets-inline-height);\n height: var(--jp-widgets-inline-height);\n padding: 0 2px; /* make the color square actually square on Chrome on OS X */\n background: var(--jp-widgets-input-background-color);\n color: var(--jp-widgets-input-color);\n border: var(--jp-widgets-input-border-width) solid\n var(--jp-widgets-input-border-color);\n border-left: none;\n flex-grow: 0;\n flex-shrink: 0;\n box-sizing: border-box;\n align-self: stretch;\n outline: none !important;\n}\n\n/* */\n.widget-colorpicker.concise input[type='color'], /* */\n.jupyter-widget-colorpicker.concise input[type='color'] {\n border-left: var(--jp-widgets-input-border-width) solid\n var(--jp-widgets-input-border-color);\n}\n\n/* */\n.widget-colorpicker input[type='color']:focus, /* */\n/* */ .widget-colorpicker input[type='text']:focus, /* */\n.jupyter-widget-colorpicker input[type='color']:focus,\n.jupyter-widget-colorpicker input[type='text']:focus {\n border-color: var(--jp-widgets-input-focus-border-color);\n}\n\n/* */\n.widget-colorpicker input[type='text'], /* */\n.jupyter-widget-colorpicker input[type='text'] {\n flex-grow: 1;\n outline: none !important;\n height: var(--jp-widgets-inline-height);\n line-height: var(--jp-widgets-inline-height);\n background: var(--jp-widgets-input-background-color);\n color: var(--jp-widgets-input-color);\n border: var(--jp-widgets-input-border-width) solid\n var(--jp-widgets-input-border-color);\n font-size: var(--jp-widgets-font-size);\n padding: var(--jp-widgets-input-padding)\n calc(var(--jp-widgets-input-padding) * 2);\n min-width: 0; /* This makes it possible for the flexbox to shrink this input */\n flex-shrink: 1;\n box-sizing: border-box;\n}\n\n/* */\n.widget-colorpicker input[type='text']:disabled, /* */\n.jupyter-widget-colorpicker input[type='text']:disabled {\n opacity: var(--jp-widgets-disabled-opacity);\n}\n\n/* Date Picker Styling */\n\n/* */\n.widget-datepicker, /* */\n.jupyter-widget-datepicker {\n width: var(--jp-widgets-inline-width);\n height: var(--jp-widgets-inline-height);\n line-height: var(--jp-widgets-inline-height);\n}\n\n/* */\n.widget-datepicker input[type='date'], /* */\n.jupyter-widget-datepicker input[type='date'] {\n flex-grow: 1;\n flex-shrink: 1;\n min-width: 0; /* This makes it possible for the flexbox to shrink this input */\n outline: none !important;\n height: var(--jp-widgets-inline-height);\n border: var(--jp-widgets-input-border-width) solid\n var(--jp-widgets-input-border-color);\n background-color: var(--jp-widgets-input-background-color);\n color: var(--jp-widgets-input-color);\n font-size: var(--jp-widgets-font-size);\n padding: var(--jp-widgets-input-padding)\n calc(var(--jp-widgets-input-padding) * 2);\n box-sizing: border-box;\n}\n\n/* */\n.widget-datepicker input[type='date']:focus, /* */\n.jupyter-widget-datepicker input[type='date']:focus {\n border-color: var(--jp-widgets-input-focus-border-color);\n}\n\n/* */\n.widget-datepicker input[type='date']:invalid, /* */\n.jupyter-widget-datepicker input[type='date']:invalid {\n border-color: var(--jp-warn-color1);\n}\n\n/* */\n.widget-datepicker input[type='date']:disabled, /* */\n.jupyter-widget-datepicker input[type='date']:disabled {\n opacity: var(--jp-widgets-disabled-opacity);\n}\n\n/* Play Widget */\n\n/* */\n.widget-play, /* */\n.jupyter-widget-play {\n width: var(--jp-widgets-inline-width-short);\n display: flex;\n align-items: stretch;\n}\n\n/* */\n.widget-play .jupyter-button, /* */\n.jupyter-widget-play .jupyter-button {\n flex-grow: 1;\n height: auto;\n}\n\n/* */\n.widget-play .jupyter-button:disabled, /* */\n.jupyter-widget-play .jupyter-button:disabled {\n opacity: var(--jp-widgets-disabled-opacity);\n}\n\n/* Tab Widget */\n\n/* */\n.jupyter-widgets.widget-tab, /* */\n.jupyter-widgets.jupyter-widget-tab {\n display: flex;\n flex-direction: column;\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar, /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar {\n /* Necessary so that a tab can be shifted down to overlay the border of the box below. */\n overflow-x: visible;\n overflow-y: visible;\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar > .p-TabBar-content, /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar > .p-TabBar-content, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar > .lm-TabBar-content {\n /* Make sure that the tab grows from bottom up */\n align-items: flex-end;\n min-width: 0;\n min-height: 0;\n}\n\n/* */\n.jupyter-widgets.widget-tab > .widget-tab-contents, /* */\n.jupyter-widgets.jupyter-widget-tab > .widget-tab-contents {\n width: 100%;\n box-sizing: border-box;\n margin: 0;\n background: var(--jp-layout-color1);\n color: var(--jp-ui-font-color1);\n border: var(--jp-border-width) solid var(--jp-border-color1);\n padding: var(--jp-widgets-container-padding);\n flex-grow: 1;\n overflow: auto;\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar, /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar {\n font: var(--jp-widgets-font-size) Helvetica, Arial, sans-serif;\n min-height: calc(\n var(--jp-widgets-horizontal-tab-height) + var(--jp-border-width)\n );\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tab, /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tab, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tab {\n flex: 0 1 var(--jp-widgets-horizontal-tab-width);\n min-width: 35px;\n min-height: calc(\n var(--jp-widgets-horizontal-tab-height) + var(--jp-border-width)\n );\n line-height: var(--jp-widgets-horizontal-tab-height);\n margin-left: calc(-1 * var(--jp-border-width));\n padding: 0px 10px;\n background: var(--jp-layout-color2);\n color: var(--jp-ui-font-color2);\n border: var(--jp-border-width) solid var(--jp-border-color1);\n border-bottom: none;\n position: relative;\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tab.p-mod-current, /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tab.p-mod-current, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tab.lm-mod-current {\n color: var(--jp-ui-font-color0);\n /* We want the background to match the tab content background */\n background: var(--jp-layout-color1);\n min-height: calc(\n var(--jp-widgets-horizontal-tab-height) + 2 * var(--jp-border-width)\n );\n transform: translateY(var(--jp-border-width));\n overflow: visible;\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tab.p-mod-current:before, /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tab.p-mod-current:before, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tab.lm-mod-current:before {\n position: absolute;\n top: calc(-1 * var(--jp-border-width));\n left: calc(-1 * var(--jp-border-width));\n content: '';\n height: var(--jp-widgets-horizontal-tab-top-border);\n width: calc(100% + 2 * var(--jp-border-width));\n background: var(--jp-brand-color1);\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tab:first-child, /* */\n/* */.jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tab:first-child, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tab:first-child {\n margin-left: 0;\n}\n\n/* */\n.jupyter-widgets.widget-tab\n > .p-TabBar\n .p-TabBar-tab:hover:not(.p-mod-current),\n/* */\n/* */\n.jupyter-widgets.jupyter-widget-tab\n > .p-TabBar\n .p-TabBar-tab:hover:not(.p-mod-current),\n/* */\n.jupyter-widgets.jupyter-widget-tab\n > .lm-TabBar\n .lm-TabBar-tab:hover:not(.lm-mod-current) {\n background: var(--jp-layout-color1);\n color: var(--jp-ui-font-color1);\n}\n\n/* */\n.jupyter-widgets.widget-tab\n > .p-TabBar\n .p-mod-closable\n > .p-TabBar-tabCloseIcon,\n/* */\n/* */\n.jupyter-widgets.jupyter-widget-tab\n> .p-TabBar\n.p-mod-closable\n> .p-TabBar-tabCloseIcon,\n/* */\n.jupyter-widgets.jupyter-widget-tab\n > .lm-TabBar\n .lm-mod-closable\n > .lm-TabBar-tabCloseIcon {\n margin-left: 4px;\n}\n\n/* This font-awesome strategy may not work across FA4 and FA5, but we don't\nactually support closable tabs, so it really doesn't matter */\n/* */\n.jupyter-widgets.widget-tab\n > .p-TabBar\n .p-mod-closable\n > .p-TabBar-tabCloseIcon:before,\n/* */\n/* */\n.jupyter-widgets.jupyter-widget-widget-tab\n> .p-TabBar\n.p-mod-closable\n> .p-TabBar-tabCloseIcon:before,\n/* */\n.jupyter-widgets.jupyter-widget-tab\n > .lm-TabBar\n .lm-mod-closable\n > .lm-TabBar-tabCloseIcon:before {\n font-family: FontAwesome;\n content: '\\f00d'; /* close */\n}\n\n/* */\n.jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tabIcon, /* */\n/* */ .jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tabLabel, /* */\n/* */ .jupyter-widgets.widget-tab > .p-TabBar .p-TabBar-tabCloseIcon, /* */\n/* */ .jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tabIcon, /* */\n/* */ .jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tabLabel, /* */\n/* */ .jupyter-widgets.jupyter-widget-tab > .p-TabBar .p-TabBar-tabCloseIcon, /* */\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tabIcon,\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tabLabel,\n.jupyter-widgets.jupyter-widget-tab > .lm-TabBar .lm-TabBar-tabCloseIcon {\n line-height: var(--jp-widgets-horizontal-tab-height);\n}\n\n/* Accordion Widget */\n\n.jupyter-widget-Collapse {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n}\n\n.jupyter-widget-Collapse-header {\n padding: var(--jp-widgets-input-padding);\n cursor: pointer;\n color: var(--jp-ui-font-color2);\n background-color: var(--jp-layout-color2);\n border: var(--jp-widgets-border-width) solid var(--jp-border-color1);\n padding: calc(var(--jp-widgets-container-padding) * 2 / 3)\n var(--jp-widgets-container-padding);\n font-weight: bold;\n}\n\n.jupyter-widget-Collapse-header:hover {\n background-color: var(--jp-layout-color1);\n color: var(--jp-ui-font-color1);\n}\n\n.jupyter-widget-Collapse-open > .jupyter-widget-Collapse-header {\n background-color: var(--jp-layout-color1);\n color: var(--jp-ui-font-color0);\n cursor: default;\n border-bottom: none;\n}\n\n.jupyter-widget-Collapse-contents {\n padding: var(--jp-widgets-container-padding);\n background-color: var(--jp-layout-color1);\n color: var(--jp-ui-font-color1);\n border-left: var(--jp-widgets-border-width) solid var(--jp-border-color1);\n border-right: var(--jp-widgets-border-width) solid var(--jp-border-color1);\n border-bottom: var(--jp-widgets-border-width) solid var(--jp-border-color1);\n overflow: auto;\n}\n\n.jupyter-widget-Accordion {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n}\n\n.jupyter-widget-Accordion .jupyter-widget-Collapse {\n margin-bottom: 0;\n}\n\n.jupyter-widget-Accordion .jupyter-widget-Collapse + .jupyter-widget-Collapse {\n margin-top: 4px;\n}\n\n/* HTML widget */\n\n/* */\n.widget-html, /* */\n/* */ .widget-htmlmath, /* */\n.jupyter-widget-html,\n.jupyter-widget-htmlmath {\n font-size: var(--jp-widgets-font-size);\n}\n\n/* */\n.widget-html > .widget-html-content, /* */\n/* */.widget-htmlmath > .widget-html-content, /* */\n.jupyter-widget-html > .jupyter-widget-html-content,\n.jupyter-widget-htmlmath > .jupyter-widget-html-content {\n /* Fill out the area in the HTML widget */\n align-self: stretch;\n flex-grow: 1;\n flex-shrink: 1;\n /* Makes sure the baseline is still aligned with other elements */\n line-height: var(--jp-widgets-inline-height);\n /* Make it possible to have absolutely-positioned elements in the html */\n position: relative;\n}\n\n/* Image widget */\n\n/* */\n.widget-image, /* */\n.jupyter-widget-image {\n max-width: 100%;\n height: auto;\n}\n`,""]);const w=c},9451:e=>{e.exports=function(e){var n=[];return n.toString=function(){return this.map((function(n){var t="",i=void 0!==n[5];return n[4]&&(t+="@supports (".concat(n[4],") {")),n[2]&&(t+="@media ".concat(n[2]," {")),i&&(t+="@layer".concat(n[5].length>0?" ".concat(n[5]):""," {")),t+=e(n),i&&(t+="}"),n[2]&&(t+="}"),n[4]&&(t+="}"),t})).join("")},n.i=function(e,t,i,r,o){"string"==typeof e&&(e=[[null,e,void 0]]);var a={};if(i)for(var d=0;d0?" ".concat(g[5]):""," {").concat(g[1],"}")),g[5]=o),t&&(g[2]?(g[1]="@media ".concat(g[2]," {").concat(g[1],"}"),g[2]=t):g[2]=t),r&&(g[4]?(g[1]="@supports (".concat(g[4],") {").concat(g[1],"}"),g[4]=r):g[4]="".concat(r)),n.push(g))}},n}},7298:e=>{e.exports=function(e,n){return n||(n={}),e?(e=String(e.__esModule?e.default:e),/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),n.hash&&(e+=n.hash),/["'() \t\n]|(%20)/.test(e)||n.needQuotes?'"'.concat(e.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):e):e}},4786:e=>{e.exports=function(e){return e[1]}},3699:e=>{var n=[];function t(e){for(var t=-1,i=0;i{var n={};e.exports=function(e,t){var i=function(e){if(void 0===n[e]){var t=document.querySelector(e);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(e){t=null}n[e]=t}return n[e]}(e);if(!i)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");i.appendChild(t)}},4999:e=>{e.exports=function(e){var n=document.createElement("style");return e.setAttributes(n,e.attributes),e.insert(n,e.options),n}},9443:(e,n,t)=>{e.exports=function(e){var n=t.nc;n&&e.setAttribute("nonce",n)}},376:e=>{e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var n=e.insertStyleElement(e);return{update:function(t){!function(e,n,t){var i="";t.supports&&(i+="@supports (".concat(t.supports,") {")),t.media&&(i+="@media ".concat(t.media," {"));var r=void 0!==t.layer;r&&(i+="@layer".concat(t.layer.length>0?" ".concat(t.layer):""," {")),i+=t.css,r&&(i+="}"),t.media&&(i+="}"),t.supports&&(i+="}");var o=t.sourceMap;o&&"undefined"!=typeof btoa&&(i+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),n.styleTagTransform(i,e,n.options)}(n,e,t)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)}}}},9252:e=>{e.exports=function(e,n){if(n.styleSheet)n.styleSheet.cssText=e;else{for(;n.firstChild;)n.removeChild(n.firstChild);n.appendChild(document.createTextNode(e))}}},8701:(e,n,t)=>{t.d(n,{A:()=>i});const i="2.0.0"},1446:(e,n,t)=>{t.r(n),t.d(n,{KernelWidgetManager:()=>T,LabWidgetManager:()=>v,WidgetManager:()=>f,WidgetRenderer:()=>w,default:()=>ce,output:()=>i,registerWidgetManager:()=>te});var i={};t.r(i),t.d(i,{OUTPUT_WIDGET_VERSION:()=>P,OutputModel:()=>U,OutputView:()=>k});var r=t(8612),o=t(1378),a=t(4970),d=t(9895),s=t(1113),l=t(632),g=t(4053),p=t(9012),c=t(7262),u=t(5256);class w extends u.Panel{constructor(e,n){super(),this._manager=new c.PromiseDelegate,this._rerenderMimeModel=null,this.mimeType=e.mimeType,n&&(this.manager=n)}set manager(e){e.restored.connect(this._rerender,this),this._manager.resolve(e)}async renderModel(e){const n=e.data[this.mimeType];this.node.textContent="Loading widget...";const t=await this._manager.promise;if(""===n.model_id)return this.hide(),Promise.resolve();let i,r;try{i=await t.get_model(n.model_id)}catch(n){return t.restoredStatus?(this.node.textContent="Error displaying widget: model not found",this.addClass("jupyter-widgets"),void console.error(n)):void(this._rerenderMimeModel=e)}this._rerenderMimeModel=null;try{const e=await t.create_view(i);r=e.luminoWidget||e.pWidget}catch(e){return this.node.textContent="Error displaying widget",this.addClass("jupyter-widgets"),void console.error(e)}this.node.textContent="",this.addWidget(r),r.disposed.connect((()=>{this.hide(),n.model_id=""}))}dispose(){this.isDisposed||(this._manager=null,super.dispose())}_rerender(){this._rerenderMimeModel&&(this.node.textContent="",this.removeClass("jupyter-widgets"),this.renderModel(this._rerenderMimeModel))}}var h=t(7401),E=t(8875),b=t(4602),j=t(4585);class y{constructor(){this._cache=Object.create(null)}set(e,n,t){if(e in this._cache||(this._cache[e]=Object.create(null)),n in this._cache[e])throw`Version ${n} of key ${e} already registered.`;this._cache[e][n]=t}get(e,n){if(e in this._cache){const t=this._cache[e],i=(0,j.maxSatisfying)(Object.keys(t),n);if(null!==i)return t[i]}}getAllVersions(e){if(e in this._cache)return this._cache[e]}}const m="application/vnd.jupyter.widget-view+json",D="application/vnd.jupyter.widget-state+json";class v extends E.ManagerBase{constructor(e){super(),this._handleCommOpen=async(e,n)=>{const t=new h.shims.services.Comm(e);await this.handle_comm_open(t,n)},this._restored=new b.Signal(this),this._restoredStatus=!1,this._kernelRestoreInProgress=!1,this._isDisposed=!1,this._registry=new y,this._modelsSync=new Map,this._onUnhandledIOPubMessage=new b.Signal(this),this._rendermime=e}callbacks(e){return{iopub:{output:e=>{this._onUnhandledIOPubMessage.emit(e)}}}}_handleKernelChanged({oldValue:e,newValue:n}){e&&e.removeCommTarget(this.comm_target_name,this._handleCommOpen),n&&n.registerCommTarget(this.comm_target_name,this._handleCommOpen)}disconnect(){super.disconnect(),this._restoredStatus=!1}async _loadFromKernel(){var e;if(!this.kernel)throw new Error("Kernel not set");if(!1!==(null===(e=this.kernel)||void 0===e?void 0:e.handleComms))return super._loadFromKernel()}async _create_comm(e,n,t,i,r){const o=this.kernel;if(!o)throw new Error("No current kernel");const a=o.createComm(e,n);return(t||i)&&a.open(t,i,r),new h.shims.services.Comm(a)}async _get_comm_info(){const e=this.kernel;if(!e)throw new Error("No current kernel");const n=await e.requestCommInfo({target_name:this.comm_target_name});return"ok"===n.content.status?n.content.comms:{}}get isDisposed(){return this._isDisposed}dispose(){this.isDisposed||(this._isDisposed=!0,this._commRegistration&&this._commRegistration.dispose())}async resolveUrl(e){return e}async loadClass(e,n,t){"@jupyter-widgets/base"!==n&&"@jupyter-widgets/controls"!==n||!(0,j.valid)(t)||(t=`^${t}`);const i=this._registry.getAllVersions(n);if(!i)throw new Error(`No version of module ${n} is registered`);const r=this._registry.get(n,t);if(!r){const e=Object.keys(i);throw new Error(`Module ${n}, version ${t} is not registered, however, ${e.join(",")} ${e.length>1?"are":"is"}`)}let o;o="function"==typeof r?await r():await r;const a=o[e];if(!a)throw new Error(`Class ${e} not found in module ${n}`);return a}get rendermime(){return this._rendermime}get restored(){return this._restored}get restoredStatus(){return this._restoredStatus}get onUnhandledIOPubMessage(){return this._onUnhandledIOPubMessage}register(e){this._registry.set(e.name,e.version,e.exports)}register_model(e,n){super.register_model(e,n),n.then((n=>{this._modelsSync.set(e,n),n.once("comm:close",(()=>{this._modelsSync.delete(e)}))}))}async clear_state(){await super.clear_state(),this._modelsSync=new Map}get_state_sync(e={}){const n=[];for(const e of this._modelsSync.values())e.comm_live&&n.push(e);return(0,E.serialize_state)(n,e)}}class T extends v{constructor(e,n){super(n),this._kernel=e,e.statusChanged.connect(((e,n)=>{this._handleKernelStatusChange(n)})),e.connectionStatusChanged.connect(((e,n)=>{this._handleKernelConnectionStatusChange(n)})),this._handleKernelChanged({name:"kernel",oldValue:null,newValue:e}),this.restoreWidgets()}_handleKernelConnectionStatusChange(e){"connected"===e&&(this._kernelRestoreInProgress||this.restoreWidgets())}_handleKernelStatusChange(e){"restarting"===e&&this.disconnect()}async restoreWidgets(){try{this._kernelRestoreInProgress=!0,await this._loadFromKernel(),this._restoredStatus=!0,this._restored.emit()}catch(e){}this._kernelRestoreInProgress=!1}dispose(){this.isDisposed||(this._kernel=null,super.dispose())}get kernel(){return this._kernel}}class f extends v{constructor(e,n,t){var i,r;super(n),this._context=e,e.sessionContext.kernelChanged.connect(((e,n)=>{this._handleKernelChanged(n)})),e.sessionContext.statusChanged.connect(((e,n)=>{this._handleKernelStatusChange(n)})),e.sessionContext.connectionStatusChanged.connect(((e,n)=>{this._handleKernelConnectionStatusChange(n)})),(null===(i=e.sessionContext.session)||void 0===i?void 0:i.kernel)&&this._handleKernelChanged({name:"kernel",oldValue:null,newValue:null===(r=e.sessionContext.session)||void 0===r?void 0:r.kernel}),this.restoreWidgets(this._context.model),this._settings=t,e.saveState.connect(((e,n)=>{"started"===n&&t.saveState&&this._saveState()}))}_saveState(){const e=this.get_state_sync({drop_defaults:!0});this._context.model.setMetadata?this._context.model.setMetadata("widgets",{"application/vnd.jupyter.widget-state+json":e}):this._context.model.metadata.set("widgets",{"application/vnd.jupyter.widget-state+json":e})}_handleKernelConnectionStatusChange(e){"connected"===e&&(this._kernelRestoreInProgress||this.restoreWidgets(this._context.model,{loadKernel:!0,loadNotebook:!1}))}_handleKernelStatusChange(e){"restarting"===e&&this.disconnect()}async restoreWidgets(e,{loadKernel:n,loadNotebook:t}={loadKernel:!0,loadNotebook:!0}){try{if(await this.context.sessionContext.ready,n)try{this._kernelRestoreInProgress=!0,await this._loadFromKernel()}finally{this._kernelRestoreInProgress=!1}t&&await this._loadFromNotebook(e),this._restoredStatus=!0,this._restored.emit()}catch(e){}}async _loadFromNotebook(e){const n=e.getMetadata?e.getMetadata("widgets"):e.metadata.get("widgets");if(n&&n[D]){let e=n[D];e=this.filterExistingModelState(e),await this.set_state(e)}}dispose(){this.isDisposed||(this._context=null,super.dispose())}async resolveUrl(e){const n=await this.context.urlResolver.resolveUrl(e);return this.context.urlResolver.getDownloadUrl(n)}get context(){return this._context}get kernel(){var e,n,t;return null!==(t=null===(n=null===(e=this._context.sessionContext)||void 0===e?void 0:e.session)||void 0===n?void 0:n.kernel)&&void 0!==t?t:null}register_model(e,n){super.register_model(e,n),this.setDirty()}async clear_state(){await super.clear_state(),this.setDirty()}setDirty(){this._settings.saveState&&(this._context.model.dirty=!0)}}var x=t(1489),C=t(7860),R=t(8596),A=t.n(R);const P=x.OUTPUT_WIDGET_VERSION;class U extends x.OutputModel{defaults(){return Object.assign(Object.assign({},super.defaults()),{msg_id:"",outputs:[]})}initialize(e,n){super.initialize(e,n),this._outputs=new C.OutputAreaModel({trusted:!0}),this._msgHook=e=>(this.add(e),!1),this.widget_manager instanceof f&&this.widget_manager.context.sessionContext.kernelChanged.connect(((e,n)=>{this._handleKernelChanged(n)})),this.listenTo(this,"change:msg_id",this.reset_msg_id),this.listenTo(this,"change:outputs",this.setOutputs),this.setOutputs()}_handleKernelChanged({oldValue:e}){const n=this.get("msg_id");n&&e&&(e.removeMessageHook(n,this._msgHook),this.set("msg_id",null))}reset_msg_id(){const e=this.widget_manager.kernel,n=this.get("msg_id"),t=this.previous("msg_id");t&&e&&e.removeMessageHook(t,this._msgHook),n&&e&&e.registerMessageHook(n,this._msgHook)}add(e){const n=e.header.msg_type;switch(n){case"execute_result":case"display_data":case"stream":case"error":{const t=e.content;t.output_type=n,this._outputs.add(t);break}case"clear_output":this.clear_output(e.content.wait)}this.set("outputs",this._outputs.toJSON(),{newMessage:!0}),this.save_changes()}clear_output(e=!1){this._outputs.clear(e)}get outputs(){return this._outputs}setOutputs(e,n,t){t&&t.newMessage||(this.clear_output(),this._outputs.fromJSON(JSON.parse(JSON.stringify(this.get("outputs")))))}}class k extends x.OutputView{_createElement(e){return this.luminoWidget=new h.JupyterLuminoPanelWidget({view:this}),this.luminoWidget.node}_setElement(e){if(this.el||e!==this.luminoWidget.node)throw new Error("Cannot reset the DOM element.");this.el=this.luminoWidget.node,this.$el=A()(this.luminoWidget.node)}render(){super.render(),this._outputView=new C.OutputArea({rendermime:this.model.widget_manager.rendermime,contentFactory:C.OutputArea.defaultContentFactory,model:this.model.outputs}),this.luminoWidget.insertWidget(0,this._outputView),this.luminoWidget.addClass("jupyter-widgets"),this.luminoWidget.addClass("widget-output"),this.update()}remove(){return this._outputView.dispose(),super.remove()}}var I=t(8701),S=t(3699),B=t.n(S),O=t(376),_=t.n(O),z=t(1412),N=t.n(z),M=t(9443),L=t.n(M),W=t(4999),H=t.n(W),F=t(9252),V=t.n(F),G=t(1556),Y={};Y.styleTagTransform=V(),Y.setAttributes=L(),Y.insert=N().bind(null,"head"),Y.domAPI=_(),Y.insertStyleElement=H(),B()(G.A,Y),G.A&&G.A.locals&&G.A.locals;var K=t(7654),J={};J.styleTagTransform=V(),J.setAttributes=L(),J.insert=N().bind(null,"head"),J.domAPI=_(),J.insertStyleElement=H(),B()(K.A,J),K.A&&K.A.locals&&K.A.locals;var Z=t(7144),$=t(5828);const X=new class{constructor(){this._widgetRegistered=new b.Signal(this),this._registry=[]}get widgets(){return[...this._registry]}push(e){this._registry.push(e),this._widgetRegistered.emit(e)}get widgetRegistered(){return this._widgetRegistered}},q={saveState:!1};function*Q(...e){for(const n of e)yield*n}async function ee(e){return await e.ready,e.session.kernel.id}async function ne(e,n,t,i,r){const o=await ee(n);let a,d=pe.widgetManagerProperty.get(o);d||(d=r(),X.widgets.forEach((e=>d.register(e))),X.widgetRegistered.connect(((e,n)=>{d.register(n)})),pe.widgetManagerProperty.set(o,d),a=o,e.disposed.connect((e=>{pe.widgetManagerProperty.get(a)&&pe.widgetManagerProperty.delete(a)})),n.kernelChanged.connect(((e,n)=>{const{newValue:t}=n;if(t){const e=t.id,n=pe.widgetManagerProperty.get(a);n&&(pe.widgetManagerProperty.delete(a),pe.widgetManagerProperty.set(e,n)),a=e}})));for(const e of i)e.manager=d;return t.removeMimeType(m),t.addFactory({safe:!1,mimeTypes:[m],createRenderer:e=>new w(e,d)},-10),new p.DisposableDelegate((()=>{t&&t.removeMimeType(m),d.dispose()}))}function te(e,n,t){let i;const r=ee(e.sessionContext).then((r=>{const o=pe.widgetManagerProperty.get(r);o?i=o:(i=new f(e,n,q),X.widgets.forEach((e=>i.register(e))),X.widgetRegistered.connect(((e,n)=>{i.register(n)})),pe.widgetManagerProperty.set(r,i));for(const e of t)e.manager=i;n.removeMimeType(m),n.addFactory({safe:!1,mimeTypes:[m],createRenderer:e=>new w(e,i)},-10)}));return new p.DisposableDelegate((async()=>{await r,n&&n.removeMimeType(m),i.dispose()}))}async function ie(e,n){const t=e.content,i=e.context,r=i.sessionContext,o=t.rendermime;return ne(t,r,o,n,(()=>new f(i,o,q)))}async function re(e,n){const t=e.console,i=t.sessionContext,r=t.rendermime;return ne(t,i,r,n,(()=>new T(i.session.kernel,r)))}const oe={id:"@jupyter-widgets/jupyterlab-manager:plugin",requires:[s.IRenderMimeRegistry],optional:[a.INotebookTracker,o.IConsoleTracker,r.ISettingRegistry,d.IMainMenu,l.ILoggerRegistry,$.ITranslator],provides:h.IJupyterWidgetRegistry,activate:function(e,n,t,i,r,o,a,d){const{commands:s}=e,l=(null!=d?d:$.nullTranslator).load("jupyterlab_widgets"),p=async e=>{if(!a)return;const n=await ee(e.context.sessionContext),t=pe.widgetManagerProperty.get(n);t&&t.onUnhandledIOPubMessage.connect(((n,t)=>{const i=a.getLogger(e.context.path);let r="warning";(Z.KernelMessage.isErrorMsg(t)||Z.KernelMessage.isStreamMsg(t)&&"stderr"===t.content.name)&&(r="error");const o=Object.assign(Object.assign({},t.content),{output_type:t.header.msg_type});i.rendermime=e.content.rendermime,i.log({type:"output",data:o,level:r})}))};if(null!==r&&r.load(oe.id).then((e=>{e.changed.connect(ae),ae(e)})).catch((e=>{console.error(e.message)})),n.addFactory({safe:!1,mimeTypes:[m],createRenderer:e=>new w(e)},-10),null!==t){const n=n=>Q(function*(e){for(const n of e.widgets)if("code"===n.model.type)for(const e of n.outputArea.widgets)for(const n of Array.from(e.children()))n instanceof w&&(yield n)}(n.content),function*(e,n){const t=(0,g.filter)(e.shell.widgets(),(e=>e.id.startsWith("LinkedOutputView-")&&e.path===n));for(const e of Array.from(t))for(const n of Array.from(e.children()))for(const e of Array.from(n.children()))e instanceof w&&(yield e)}(e,n.context.path));t.forEach((async e=>{await ie(e,n(e)),p(e)})),t.widgetAdded.connect((async(e,t)=>{await ie(t,n(t)),p(t)}))}if(null!==i){const e=e=>Q(function*(e){for(const n of Array.from(e.cells))if("code"===n.model.type)for(const e of n.outputArea.widgets)for(const n of Array.from(e.children()))n instanceof w&&(yield n)}(e.console));i.forEach((async n=>{await re(n,e(n))})),i.widgetAdded.connect((async(n,t)=>{await re(t,e(t))}))}return null!==r&&s.addCommand("@jupyter-widgets/jupyterlab-manager:saveWidgetState",{label:l.__("Save Widget State Automatically"),execute:e=>r.set(oe.id,"saveState",!q.saveState).catch((e=>{console.error(`Failed to set ${oe.id}: ${e.message}`)})),isToggled:()=>q.saveState}),o&&o.settingsMenu.addGroup([{command:"@jupyter-widgets/jupyterlab-manager:saveWidgetState"}]),{registerWidget(e){X.push(e)}}},autoStart:!0};function ae(e){q.saveState=e.get("saveState").composite}const de={id:`@jupyter-widgets/jupyterlab-manager:base-${h.JUPYTER_WIDGETS_VERSION}`,requires:[h.IJupyterWidgetRegistry],autoStart:!0,activate:(e,n)=>{n.registerWidget({name:"@jupyter-widgets/base",version:h.JUPYTER_WIDGETS_VERSION,exports:{WidgetModel:h.WidgetModel,WidgetView:h.WidgetView,DOMWidgetView:h.DOMWidgetView,DOMWidgetModel:h.DOMWidgetModel,LayoutModel:h.LayoutModel,LayoutView:h.LayoutView,StyleModel:h.StyleModel,StyleView:h.StyleView,ErrorWidgetView:h.ErrorWidgetView}})}},se={id:`@jupyter-widgets/jupyterlab-manager:controls-${I.A}`,requires:[h.IJupyterWidgetRegistry],autoStart:!0,activate:(e,n)=>{n.registerWidget({name:"@jupyter-widgets/controls",version:I.A,exports:()=>new Promise(((e,n)=>{t.e(869).then((n=>{e(t(5429))}).bind(null,t)).catch((e=>{n(e)}))}))})}},le={id:`@jupyter-widgets/jupyterlab-manager:output-${P}`,requires:[h.IJupyterWidgetRegistry],autoStart:!0,activate:(e,n)=>{n.registerWidget({name:"@jupyter-widgets/output",version:P,exports:{OutputModel:U,OutputView:k}})}},ge=[oe,de,se,le];var pe;!function(e){e.widgetManagerProperty=new Map}(pe||(pe={}));const ce=ge},2426:e=>{e.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjIuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAxOCAxOCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTggMTg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDpub25lO30KPC9zdHlsZT4KPHBhdGggZD0iTTUuMiw1LjlMOSw5LjdsMy44LTMuOGwxLjIsMS4ybC00LjksNWwtNC45LTVMNS4yLDUuOXoiLz4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTAtMC42aDE4djE4SDBWLTAuNnoiLz4KPC9zdmc+Cg"}}]); \ No newline at end of file diff --git a/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/586.085510630436c2e4273f.js b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/586.085510630436c2e4273f.js new file mode 100644 index 0000000..4beaf86 --- /dev/null +++ b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/586.085510630436c2e4273f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_jupyter_widgets_jupyterlab_manager=self.webpackChunk_jupyter_widgets_jupyterlab_manager||[]).push([[586],{3586:(e,t,s)=>{s.r(t),s.d(t,{AccordionModel:()=>kt,AccordionView:()=>Vt,AudioModel:()=>q,AudioView:()=>G,BaseIntSliderView:()=>Te,BoolModel:()=>f,BoundedFloatModel:()=>De,BoundedFloatTextModel:()=>Ke,BoundedIntModel:()=>ye,BoundedIntTextModel:()=>Le,BoxModel:()=>E,BoxView:()=>D,ButtonModel:()=>O,ButtonStyleModel:()=>S,ButtonView:()=>k,CheckboxModel:()=>w,CheckboxStyleModel:()=>v,CheckboxView:()=>y,ColorPickerModel:()=>Y,ColorPickerView:()=>Q,ColorsInputModel:()=>Nt,ColorsInputView:()=>Ht,ComboboxModel:()=>bs,ComboboxView:()=>vs,ControllerAxisModel:()=>Qe,ControllerAxisView:()=>Xe,ControllerButtonModel:()=>Je,ControllerButtonView:()=>Ye,ControllerModel:()=>Ze,ControllerView:()=>et,DatePickerModel:()=>ee,DatePickerView:()=>te,DatetimeModel:()=>ue,DatetimeView:()=>ce,DescriptionModel:()=>r,DescriptionStyleModel:()=>o,DescriptionView:()=>h,DirectionalLinkModel:()=>_,DropdownModel:()=>it,DropdownView:()=>at,FileUploadModel:()=>xs,FileUploadView:()=>fs,FloatLogSliderModel:()=>Ue,FloatLogSliderView:()=>$e,FloatModel:()=>ze,FloatProgressModel:()=>Ge,FloatRangeSliderModel:()=>Fe,FloatRangeSliderView:()=>Ne,FloatSliderModel:()=>Pe,FloatSliderView:()=>Re,FloatTextModel:()=>He,FloatTextView:()=>qe,FloatsInputModel:()=>Gt,FloatsInputView:()=>Jt,GridBoxModel:()=>R,GridBoxView:()=>F,HBoxModel:()=>B,HBoxView:()=>P,HTMLMathModel:()=>ns,HTMLMathStyleModel:()=>es,HTMLMathView:()=>os,HTMLModel:()=>ls,HTMLStyleModel:()=>Zt,HTMLView:()=>ds,ImageModel:()=>$,ImageView:()=>N,IntModel:()=>we,IntProgressModel:()=>Ae,IntRangeSliderModel:()=>je,IntRangeSliderView:()=>Se,IntSliderModel:()=>Me,IntSliderView:()=>Oe,IntTextModel:()=>ke,IntTextView:()=>Ve,IntsInputModel:()=>Yt,IntsInputView:()=>Qt,JUPYTER_CONTROLS_VERSION:()=>n.A,JupyterLuminoAccordionWidget:()=>Lt,JupyterLuminoTabPanelWidget:()=>At,LabelModel:()=>rs,LabelStyleModel:()=>ts,LabelView:()=>hs,LabeledDOMWidgetModel:()=>u,LabeledDOMWidgetView:()=>c,LinkModel:()=>b,MultipleSelectionModel:()=>gt,NaiveDatetimeModel:()=>be,PasswordModel:()=>ms,PasswordView:()=>_s,PlayModel:()=>Ee,PlayView:()=>Be,ProgressStyleModel:()=>Ie,ProgressView:()=>We,RadioButtonsModel:()=>nt,RadioButtonsView:()=>ot,SelectModel:()=>lt,SelectMultipleModel:()=>mt,SelectMultipleView:()=>_t,SelectView:()=>dt,SelectionContainerModel:()=>Ot,SelectionModel:()=>tt,SelectionRangeSliderModel:()=>bt,SelectionRangeSliderView:()=>vt,SelectionSliderModel:()=>ct,SelectionSliderView:()=>pt,SelectionView:()=>st,SliderStyleModel:()=>Ce,StackModel:()=>Et,StackView:()=>Bt,StringModel:()=>is,StringView:()=>as,TabModel:()=>It,TabView:()=>Wt,TagsInputModel:()=>Rt,TagsInputView:()=>$t,TextModel:()=>ps,TextStyleModel:()=>ss,TextView:()=>gs,TextareaModel:()=>us,TextareaView:()=>cs,TimeModel:()=>de,TimeView:()=>ne,ToggleButtonModel:()=>C,ToggleButtonStyleModel:()=>x,ToggleButtonView:()=>M,ToggleButtonsModel:()=>ht,ToggleButtonsStyleModel:()=>rt,ToggleButtonsView:()=>ut,VBoxModel:()=>z,VBoxView:()=>U,ValidModel:()=>j,ValidView:()=>T,VideoModel:()=>H,VideoView:()=>K,datetime_serializers:()=>he,deserialize_date:()=>Z,deserialize_datetime:()=>re,deserialize_naive:()=>me,deserialize_time:()=>ae,escape_html:()=>l,naive_serializers:()=>_e,reject:()=>d,resolvePromisesDict:()=>i.resolvePromisesDict,serialize_date:()=>X,serialize_datetime:()=>oe,serialize_naive:()=>ge,serialize_time:()=>ie,time_serializers:()=>le,typeset:()=>a,uuid:()=>i.uuid,version:()=>ws});var i=s(7401);function a(e,t){void 0!==t&&(e.textContent=t),void 0!==window.MathJax&&MathJax.Hub.Queue(["Typeset",MathJax.Hub,e])}function l(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}function d(e,t){return function(s){throw t&&console.error(new Error(e)),s}}var n=s(8701);class o extends i.StyleModel{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"DescriptionStyleModel",_model_module:"@jupyter-widgets/controls",_model_module_version:n.A})}}o.styleProperties={description_width:{selector:".widget-label",attribute:"width",default:null}};class r extends i.DOMWidgetModel{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"DescriptionModel",_view_name:"DescriptionView",_view_module:"@jupyter-widgets/controls",_model_module:"@jupyter-widgets/controls",_view_module_version:n.A,_model_module_version:n.A,description:"",description_allow_html:!1})}}class h extends i.DOMWidgetView{render(){this.label=document.createElement("label"),this.el.appendChild(this.label),this.label.className="widget-label",this.label.style.display="none",this.listenTo(this.model,"change:description",this.updateDescription),this.listenTo(this.model,"change:description_allow_html",this.updateDescription),this.listenTo(this.model,"change:tabbable",this.updateTabindex),this.updateDescription(),this.updateTabindex(),this.updateTooltip()}typeset(e,t){this.displayed.then((()=>{var s;const i=null===(s=this.model.widget_manager._rendermime)||void 0===s?void 0:s.latexTypesetter;if(!i)return a(e,t);void 0!==t&&(e.textContent=t),i.typeset(e)}))}updateDescription(){const e=this.model.get("description");0===e.length?this.label.style.display="none":(this.model.get("description_allow_html")?this.label.innerHTML=this.model.widget_manager.inline_sanitize(e):this.label.textContent=e,this.typeset(this.label),this.label.style.display="")}updateTooltip(){this.label&&(this.label.title=this.model.get("tooltip"))}}class u extends r{}class c extends h{}class p extends i.WidgetModel{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"CoreWidgetModel",_view_module:"@jupyter-widgets/controls",_model_module:"@jupyter-widgets/controls",_view_module_version:n.A,_model_module_version:n.A})}}class g extends i.DOMWidgetModel{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"CoreDOMWidgetModel",_view_module:"@jupyter-widgets/controls",_model_module:"@jupyter-widgets/controls",_view_module_version:n.A,_model_module_version:n.A})}}class m extends r{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"CoreDescriptionModel",_view_module:"@jupyter-widgets/controls",_model_module:"@jupyter-widgets/controls",_view_module_version:n.A,_model_module_version:n.A})}}class _ extends p{defaults(){return Object.assign(Object.assign({},super.defaults()),{target:void 0,source:void 0,_model_name:"DirectionalLinkModel"})}initialize(e,t){super.initialize(e,t),this.on("change",this.updateBindings,this),this.updateBindings()}updateValue(e,t,s,i){if(!this._updating){this._updating=!0;try{s&&(s.set(i,e.get(t)),s.save_changes())}finally{this._updating=!1}}}updateBindings(){this.cleanup(),[this.sourceModel,this.sourceAttr]=this.get("source")||[null,null],[this.targetModel,this.targetAttr]=this.get("target")||[null,null],this.sourceModel&&(this.listenTo(this.sourceModel,"change:"+this.sourceAttr,(()=>{this.updateValue(this.sourceModel,this.sourceAttr,this.targetModel,this.targetAttr)})),this.updateValue(this.sourceModel,this.sourceAttr,this.targetModel,this.targetAttr),this.listenToOnce(this.sourceModel,"destroy",this.cleanup)),this.targetModel&&this.listenToOnce(this.targetModel,"destroy",this.cleanup)}cleanup(){this.sourceModel&&(this.stopListening(this.sourceModel,"change:"+this.sourceAttr,void 0),this.stopListening(this.sourceModel,"destroy",void 0)),this.targetModel&&this.stopListening(this.targetModel,"destroy",void 0)}}_.serializers=Object.assign(Object.assign({},p.serializers),{target:{deserialize:i.unpack_models},source:{deserialize:i.unpack_models}});class b extends _{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"LinkModel"})}updateBindings(){super.updateBindings(),this.targetModel&&this.listenTo(this.targetModel,"change:"+this.targetAttr,(()=>{this.updateValue(this.targetModel,this.targetAttr,this.sourceModel,this.sourceAttr)}))}cleanup(){super.cleanup(),this.targetModel&&this.stopListening(this.targetModel,"change:"+this.targetAttr,void 0)}}class v extends o{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"CheckboxStyleModel"})}}v.styleProperties=Object.assign(Object.assign({},o.styleProperties),{background:{selector:"",attribute:"background",default:null}});class x extends o{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"ToggleButtonStyleModel"})}}x.styleProperties=Object.assign(Object.assign({},o.styleProperties),{font_family:{selector:"",attribute:"font-family",default:""},font_size:{selector:"",attribute:"font-size",default:""},font_style:{selector:"",attribute:"font-style",default:""},font_variant:{selector:"",attribute:"font-variant",default:""},font_weight:{selector:"",attribute:"font-weight",default:""},text_color:{selector:"",attribute:"color",default:""},text_decoration:{selector:"",attribute:"text-decoration",default:""}});class f extends m{defaults(){return Object.assign(Object.assign({},super.defaults()),{value:!1,disabled:!1,_model_name:"BoolModel"})}}class w extends m{defaults(){return Object.assign(Object.assign({},super.defaults()),{indent:!0,style:null,_view_name:"CheckboxView",_model_name:"CheckboxModel"})}}class y extends h{render(){super.render(),this.el.classList.add("jupyter-widgets"),this.el.classList.add("widget-inline-hbox"),this.el.classList.add("widget-checkbox"),this.label.innerHTML="​",this.checkboxLabel=document.createElement("label"),this.checkboxLabel.classList.add("widget-label-basic"),this.el.appendChild(this.checkboxLabel),this.checkbox=document.createElement("input"),this.checkbox.setAttribute("type","checkbox"),this.checkboxLabel.appendChild(this.checkbox),this.descriptionSpan=document.createElement("span"),this.checkboxLabel.appendChild(this.descriptionSpan),this.listenTo(this.model,"change:indent",this.updateIndent),this.listenTo(this.model,"change:tabbable",this.updateTabindex),this.update(),this.updateDescription(),this.updateIndent(),this.updateTabindex(),this.updateTooltip()}updateDescription(){if(null==this.checkboxLabel)return;const e=this.model.get("description");this.model.get("description_allow_html")?this.descriptionSpan.innerHTML=this.model.widget_manager.inline_sanitize(e):this.descriptionSpan.textContent=e,this.typeset(this.descriptionSpan),this.descriptionSpan.title=e,this.checkbox.title=e}updateIndent(){const e=this.model.get("indent");this.label.style.display=e?"":"none"}updateTabindex(){if(!this.checkbox)return;const e=this.model.get("tabbable");!0===e?this.checkbox.setAttribute("tabIndex","0"):!1===e?this.checkbox.setAttribute("tabIndex","-1"):null===e&&this.checkbox.removeAttribute("tabIndex")}updateTooltip(){if(!this.checkbox)return;const e=this.model.get("tooltip");e?0===this.model.get("description").length&&this.checkbox.setAttribute("title",e):this.checkbox.removeAttribute("title")}events(){return{'click input[type="checkbox"]':"_handle_click"}}_handle_click(){const e=this.model.get("value");this.model.set("value",!e,{updated_view:this}),this.touch()}update(e){return this.checkbox.checked=this.model.get("value"),void 0!==e&&e.updated_view==this||(this.checkbox.disabled=this.model.get("disabled")),super.update()}handle_message(e){"focus"==e.do?this.checkbox.focus():"blur"==e.do&&this.checkbox.blur()}}class C extends f{defaults(){return Object.assign(Object.assign({},super.defaults()),{_view_name:"ToggleButtonView",_model_name:"ToggleButtonModel",tooltip:"",icon:"",button_style:"",style:null})}}class M extends i.DOMWidgetView{render(){super.render(),this.el.classList.add("jupyter-widgets"),this.el.classList.add("jupyter-button"),this.el.classList.add("widget-toggle-button"),this.listenTo(this.model,"change:button_style",this.update_button_style),this.listenTo(this.model,"change:tabbable",this.updateTabindex),this.set_button_style(),this.update()}update_button_style(){this.update_mapped_classes(M.class_map,"button_style")}set_button_style(){this.set_mapped_classes(M.class_map,"button_style")}update(e){if(this.model.get("value")?this.el.classList.add("mod-active"):this.el.classList.remove("mod-active"),void 0===e||e.updated_view!==this){this.el.disabled=this.model.get("disabled"),this.el.setAttribute("tabbable",this.model.get("tabbable")),this.el.setAttribute("title",this.model.get("tooltip"));const e=this.model.get("description"),t=this.model.get("icon");if(0===e.trim().length&&0===t.trim().length)this.el.innerHTML=" ";else{if(this.el.textContent="",t.trim().length){const e=document.createElement("i");this.el.appendChild(e),e.classList.add("fa"),e.classList.add("fa-"+t)}this.el.appendChild(document.createTextNode(e))}}return this.updateTabindex(),super.update()}events(){return{click:"_handle_click"}}_handle_click(e){e.preventDefault();const t=this.model.get("value");this.model.set("value",!t,{updated_view:this}),this.touch()}preinitialize(){this.tagName="button"}}M.class_map={primary:["mod-primary"],success:["mod-success"],info:["mod-info"],warning:["mod-warning"],danger:["mod-danger"]};class j extends f{defaults(){return Object.assign(Object.assign({},super.defaults()),{readout:"Invalid",_view_name:"ValidView",_model_name:"ValidModel"})}}class T extends h{render(){super.render(),this.el.classList.add("jupyter-widgets"),this.el.classList.add("widget-valid"),this.el.classList.add("widget-inline-hbox"),this.icon=document.createElement("i"),this.icon.classList.add("fa","fa-fw"),this.el.appendChild(this.icon),this.readout=document.createElement("span"),this.readout.classList.add("widget-valid-readout"),this.readout.classList.add("widget-readout"),this.el.appendChild(this.readout),this.update()}update(){this.el.classList.remove("mod-valid"),this.el.classList.remove("mod-invalid"),this.icon.classList.remove("fa-check"),this.icon.classList.remove("fa-times"),this.readout.textContent=this.model.get("readout"),this.model.get("value")?(this.el.classList.add("mod-valid"),this.icon.classList.add("fa-check")):(this.el.classList.add("mod-invalid"),this.icon.classList.add("fa-times"))}}class S extends i.StyleModel{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"ButtonStyleModel",_model_module:"@jupyter-widgets/controls",_model_module_version:n.A})}}S.styleProperties={button_color:{selector:"",attribute:"background-color",default:null},font_family:{selector:"",attribute:"font-family",default:""},font_size:{selector:"",attribute:"font-size",default:""},font_style:{selector:"",attribute:"font-style",default:""},font_variant:{selector:"",attribute:"font-variant",default:""},font_weight:{selector:"",attribute:"font-weight",default:""},text_color:{selector:"",attribute:"color",default:""},text_decoration:{selector:"",attribute:"text-decoration",default:""}};class O extends g{defaults(){return Object.assign(Object.assign({},super.defaults()),{description:"",tooltip:"",disabled:!1,icon:"",button_style:"",_view_name:"ButtonView",_model_name:"ButtonModel",style:null})}}class k extends i.DOMWidgetView{render(){super.render(),this.el.classList.add("jupyter-widgets"),this.el.classList.add("jupyter-button"),this.el.classList.add("widget-button"),this.listenTo(this.model,"change:button_style",this.update_button_style),this.listenTo(this.model,"change:tabbable",this.updateTabindex),this.set_button_style(),this.update()}update(){this.el.disabled=this.model.get("disabled"),this.updateTabindex();const e=this.model.get("tooltip"),t=this.model.get("description"),s=this.model.get("icon");if(this.el.setAttribute("title",null!=e?e:t),t.length||s.length){if(this.el.textContent="",s.length){const e=document.createElement("i");e.classList.add("fa"),e.classList.add(...s.split(/[\s]+/).filter(Boolean).map((e=>`fa-${e}`))),0===t.length&&e.classList.add("center"),this.el.appendChild(e)}this.el.appendChild(document.createTextNode(t))}return super.update()}update_button_style(){this.update_mapped_classes(k.class_map,"button_style")}set_button_style(){this.set_mapped_classes(k.class_map,"button_style")}events(){return{click:"_handle_click"}}_handle_click(e){e.preventDefault(),this.send({event:"click"})}preinitialize(){this.tagName="button"}}k.class_map={primary:["mod-primary"],success:["mod-success"],info:["mod-info"],warning:["mod-warning"],danger:["mod-danger"]};var L=s(4053),V=s(6230),I=s(5256),A=s(8596),W=s.n(A);class E extends g{defaults(){return Object.assign(Object.assign({},super.defaults()),{_view_name:"BoxView",_model_name:"BoxModel",children:[],box_style:""})}}E.serializers=Object.assign(Object.assign({},g.serializers),{children:{deserialize:i.unpack_models}});class B extends E{defaults(){return Object.assign(Object.assign({},super.defaults()),{_view_name:"HBoxView",_model_name:"HBoxModel"})}}class z extends E{defaults(){return Object.assign(Object.assign({},super.defaults()),{_view_name:"VBoxView",_model_name:"VBoxModel"})}}class D extends i.DOMWidgetView{_createElement(e){return this.luminoWidget=new i.JupyterLuminoPanelWidget({view:this}),this.luminoWidget.node}_setElement(e){if(this.el||e!==this.luminoWidget.node)throw new Error("Cannot reset the DOM element.");this.el=this.luminoWidget.node,this.$el=W()(this.luminoWidget.node)}initialize(e){super.initialize(e),this.children_views=new i.ViewList(this.add_child_model,null,this),this.listenTo(this.model,"change:children",this.update_children),this.listenTo(this.model,"change:box_style",this.update_box_style),this.luminoWidget.addClass("jupyter-widgets"),this.luminoWidget.addClass("widget-container"),this.luminoWidget.addClass("widget-box")}render(){super.render(),this.update_children(),this.set_box_style()}update_children(){var e;null===(e=this.children_views)||void 0===e||e.update(this.model.get("children")).then((e=>{e.forEach((e=>{V.MessageLoop.postMessage(e.luminoWidget,I.Widget.ResizeMessage.UnknownSize)}))}))}update_box_style(){this.update_mapped_classes(D.class_map,"box_style")}set_box_style(){this.set_mapped_classes(D.class_map,"box_style")}add_child_model(e){const t=new I.Widget;return this.luminoWidget.addWidget(t),this.create_child_view(e).then((e=>{const s=L.ArrayExt.firstIndexOf(this.luminoWidget.widgets,t);return this.luminoWidget.insertWidget(s,e.luminoWidget),t.dispose(),e})).catch((0,i.reject)("Could not add child view to box",!0))}remove(){this.children_views=null,super.remove()}}D.class_map={success:["alert","alert-success"],info:["alert","alert-info"],warning:["alert","alert-warning"],danger:["alert","alert-danger"]};class P extends D{initialize(e){super.initialize(e),this.luminoWidget.addClass("widget-hbox")}}class U extends D{initialize(e){super.initialize(e),this.luminoWidget.addClass("widget-vbox")}}class F extends D{initialize(e){super.initialize(e),this.luminoWidget.addClass("widget-gridbox"),this.luminoWidget.removeClass("widget-box")}}class R extends E{defaults(){return Object.assign(Object.assign({},super.defaults()),{_view_name:"GridBoxView",_model_name:"GridBoxModel"})}}class $ extends g{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"ImageModel",_view_name:"ImageView",format:"png",width:"",height:"",value:new DataView(new ArrayBuffer(0))})}}$.serializers=Object.assign(Object.assign({},g.serializers),{value:{serialize:e=>new DataView(e.buffer.slice(0))}});class N extends i.DOMWidgetView{render(){super.render(),this.luminoWidget.addClass("jupyter-widgets"),this.luminoWidget.addClass("widget-image"),this.update()}update(){let e;const t=this.model.get("format"),s=this.model.get("value");if("url"!==t){const t=new Blob([s],{type:`image/${this.model.get("format")}`});e=URL.createObjectURL(t)}else e=new TextDecoder("utf-8").decode(s.buffer);const i=this.el.src;this.el.src=e,i&&URL.revokeObjectURL(i);const a=this.model.get("width");void 0!==a&&a.length>0?this.el.setAttribute("width",a):this.el.removeAttribute("width");const l=this.model.get("height");return void 0!==l&&l.length>0?this.el.setAttribute("height",l):this.el.removeAttribute("height"),super.update()}remove(){this.el.src&&URL.revokeObjectURL(this.el.src),super.remove()}preinitialize(){this.tagName="img"}}class H extends g{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"VideoModel",_view_name:"VideoView",format:"mp4",width:"",height:"",autoplay:!0,loop:!0,controls:!0,value:new DataView(new ArrayBuffer(0))})}}H.serializers=Object.assign(Object.assign({},g.serializers),{value:{serialize:e=>new DataView(e.buffer.slice(0))}});class K extends i.DOMWidgetView{render(){super.render(),this.luminoWidget.addClass("jupyter-widgets"),this.luminoWidget.addClass("widget-image"),this.update()}update(){let e;const t=this.model.get("format"),s=this.model.get("value");if("url"!==t){const t=new Blob([s],{type:`video/${this.model.get("format")}`});e=URL.createObjectURL(t)}else e=new TextDecoder("utf-8").decode(s.buffer);const i=this.el.src;this.el.src=e,i&&URL.revokeObjectURL(i);const a=this.model.get("width");void 0!==a&&a.length>0?this.el.setAttribute("width",a):this.el.removeAttribute("width");const l=this.model.get("height");return void 0!==l&&l.length>0?this.el.setAttribute("height",l):this.el.removeAttribute("height"),this.el.loop=this.model.get("loop"),this.el.autoplay=this.model.get("autoplay"),this.el.controls=this.model.get("controls"),super.update()}remove(){this.el.src&&URL.revokeObjectURL(this.el.src),super.remove()}preinitialize(){this.tagName="video"}}class q extends g{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"AudioModel",_view_name:"AudioView",format:"mp3",autoplay:!0,loop:!0,controls:!0,value:new DataView(new ArrayBuffer(0))})}}q.serializers=Object.assign(Object.assign({},g.serializers),{value:{serialize:e=>new DataView(e.buffer.slice(0))}});class G extends i.DOMWidgetView{render(){super.render(),this.luminoWidget.addClass("jupyter-widgets"),this.update()}update(){let e;const t=this.model.get("format"),s=this.model.get("value");if("url"!==t){const t=new Blob([s],{type:`audio/${this.model.get("format")}`});e=URL.createObjectURL(t)}else e=new TextDecoder("utf-8").decode(s.buffer);const i=this.el.src;return this.el.src=e,i&&URL.revokeObjectURL(i),this.el.loop=this.model.get("loop"),this.el.autoplay=this.model.get("autoplay"),this.el.controls=this.model.get("controls"),super.update()}remove(){this.el.src&&URL.revokeObjectURL(this.el.src),super.remove()}preinitialize(){this.tagName="audio"}}const J={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgreen:"#90ee90",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};class Y extends m{defaults(){return Object.assign(Object.assign({},super.defaults()),{value:"black",concise:!1,_model_name:"ColorPickerModel",_view_name:"ColorPickerView"})}}class Q extends h{render(){super.render(),this.el.classList.add("jupyter-widgets"),this.el.classList.add("widget-inline-hbox"),this.el.classList.add("widget-colorpicker"),this._color_container=document.createElement("div"),this._color_container.className="widget-inline-hbox widget-colorpicker-input",this.el.appendChild(this._color_container),this._textbox=document.createElement("input"),this._textbox.setAttribute("type","text"),this._textbox.id=this.label.htmlFor=(0,i.uuid)(),this._color_container.appendChild(this._textbox),this._textbox.value=this.model.get("value"),this._colorpicker=document.createElement("input"),this._colorpicker.setAttribute("type","color"),this._color_container.appendChild(this._colorpicker),this.listenTo(this.model,"change:value",this._update_value),this.listenTo(this.model,"change:concise",this._update_concise),this._update_concise(),this._update_value(),this.update()}update(e){if(void 0===e||e.updated_view!=this){const e=this.model.get("disabled");this._textbox.disabled=e,this._colorpicker.disabled=e}return super.update()}events(){return this._picker_change,this._text_change,{'change [type="color"]':"_picker_change",'change [type="text"]':"_text_change"}}_update_value(){const e=this.model.get("value");var t,s;this._colorpicker.value=J[(t=e).toLowerCase()]||(7===(s=t).length?s:"#"+s.charAt(1)+s.charAt(1)+s.charAt(2)+s.charAt(2)+s.charAt(3)+s.charAt(3)),this._textbox.value=e}_update_concise(){this.model.get("concise")?(this.el.classList.add("concise"),this._textbox.style.display="none"):(this.el.classList.remove("concise"),this._textbox.style.display="")}_picker_change(){this.model.set("value",this._colorpicker.value),this.touch()}_text_change(){const e=this._validate_color(this._textbox.value,this.model.get("value"));this.model.set("value",e),this.touch()}_validate_color(e,t){return e.match(/#[a-fA-F0-9]{3}(?:[a-fA-F0-9]{3})?$/)||J[e.toLowerCase()]?e:t}}function X(e){return null===e?null:{year:e.getUTCFullYear(),month:e.getUTCMonth(),date:e.getUTCDate()}}function Z(e){if(null===e)return null;{const t=new Date;return t.setUTCFullYear(e.year,e.month,e.date),t.setUTCHours(0,0,0,0),t}}class ee extends m{defaults(){return Object.assign(Object.assign({},super.defaults()),{value:null,_model_name:"DatePickerModel",_view_name:"DatePickerView"})}}ee.serializers=Object.assign(Object.assign({},m.serializers),{value:{serialize:X,deserialize:Z}});class te extends h{render(){super.render(),this.el.classList.add("jupyter-widgets"),this.el.classList.add("widget-inline-hbox"),this.el.classList.add("widget-datepicker"),this._datepicker=document.createElement("input"),this._datepicker.setAttribute("type","date"),this._datepicker.id=this.label.htmlFor=(0,i.uuid)(),this.el.appendChild(this._datepicker),this.listenTo(this.model,"change:value",this._update_value),this._update_value(),this.update()}update(e){return void 0!==e&&e.updated_view===this||(this._datepicker.disabled=this.model.get("disabled")),super.update()}events(){return this._picker_change,this._picker_focusout,{'change [type="date"]':"_picker_change",'focusout [type="date"]':"_picker_focusout"}}_update_value(){const e=this.model.get("value");this._datepicker.valueAsDate=e}_picker_change(){this._datepicker.validity.badInput||(this.model.set("value",this._datepicker.valueAsDate),this.touch())}_picker_focusout(){this._datepicker.validity.badInput&&(this.model.set("value",null),this.touch())}}const se=/(\d\d):(\d\d)(:(\d\d)(.(\d{1,3})\d*)?)?/;function ie(e){if(null===e)return null;{const t=se.exec(e);return null===t?null:{hours:Math.min(23,parseInt(t[1],10)),minutes:Math.min(59,parseInt(t[2],10)),seconds:t[4]?Math.min(59,parseInt(t[4],10)):0,milliseconds:t[6]?parseInt(t[6],10):0}}}function ae(e){if(null===e)return null;{const t=[`${e.hours.toString().padStart(2,"0")}:${e.minutes.toString().padStart(2,"0")}`];return(e.seconds>0||e.milliseconds>0)&&(t.push(`:${e.seconds.toString().padStart(2,"0")}`),e.milliseconds>0&&t.push(`.${e.milliseconds.toString().padStart(3,"0")}`)),t.join("")}}const le={serialize:ie,deserialize:ae};class de extends m{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:de.model_name,_view_name:de.view_name,value:null,disabled:!1,min:null,max:null,step:60})}}de.serializers=Object.assign(Object.assign({},m.serializers),{value:le,min:le,max:le}),de.model_name="TimeModel",de.view_name="TimeView";class ne extends h{render(){super.render(),this.el.classList.add("jupyter-widgets"),this.el.classList.add("widget-inline-hbox"),this.el.classList.add("widget-timepicker"),this._timepicker=document.createElement("input"),this._timepicker.setAttribute("type","time"),this._timepicker.id=this.label.htmlFor=(0,i.uuid)(),this.el.appendChild(this._timepicker),this.listenTo(this.model,"change:value",this._update_value),this.listenTo(this.model,"change",this.update2),this._update_value(),this.update2()}update2(e,t){return void 0!==t&&t.updated_view===this||(this._timepicker.disabled=this.model.get("disabled"),this._timepicker.min=this.model.get("min"),this._timepicker.max=this.model.get("max"),this._timepicker.step=this.model.get("step")),super.update()}events(){return this._picker_change,this._picker_focusout,{'change [type="time"]':"_picker_change",'focusout [type="time"]':"_picker_focusout"}}_update_value(e,t,s){void 0!==s&&s.updated_view===this||(this._timepicker.value=this.model.get("value"))}_picker_change(){this._timepicker.validity.badInput||(this.model.set("value",this._timepicker.value,{updated_view:this}),this.touch())}_picker_focusout(){this._timepicker.validity.badInput&&(this.model.set("value",null,{updated_view:this}),this.touch())}}function oe(e){return null===e?null:{year:e.getUTCFullYear(),month:e.getUTCMonth(),date:e.getUTCDate(),hours:e.getUTCHours(),minutes:e.getUTCMinutes(),seconds:e.getUTCSeconds(),milliseconds:e.getUTCMilliseconds()}}function re(e){if(null===e)return null;{const t=new Date;return t.setUTCFullYear(e.year,e.month,e.date),t.setUTCHours(e.hours,e.minutes,e.seconds,e.milliseconds),t}}const he={serialize:oe,deserialize:re};class ue extends m{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"DatetimeModel",_view_name:"DatetimeView",value:null,disabled:!1,min:null,max:null})}}ue.serializers=Object.assign(Object.assign({},m.serializers),{value:he,min:he,max:he});class ce extends h{render(){super.render(),this.el.classList.add("jupyter-widgets"),this.el.classList.add("widget-inline-hbox"),this.el.classList.add("widget-datetimepicker");const e=document.createElement("input");e.type="datetime-local","text"===e.type?(this._datepicker=document.createElement("input"),this._datepicker.setAttribute("type","date"),this._datepicker.id=this.label.htmlFor=(0,i.uuid)(),this._timepicker=document.createElement("input"),this._timepicker.setAttribute("type","time"),this._timepicker.id=(0,i.uuid)(),this.el.appendChild(this._datepicker),this.el.appendChild(this._timepicker)):(this._datetimepicker=e,this._datetimepicker.id=this.label.htmlFor=(0,i.uuid)(),this.el.appendChild(this._datetimepicker)),this.listenTo(this.model,"change:value",this._update_value),this.listenTo(this.model,"change",this.update2),this._update_value(),this.update2()}update2(e,t){if(void 0===t||t.updated_view!==this){const e=this.model.get("min"),t=this.model.get("max");this._datetimepicker?(this._datetimepicker.disabled=this.model.get("disabled"),this._datetimepicker.min=pe.dt_as_dt_string(e),this._datetimepicker.max=pe.dt_as_dt_string(t)):(this._datepicker.disabled=this.model.get("disabled"),this._datepicker.min=pe.dt_as_date_string(e),this._datepicker.max=pe.dt_as_date_string(t),this._timepicker.disabled=this.model.get("disabled"))}}events(){return this._picker_change,this._picker_focusout,{'change [type="date"]':"_picker_change",'change [type="time"]':"_picker_change",'change [type="datetime-local"]':"_picker_change",'focusout [type="date"]':"_picker_focusout",'focusout [type="datetime-local"]':"_picker_focusout",'focusout [type="time"]':"_picker_focusout"}}_update_value(e,t,s){if(void 0===s||s.updated_view!==this){const e=this.model.get("value");this._datetimepicker?this._datetimepicker.value=pe.dt_as_dt_string(e):(this._datepicker.valueAsDate=e,this._timepicker.value=pe.dt_as_time_string(e))}}_picker_change(){if(this._datetimepicker){if(!this._datetimepicker.validity.badInput){const e=this._datetimepicker.value;let t=e?new Date(e):null;t&&isNaN(t.valueOf())&&(t=null),this.model.set("value",t,{updated_view:this}),this.touch()}}else if(!this._datepicker.validity.badInput&&!this._timepicker.validity.badInput){const e=this._datepicker.valueAsDate,t=ie(this._timepicker.value);null!==e&&null!==t&&e.setHours(t.hours,t.minutes,t.seconds,t.milliseconds),this.model.set("value",null!==t&&e,{updated_view:this}),this.touch()}}_picker_focusout(){[this._datetimepicker,this._datepicker,this._timepicker].some((e=>e&&e.validity.badInput))&&(this.model.set("value",null),this.touch())}}var pe;function ge(e){return null===e?null:{year:e.getFullYear(),month:e.getMonth(),date:e.getDate(),hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds(),milliseconds:e.getMilliseconds()}}function me(e){if(null===e)return null;{const t=new Date;return t.setFullYear(e.year,e.month,e.date),t.setHours(e.hours,e.minutes,e.seconds,e.milliseconds),t}}!function(e){function t(e){if(null===e)return"";const t=[];return t.push(`${e.getFullYear().toString().padStart(4,"0")}`),t.push(`-${(e.getMonth()+1).toString().padStart(2,"0")}`),t.push(`-${e.getDate().toString().padStart(2,"0")}`),t.push(`T${e.getHours().toString().padStart(2,"0")}`),t.push(`:${e.getMinutes().toString().padStart(2,"0")}`),(e.getSeconds()>0||e.getMilliseconds()>0)&&(t.push(`:${e.getSeconds().toString().padStart(2,"0")}`),e.getMilliseconds()>0&&t.push(`.${e.getMilliseconds().toString().padStart(3,"0")}`)),t.join("")}e.dt_as_dt_string=t,e.dt_as_date_string=function(e){return e?t(e).split("T",2)[0]:""},e.dt_as_time_string=function(e){return e?t(e).split("T",2)[1]:""}}(pe||(pe={}));const _e={serialize:ge,deserialize:me};class be extends ue{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"NaiveDatetimeModel"})}}be.serializers=Object.assign(Object.assign({},m.serializers),{value:_e,min:_e,max:_e});var ve=s(7102),xe=s(5715),fe=s.n(xe);class we extends m{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"IntModel",value:0})}}class ye extends we{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"BoundedIntModel",max:100,min:0})}}class Ce extends o{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"SliderStyleModel"})}}Ce.styleProperties=Object.assign(Object.assign({},o.styleProperties),{handle_color:{selector:".noUi-handle",attribute:"background-color",default:null}});class Me extends ye{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"IntSliderModel",_view_name:"IntSliderView",step:1,orientation:"horizontal",readout:!0,readout_format:"d",continuous_update:!0,style:null,disabled:!1})}initialize(e,t){super.initialize(e,t),this.on("change:readout_format",this.update_readout_format,this),this.update_readout_format()}update_readout_format(){this.readout_formatter=(0,ve.GP)(this.get("readout_format"))}}class je extends Me{}class Te extends h{constructor(){super(...arguments),this._parse_value=parseInt}render(){super.render(),this.el.classList.add("jupyter-widgets"),this.el.classList.add("widget-inline-hbox"),this.el.classList.add("widget-slider"),this.el.classList.add("widget-hslider"),this.$slider=document.createElement("div"),this.$slider.classList.add("slider"),this.slider_container=document.createElement("div"),this.slider_container.classList.add("slider-container"),this.slider_container.appendChild(this.$slider),this.el.appendChild(this.slider_container),this.readout=document.createElement("div"),this.el.appendChild(this.readout),this.readout.classList.add("widget-readout"),this.readout.contentEditable="true",this.readout.style.display="none",this.createSlider(),this.model.on("change:orientation",this.regenSlider,this),this.model.on("change:max",this.updateSliderOptions,this),this.model.on("change:min",this.updateSliderOptions,this),this.model.on("change:step",this.updateSliderOptions,this),this.model.on("change:value",this.updateSliderValue,this),this.update()}update(e){return void 0!==e&&e.updated_view===this||(this.model.get("disabled")?(this.readout.contentEditable="false",this.$slider.setAttribute("disabled",!0)):(this.readout.contentEditable="true",this.$slider.removeAttribute("disabled")),"vertical"===this.model.get("orientation")?(this.el.classList.remove("widget-hslider"),this.el.classList.add("widget-vslider"),this.el.classList.remove("widget-inline-hbox"),this.el.classList.add("widget-inline-vbox")):(this.el.classList.remove("widget-vslider"),this.el.classList.add("widget-hslider"),this.el.classList.remove("widget-inline-vbox"),this.el.classList.add("widget-inline-hbox")),this.model.get("readout")?(this.readout.style.display="",this.displayed.then((()=>{this.readout_overflow()?this.readout.classList.add("overflow"):this.readout.classList.remove("overflow")}))):this.readout.style.display="none"),super.update()}readout_overflow(){return this.readout.scrollWidth>this.readout.clientWidth}events(){return{"blur [contentEditable=true]":"handleTextChange","keydown [contentEditable=true]":"handleKeyDown"}}handleKeyDown(e){13===e.keyCode&&(e.preventDefault(),this.handleTextChange())}createSlider(){const e=this.model.get("orientation"),t=this.model.get("behavior");fe().create(this.$slider,{start:this.model.get("value"),connect:!0,behaviour:t,range:{min:this.model.get("min"),max:this.model.get("max")},step:this.model.get("step"),animate:!1,orientation:e,direction:"horizontal"===e?"ltr":"rtl",format:{from:e=>Number(e),to:e=>this._validate_slide_value(e)}}),this.$slider.noUiSlider.on("update",((e,t)=>{this.handleSliderUpdateEvent(e,t)})),this.$slider.noUiSlider.on("change",((e,t)=>{this.handleSliderChangeEvent(e,t)}))}regenSlider(e){this.$slider.noUiSlider.destroy(),this.createSlider()}_validate_slide_value(e){return Math.round(e)}}class Se extends Te{constructor(){super(...arguments),this._range_regex=/^\s*([+-]?\d+)\s*[-:–]\s*([+-]?\d+)/}update(e){super.update(e);const t=this.model.get("value");this.readout.textContent=this.valueToString(t),this.model.get("value")!==t&&(this.model.set("value",t,{updated_view:this}),this.touch())}valueToString(e){const t=this.model.readout_formatter;return e.map((function(e){return t(e)})).join(" – ")}stringToValue(e){if(null===e)return null;const t=this._range_regex.exec(e);return t?[this._parse_value(t[1]),this._parse_value(t[2])]:null}handleTextChange(){let e=this.stringToValue(this.readout.textContent);const t=this.model.get("min"),s=this.model.get("max");null===e||isNaN(e[0])||isNaN(e[1])||e[0]>e[1]?this.readout.textContent=this.valueToString(this.model.get("value")):(e=[Math.max(Math.min(e[0],s),t),Math.max(Math.min(e[1],s),t)],e[0]!==this.model.get("value")[0]||e[1]!==this.model.get("value")[1]?(this.readout.textContent=this.valueToString(e),this.model.set("value",e),this.touch()):this.readout.textContent=this.valueToString(this.model.get("value")))}handleSliderChangeEvent(e,t){const s=e.map(this._validate_slide_value);this.readout.textContent=this.valueToString(s),this.handleSliderChanged(e,t)}handleSliderUpdateEvent(e,t){const s=e.map(this._validate_slide_value);this.readout.textContent=this.valueToString(s),this.model.get("continuous_update")&&this.handleSliderChanged(e,t)}handleSliderChanged(e,t){const s=e.map(this._validate_slide_value);this.model.set("value",s,{updated_view:this}),this.touch()}updateSliderOptions(e){this.$slider.noUiSlider.updateOptions({start:this.model.get("value"),range:{min:this.model.get("min"),max:this.model.get("max")},step:this.model.get("step")})}updateSliderValue(e,t,s){if(s.updated_view===this)return;const i=this.$slider.noUiSlider.get(),a=this.model.get("value");i[0]===a[0]&&i[1]===a[1]||this.$slider.noUiSlider.set(a)}}class Oe extends Te{update(e){super.update(e);const t=this.model.get("min"),s=this.model.get("max");let i=this.model.get("value");i>s?i=s:i=1){const e=s.substr(1);s=s[0]+e.replace(/[+-]/g,"")}t.value!==s&&(e.preventDefault(),t.value=s)}handleChanging(e){const t=e.target.value.trim();""===t||["-","-.",".","+.","+"].indexOf(t)>=0||this.model.get("continuous_update")&&this.handleChanged(e)}handleChanged(e){const t=e.target;let s=this._parse_value(t.value);if(isNaN(s))t.value=this.model.get("value");else{let e=s;void 0!==this.model.get("max")&&(e=Math.min(this.model.get("max"),e)),void 0!==this.model.get("min")&&(e=Math.max(this.model.get("min"),e)),e!==s&&(t.value=e,s=e),s!==this.model.get("value")&&(this.model.set("value",s,{updated_view:this}),this.touch())}}}class Ie extends o{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"ProgressStyleModel"})}}Ie.styleProperties=Object.assign(Object.assign({},o.styleProperties),{bar_color:{selector:".progress-bar",attribute:"background-color",default:null}});class Ae extends ye{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"IntProgressModel",_view_name:"ProgressView",orientation:"horizontal",bar_style:"",style:null})}}class We extends h{initialize(e){super.initialize(e),this.listenTo(this.model,"change:bar_style",this.update_bar_style),this.luminoWidget.addClass("jupyter-widgets")}render(){super.render();const e="horizontal"===this.model.get("orientation")?"widget-hprogress":"widget-vprogress";this.el.classList.add(e),this.progress=document.createElement("div"),this.progress.classList.add("progress"),this.progress.style.position="relative",this.el.appendChild(this.progress),this.bar=document.createElement("div"),this.bar.classList.add("progress-bar"),this.bar.style.position="absolute",this.bar.style.bottom="0px",this.bar.style.left="0px",this.progress.appendChild(this.bar),this.update(),this.set_bar_style()}update(){const e=this.model.get("value"),t=this.model.get("max"),s=this.model.get("min"),i=100*(e-s)/(t-s);return"horizontal"===this.model.get("orientation")?(this.el.classList.remove("widget-inline-vbox"),this.el.classList.remove("widget-vprogress"),this.el.classList.add("widget-inline-hbox"),this.el.classList.add("widget-hprogress"),this.bar.style.width=i+"%",this.bar.style.height="100%"):(this.el.classList.remove("widget-inline-hbox"),this.el.classList.remove("widget-hprogress"),this.el.classList.add("widget-inline-vbox"),this.el.classList.add("widget-vprogress"),this.bar.style.width="100%",this.bar.style.height=i+"%"),super.update()}update_bar_style(){this.update_mapped_classes(We.class_map,"bar_style",this.bar)}set_bar_style(){this.set_mapped_classes(We.class_map,"bar_style",this.bar)}}We.class_map={success:["progress-bar-success"],info:["progress-bar-info"],warning:["progress-bar-warning"],danger:["progress-bar-danger"]};class Ee extends ye{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"PlayModel",_view_name:"PlayView",repeat:!1,playing:!1,show_repeat:!0,interval:100,step:1,disabled:!1})}initialize(e,t){super.initialize(e,t)}loop(){if(!this.get("playing"))return;const e=this.get("value")+this.get("step");e<=this.get("max")?(this.set("value",e),this.schedule_next()):this.get("repeat")?(this.set("value",this.get("min")),this.schedule_next()):this.pause(),this.save_changes()}schedule_next(){this._timerId=window.setTimeout(this.loop.bind(this),this.get("interval"))}stop(){this.pause(),this.set("value",this.get("min")),this.save_changes()}pause(){window.clearTimeout(this._timerId),this._timerId=void 0,this.set("playing",!1),this.save_changes()}animate(){void 0===this._timerId&&(this.get("value")===this.get("max")?(this.set("value",this.get("min")),this.schedule_next(),this.save_changes()):this.loop(),this.save_changes())}play(){this.set("playing",!this.get("playing")),this.save_changes()}repeat(){this.set("repeat",!this.get("repeat")),this.save_changes()}}class Be extends i.DOMWidgetView{render(){super.render(),this.el.classList.add("jupyter-widgets"),this.el.classList.add("widget-inline-hbox"),this.el.classList.add("widget-play"),this.playPauseButton=document.createElement("button"),this.stopButton=document.createElement("button"),this.repeatButton=document.createElement("button"),this.playPauseButton.className="jupyter-button",this.stopButton.className="jupyter-button",this.repeatButton.className="jupyter-button",this.el.appendChild(this.playPauseButton),this.el.appendChild(this.stopButton),this.el.appendChild(this.repeatButton);const e=document.createElement("i");e.className="fa fa-play",this.playPauseButton.appendChild(e);const t=document.createElement("i");t.className="fa fa-stop",this.stopButton.appendChild(t);const s=document.createElement("i");s.className="fa fa-retweet",this.repeatButton.appendChild(s),this.playPauseButton.onclick=this.model.play.bind(this.model),this.stopButton.onclick=this.model.stop.bind(this.model),this.repeatButton.onclick=this.model.repeat.bind(this.model),this.listenTo(this.model,"change:playing",this.onPlayingChanged),this.listenTo(this.model,"change:repeat",this.updateRepeat),this.listenTo(this.model,"change:show_repeat",this.updateRepeat),this.updatePlaying(),this.updateRepeat(),this.update()}update(){const e=this.model.get("disabled");this.playPauseButton.disabled=e,this.stopButton.disabled=e,this.repeatButton.disabled=e,this.updatePlaying()}onPlayingChanged(){this.updatePlaying();const e=this.model.previous("playing"),t=this.model.get("playing");!e&&t?this.model.animate():this.model.pause()}updatePlaying(){const e=this.model.get("playing");this.playPauseButton.getElementsByTagName("i")[0].className=e?"fa fa-pause":"fa fa-play"}updateRepeat(){const e=this.model.get("repeat");this.repeatButton.style.display=this.model.get("show_repeat")?this.playPauseButton.style.display:"none",e?this.repeatButton.classList.add("mod-active"):this.repeatButton.classList.remove("mod-active")}}class ze extends m{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"FloatModel",value:0})}}class De extends ze{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"BoundedFloatModel",max:100,min:0})}}class Pe extends De{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"FloatSliderModel",_view_name:"FloatSliderView",step:1,orientation:"horizontal",_range:!1,readout:!0,readout_format:".2f",slider_color:null,continuous_update:!0,disabled:!1})}initialize(e,t){super.initialize(e,t),this.on("change:readout_format",this.update_readout_format,this),this.update_readout_format()}update_readout_format(){this.readout_formatter=(0,ve.GP)(this.get("readout_format"))}}class Ue extends De{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"FloatLogSliderModel",_view_name:"FloatLogSliderView",step:.1,orientation:"horizontal",_range:!1,readout:!0,readout_format:".3g",slider_color:null,continuous_update:!0,disabled:!1,base:10,value:1,min:0,max:4})}initialize(e,t){super.initialize(e,t),this.on("change:readout_format",this.update_readout_format,this),this.update_readout_format()}update_readout_format(){this.readout_formatter=(0,ve.GP)(this.get("readout_format"))}}class Fe extends Pe{}class Re extends Oe{constructor(){super(...arguments),this._parse_value=parseFloat}_validate_slide_value(e){return e}}class $e extends Te{constructor(){super(...arguments),this._parse_value=parseFloat}update(e){super.update(e);const t=this.model.get("value");this.readout.textContent=this.valueToString(t)}logCalc(e){const t=this.model.get("min"),s=this.model.get("max"),i=this.model.get("base");let a=Math.log(e)/Math.log(i);return a>s?a=s:aNumber(e),to:e=>e}}),this.$slider.noUiSlider.on("update",((e,t)=>{this.handleSliderUpdateEvent(e,t)})),this.$slider.noUiSlider.on("change",((e,t)=>{this.handleSliderChangeEvent(e,t)}))}valueToString(e){return(0,this.model.readout_formatter)(e)}stringToValue(e){return null===e?NaN:this._parse_value(e)}handleTextChange(){let e=this.stringToValue(this.readout.textContent);const t=this.model.get("min"),s=this.model.get("max"),i=this.model.get("base");isNaN(e)?this.readout.textContent=this.valueToString(this.model.get("value")):(e=Math.max(Math.min(e,Math.pow(i,s)),Math.pow(i,t)),e!==this.model.get("value")?(this.readout.textContent=this.valueToString(e),this.model.set("value",e),this.touch()):this.readout.textContent=this.valueToString(this.model.get("value")))}handleSliderUpdateEvent(e,t){const s=this.model.get("base"),i=Math.pow(s,this._validate_slide_value(e[0]));this.readout.textContent=this.valueToString(i),this.model.get("continuous_update")&&this.handleSliderChanged(e,t)}handleSliderChangeEvent(e,t){const s=this.model.get("base"),i=Math.pow(s,this._validate_slide_value(e[0]));this.readout.textContent=this.valueToString(i),this.handleSliderChanged(e,t)}handleSliderChanged(e,t){if(this._updating_slider)return;const s=this.model.get("base"),i=Math.pow(s,this._validate_slide_value(e[0]));this.model.set("value",i,{updated_view:this}),this.touch()}updateSliderValue(e,t,s){if(s.updated_view===this)return;const i=this.logCalc(this.model.get("value"));this.$slider.noUiSlider.set(i)}updateSliderOptions(e){this.$slider.noUiSlider.updateOptions({start:this.logCalc(this.model.get("value")),range:{min:this.model.get("min"),max:this.model.get("max")},step:this.model.get("step")})}_validate_slide_value(e){return e}}class Ne extends Se{constructor(){super(...arguments),this._parse_value=parseFloat,this._range_regex=/^\s*([+-]?(?:\d*\.?\d+|\d+\.)(?:[eE][-:]?\d+)?)\s*[-:–]\s*([+-]?(?:\d*\.?\d+|\d+\.)(?:[eE][+-]?\d+)?)/}_validate_slide_value(e){return e}}class He extends ze{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"FloatTextModel",_view_name:"FloatTextView",disabled:!1,continuous_update:!1})}}class Ke extends De{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"BoundedFloatTextModel",_view_name:"FloatTextView",disabled:!1,continuous_update:!1,step:.1})}}class qe extends Ve{constructor(){super(...arguments),this._parse_value=parseFloat,this._default_step="any"}handleKeypress(e){e.stopPropagation()}handleKeyUp(e){}}class Ge extends De{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"FloatProgressModel",_view_name:"ProgressView",orientation:"horizontal",bar_style:"",style:null})}}class Je extends g{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"ControllerButtonModel",_view_name:"ControllerButtonView",value:0,pressed:!1})}}class Ye extends i.DOMWidgetView{render(){this.el.classList.add("jupyter-widgets"),this.el.classList.add("widget-controller-button"),this.el.style.width="fit-content",this.support=document.createElement("div"),this.support.style.position="relative",this.support.style.margin="1px",this.support.style.width="16px",this.support.style.height="16px",this.support.style.border="1px solid black",this.support.style.background="lightgray",this.el.appendChild(this.support),this.bar=document.createElement("div"),this.bar.style.position="absolute",this.bar.style.width="100%",this.bar.style.bottom="0px",this.bar.style.background="gray",this.support.appendChild(this.bar),this.update(),this.label=document.createElement("div"),this.label.textContent=this.model.get("description"),this.label.style.textAlign="center",this.el.appendChild(this.label)}update(){this.bar.style.height=100*this.model.get("value")+"%"}}class Qe extends g{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"ControllerAxisModel",_view_name:"ControllerAxisView",value:0})}}class Xe extends i.DOMWidgetView{render(){this.el.classList.add("jupyter-widgets"),this.el.classList.add("widget-controller-axis"),this.el.style.width="16px",this.el.style.padding="4px",this.support=document.createElement("div"),this.support.style.position="relative",this.support.style.margin="1px",this.support.style.width="4px",this.support.style.height="64px",this.support.style.border="1px solid black",this.support.style.background="lightgray",this.bullet=document.createElement("div"),this.bullet.style.position="absolute",this.bullet.style.margin="-3px",this.bullet.style.boxSizing="unset",this.bullet.style.width="10px",this.bullet.style.height="10px",this.bullet.style.background="gray",this.label=document.createElement("div"),this.label.textContent=this.model.get("description"),this.label.style.textAlign="center",this.support.appendChild(this.bullet),this.el.appendChild(this.support),this.el.appendChild(this.label),this.update()}update(){this.bullet.style.top=50*(this.model.get("value")+1)+"%"}}class Ze extends g{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"ControllerModel",_view_name:"ControllerView",index:0,name:"",mapping:"",connected:!1,timestamp:0,buttons:[],axes:[]})}initialize(e,t){super.initialize(e,t),void 0===navigator.getGamepads?(this.readout="This browser does not support gamepads.",console.error(this.readout)):(this.readout="Connect gamepad and press any button.",this.get("connected")?this.update_loop():this.wait_loop())}wait_loop(){const e=this.get("index"),t=navigator.getGamepads()[e];t?this.setup(t).then((e=>{this.set(e),this.save_changes(),window.requestAnimationFrame(this.update_loop.bind(this))})):window.requestAnimationFrame(this.wait_loop.bind(this))}setup(e){return this.set({name:e.id,mapping:e.mapping,connected:e.connected,timestamp:e.timestamp}),i.resolvePromisesDict({buttons:Promise.all(e.buttons.map(((e,t)=>this._create_button_model(t)))),axes:Promise.all(e.axes.map(((e,t)=>this._create_axis_model(t))))})}update_loop(){const e=this.get("index"),t=this.get("name"),s=navigator.getGamepads()[e];s&&e===s.index&&t===s.id?(this.set({timestamp:s.timestamp,connected:s.connected}),this.save_changes(),this.get("buttons").forEach((function(e,t){e.set({value:s.buttons[t].value,pressed:s.buttons[t].pressed}),e.save_changes()})),this.get("axes").forEach((function(e,t){e.set("value",s.axes[t]),e.save_changes()})),window.requestAnimationFrame(this.update_loop.bind(this))):this.reset_gamepad()}reset_gamepad(){this.get("buttons").forEach((function(e){e.close()})),this.get("axes").forEach((function(e){e.close()})),this.set({name:"",mapping:"",connected:!1,timestamp:0,buttons:[],axes:[]}),this.save_changes(),window.requestAnimationFrame(this.wait_loop.bind(this))}_create_button_model(e){return this.widget_manager.new_widget({model_name:"ControllerButtonModel",model_module:"@jupyter-widgets/controls",model_module_version:this.get("_model_module_version"),view_name:"ControllerButtonView",view_module:"@jupyter-widgets/controls",view_module_version:this.get("_view_module_version")}).then((function(t){return t.set("description",e),t}))}_create_axis_model(e){return this.widget_manager.new_widget({model_name:"ControllerAxisModel",model_module:"@jupyter-widgets/controls",model_module_version:this.get("_model_module_version"),view_name:"ControllerAxisView",view_module:"@jupyter-widgets/controls",view_module_version:this.get("_view_module_version")}).then((function(t){return t.set("description",e),t}))}}Ze.serializers=Object.assign(Object.assign({},g.serializers),{buttons:{deserialize:i.unpack_models},axes:{deserialize:i.unpack_models}});class et extends i.DOMWidgetView{_createElement(e){return this.luminoWidget=new i.JupyterLuminoPanelWidget({view:this}),this.luminoWidget.node}_setElement(e){if(this.el||e!==this.luminoWidget.node)throw new Error("Cannot reset the DOM element.");this.el=this.luminoWidget.node,this.$el=W()(this.luminoWidget.node)}initialize(e){super.initialize(e),this.button_views=new i.ViewList(this.add_button,null,this),this.listenTo(this.model,"change:buttons",((e,t)=>{this.button_views.update(t)})),this.axis_views=new i.ViewList(this.add_axis,null,this),this.listenTo(this.model,"change:axes",((e,t)=>{this.axis_views.update(t)})),this.listenTo(this.model,"change:name",this.update_label)}render(){this.el.classList.add("jupyter-widgets"),this.el.classList.add("widget-controller"),this.label=document.createElement("div"),this.el.appendChild(this.label),this.axis_box=new I.Panel,this.axis_box.node.style.display="flex",this.luminoWidget.addWidget(this.axis_box),this.button_box=new I.Panel,this.button_box.node.style.display="flex",this.luminoWidget.addWidget(this.button_box),this.button_views.update(this.model.get("buttons")),this.axis_views.update(this.model.get("axes")),this.update_label()}update_label(){this.label.textContent=this.model.get("name")||this.model.readout}add_button(e){const t=new I.Widget;return this.button_box.addWidget(t),this.create_child_view(e).then((e=>{const s=L.ArrayExt.firstIndexOf(this.button_box.widgets,t);return this.button_box.insertWidget(s,e.luminoWidget),t.dispose(),e})).catch((0,i.reject)("Could not add child button view to controller",!0))}add_axis(e){const t=new I.Widget;return this.axis_box.addWidget(t),this.create_child_view(e).then((e=>{const s=L.ArrayExt.firstIndexOf(this.axis_box.widgets,t);return this.axis_box.insertWidget(s,e.luminoWidget),t.dispose(),e})).catch((0,i.reject)("Could not add child axis view to controller",!0))}remove(){super.remove(),this.button_views.remove(),this.axis_views.remove()}}class tt extends m{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"SelectionModel",index:"",_options_labels:[],disabled:!1})}}class st extends h{render(){super.render(),this.el.classList.add("jupyter-widgets"),this.el.classList.add("widget-inline-hbox")}update(){super.update(),this.listbox&&(this.listbox.disabled=this.model.get("disabled")),this.updateTabindex(),this.updateTooltip()}updateTabindex(){if(!this.listbox)return;const e=this.model.get("tabbable");!0===e?this.listbox.setAttribute("tabIndex","0"):!1===e?this.listbox.setAttribute("tabIndex","-1"):null===e&&this.listbox.removeAttribute("tabIndex")}updateTooltip(){if(!this.listbox)return;const e=this.model.get("tooltip");e?0===this.model.get("description").length&&this.listbox.setAttribute("title",e):this.listbox.removeAttribute("title")}}class it extends tt{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"DropdownModel",_view_name:"DropdownView",button_style:""})}}class at extends st{render(){super.render(),this.el.classList.add("widget-dropdown"),this.listbox=document.createElement("select"),this.listbox.id=this.label.htmlFor=(0,i.uuid)(),this.el.appendChild(this.listbox),this._updateOptions(),this.update()}update(e){(null==e?void 0:e.updated_view)!==this&&this.model.hasChanged("_options_labels")&&this._updateOptions();const t=this.model.get("index");return this.listbox.selectedIndex=null===t?-1:t,super.update()}_updateOptions(){this.listbox.textContent="";const e=this.model.get("_options_labels");for(let t=0;te.value));let i=t.length!==s.length;if(!i)for(let e=0,a=t.length;e{const s=document.createElement("label");s.textContent=e,this.container.appendChild(s);const i=document.createElement("input");i.setAttribute("type","radio"),i.value=t.toString(),i.setAttribute("data-value",encodeURIComponent(e)),s.appendChild(i)}))),t.forEach(((e,t)=>{const s='input[data-value="'+encodeURIComponent(e)+'"]',i=this.container.querySelectorAll(s);if(i.length>0){const e=i[0];e.checked=this.model.get("index")===t,e.disabled=this.model.get("disabled")}})),setTimeout(this.adjustPadding,0,this),super.update(e)}adjustPadding(e){const t=window.getComputedStyle(e.el),s=parseInt(t.marginTop,10)+parseInt(t.marginBottom,10),i=e.label.offsetHeight+s,a=window.getComputedStyle(e.container),l=parseInt(a.marginBottom,10),d=(e.el.offsetHeight+s-l)%i,n=0===d?0:i-d;e.container.style.marginBottom=n+"px"}events(){return{'click input[type="radio"]':"_handle_click"}}_handle_click(e){const t=e.target;this.model.set("index",parseInt(t.value,10),{updated_view:this}),this.touch()}handle_message(e){if("focus"==e.do)this.container.firstElementChild.focus();else if("blur"==e.do)for(let e=0;ee.value));let h=!1;for(let e=0,a=t.length;e{let i;i=0!==e.trim().length||s[t]&&0!==s[t].trim().length?l(e):" ";const o=document.createElement("i"),r=document.createElement("button");s[t]&&(o.className="fa fa-"+s[t]),r.setAttribute("type","button"),r.className="widget-toggle-button jupyter-button",a&&r.classList.add(a),r.innerHTML=i,r.setAttribute("data-value",encodeURIComponent(e)),r.setAttribute("value",t.toString()),r.appendChild(o),r.disabled=n,d[t]&&r.setAttribute("title",d[t]),this.update_style_traits(r),this.buttongroup.appendChild(r)}))),t.forEach(((e,t)=>{const s='[data-value="'+encodeURIComponent(e)+'"]',i=this.buttongroup.querySelector(s);this.model.get("index")===t?i.classList.add("mod-active"):i.classList.remove("mod-active")})),this.stylePromise.then((function(e){e&&e.style()})),super.update(e)}update_style_traits(e){for(const t in this._css_state)if(Object.prototype.hasOwnProperty.call(this._css_state,"name"))if("margin"===t)this.buttongroup.style[t]=this._css_state[t];else if("width"!==t)if(e)e.style[t]=this._css_state[t];else{const e=this.buttongroup.querySelectorAll("button");e.length&&(e[0].style[t]=this._css_state[t])}}update_button_style(){const e=this.buttongroup.querySelectorAll("button");for(let t=0;tNumber(e),to:e=>Math.round(e)}}),this.$slider.noUiSlider.on("update",((e,t)=>{this.handleSliderUpdateEvent(e,t)})),this.$slider.noUiSlider.on("change",((e,t)=>{this.handleSliderChangeEvent(e,t)}))}events(){return{slide:"handleSliderChange",slidestop:"handleSliderChanged"}}updateSelection(){const e=this.model.get("index");this.updateReadout(e)}updateReadout(e){const t=this.model.get("_options_labels")[e];this.readout.textContent=t}handleSliderUpdateEvent(e,t){const s=e[0];this.updateReadout(s),this.model.get("continuous_update")&&this.handleSliderChanged(e,t)}handleSliderChangeEvent(e,t){const s=e[0];this.updateReadout(s),this.handleSliderChanged(e,t)}handleSliderChanged(e,t){const s=e[0];this.updateReadout(s),this.model.set("index",s,{updated_view:this}),this.touch()}updateSliderOptions(e){const t=this.model.get("_options_labels").length-1;this.$slider.noUiSlider.updateOptions({start:this.model.get("index"),range:{min:0,max:t},step:1})}updateSliderValue(e,t,s){if(s.updated_view===this)return;const i=this.$slider.noUiSlider.get(),a=this.model.get("index");i!==a&&this.$slider.noUiSlider.set(a)}}class gt extends tt{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"MultipleSelectionModel"})}}class mt extends gt{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"SelectMultipleModel",_view_name:"SelectMultipleView",rows:null})}}class _t extends dt{initialize(e){super.initialize(e),this.listbox.multiple=!0}render(){super.render(),this.el.classList.add("widget-select-multiple")}updateSelection(){const e=this.model.get("index")||[],t=this.listbox.options;this.listbox.selectedIndex=-1,e.forEach((e=>{t[e].selected=!0}))}_handle_change(){const e=Array.prototype.map.call(this.listbox.selectedOptions||[],(function(e){return e.index}));this.model.set("index",e,{updated_view:this}),this.touch()}}class bt extends gt{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"SelectionSliderModel",_view_name:"SelectionSliderView",orientation:"horizontal",readout:!0,continuous_update:!0})}}class vt extends pt{render(){super.render()}updateSelection(e){e=e||this.model.get("index"),this.updateReadout(e)}updateReadout(e){const t=this.model.get("_options_labels"),s=t[e[0]],i=t[e[1]];this.readout.textContent=`${s}-${i}`}handleSliderUpdateEvent(e,t){const s=e.map(Math.trunc);this.updateReadout(s),this.model.get("continuous_update")&&this.handleSliderChanged(e,t)}handleSliderChanged(e,t){const s=e.map(Math.round);this.updateReadout(s),this.model.set("index",s.slice(),{updated_view:this}),this.touch()}updateSliderValue(e,t,s){if(s.updated_view===this)return;const i=this.$slider.noUiSlider.get().map(Math.round),a=this.model.get("index").map(Math.round);i[0]===a[0]&&i[1]===a[1]||this.$slider.noUiSlider.set(a)}}var xt=s(4602),ft=s(6209);class wt extends I.Panel{constructor(){super(...arguments),this._widgetRemoved=new xt.Signal(this)}get widgetRemoved(){return this._widgetRemoved}onChildRemoved(e){this._widgetRemoved.emit(e.child)}}class yt extends I.Widget{constructor(e={}){super(),this._currentChanged=new xt.Signal(this),this.addClass("jupyter-widget-TabPanel"),this.tabBar=new I.TabBar(e),this.tabBar.addClass("jupyter-widget-TabPanel-tabBar"),this.tabContents=new wt,this.tabContents.addClass("jupyter-widget-TabPanel-tabContents"),this.tabBar.tabMoved.connect(this._onTabMoved,this),this.tabBar.currentChanged.connect(this._onCurrentChanged,this),this.tabBar.tabCloseRequested.connect(this._onTabCloseRequested,this),this.tabBar.tabActivateRequested.connect(this._onTabActivateRequested,this),this.tabContents.widgetRemoved.connect(this._onWidgetRemoved,this);const t=new I.PanelLayout;t.addWidget(this.tabBar),t.addWidget(this.tabContents),this.layout=t}get currentChanged(){return this._currentChanged}get currentIndex(){const e=this.tabBar.currentIndex;return-1===e?null:e}set currentIndex(e){this.tabBar.currentIndex=null===e?-1:e}get currentWidget(){const e=this.tabBar.currentTitle;return e?e.owner:null}set currentWidget(e){this.tabBar.currentTitle=e?e.title:null}get tabsMovable(){return this.tabBar.tabsMovable}set tabsMovable(e){this.tabBar.tabsMovable=e}get widgets(){return this.tabContents.widgets}addWidget(e){this.insertWidget(this.widgets.length,e)}insertWidget(e,t){t!==this.currentWidget&&t.hide(),this.tabContents.insertWidget(e,t),this.tabBar.insertTab(e,t.title)}_onCurrentChanged(e,t){const{previousIndex:s,previousTitle:i,currentIndex:a,currentTitle:l}=t,d=i?i.owner:null,n=l?l.owner:null;d&&d.hide(),n&&n.show(),this._currentChanged.emit({previousIndex:s,previousWidget:d,currentIndex:a,currentWidget:n}),(ft.Platform.IS_EDGE||ft.Platform.IS_IE)&&V.MessageLoop.flush()}_onTabActivateRequested(e,t){t.title.owner.activate()}_onTabCloseRequested(e,t){t.title.owner.close()}_onTabMoved(e,t){this.tabContents.insertWidget(t.toIndex,t.title.owner)}_onWidgetRemoved(e,t){this.tabBar.removeTab(t.title)}}class Ct{constructor(e,t={}){this._array=null,this._value=null,this._previousValue=null,this._selectionChanged=new xt.Signal(this),this._array=e,this._insertBehavior=t.insertBehavior||"select-item-if-needed",this._removeBehavior=t.removeBehavior||"select-item-after"}get selectionChanged(){return this._selectionChanged}adjustSelectionForSet(e){const t=this.index,s=this.value;if(e!==t)return;this._updateSelectedValue();const i=this.value;this._previousValue=null,s!==i&&this._selectionChanged.emit({previousIndex:t,previousValue:s,currentIndex:t,currentValue:i})}get value(){return this._value}set value(e){null===e||null===this._array?this.index=null:this.index=L.ArrayExt.firstIndexOf(this._array,e)}get index(){return this._index}set index(e){let t;if(null!==e&&null!==this._array?(t=Math.floor(e),(t<0||t>=this._array.length)&&(t=null)):t=null,this._index===t)return;const s=this._index,i=this._value;this._index=t,this._updateSelectedValue(),this._previousValue=i,this._selectionChanged.emit({previousIndex:s,previousValue:i,currentIndex:t,currentValue:this._value})}get insertBehavior(){return this._insertBehavior}set insertBehavior(e){this._insertBehavior=e}get removeBehavior(){return this._removeBehavior}set removeBehavior(e){this._removeBehavior=e}adjustSelectionForInsert(e,t){const s=this._value,i=this._index,a=this._insertBehavior;if("select-item"===a||"select-item-if-needed"===a&&null===i)return this._index=e,this._value=t,this._previousValue=s,void this._selectionChanged.emit({previousIndex:i,previousValue:s,currentIndex:e,currentValue:t});null!==i&&i>=e&&this._index++}clearSelection(){const e=this._index,t=this._value;this._index=null,this._value=null,this._previousValue=null,null!==e&&this._selectionChanged.emit({previousIndex:e,previousValue:t,currentIndex:this._index,currentValue:this._value})}adjustSelectionForRemove(e,t){if(null===this._index)return;const s=this._index,i=this._removeBehavior;if(s===e){if(!this._array||0===this._array.length)return this._index=null,this._value=null,this._previousValue=null,void this._selectionChanged.emit({previousIndex:e,previousValue:t,currentIndex:this._index,currentValue:this._value});if("select-item-after"===i)return this._index=Math.min(e,this._array.length-1),this._updateSelectedValue(),this._previousValue=null,void this._selectionChanged.emit({previousIndex:e,previousValue:t,currentIndex:this._index,currentValue:this._value});if("select-item-before"===i)return this._index=Math.max(0,e-1),this._updateSelectedValue(),this._previousValue=null,void this._selectionChanged.emit({previousIndex:e,previousValue:t,currentIndex:this._index,currentValue:this._value});if("select-previous-item"===i)return this._previousValue?this.value=this._previousValue:(this._index=Math.min(e,this._array.length-1),this._updateSelectedValue()),this._previousValue=null,void this._selectionChanged.emit({previousIndex:e,previousValue:t,currentIndex:this._index,currentValue:this.value});this._index=null,this._value=null,this._previousValue=null,this._selectionChanged.emit({previousIndex:e,previousValue:t,currentIndex:this._index,currentValue:this._value})}else s>e&&this._index--}_updateSelectedValue(){const e=this._index;this._value=null!==e&&this._array?this._array[e]:null}}const Mt="jupyter-widget-Collapse-open";class jt extends I.Widget{constructor(e){super(e),this._collapseChanged=new xt.Signal(this),this.addClass("jupyter-widget-Collapse"),this._header=new I.Widget,this._header.addClass("jupyter-widget-Collapse-header"),this._header.node.addEventListener("click",this);const t=document.createElement("i");t.classList.add("fa","fa-fw","fa-caret-right"),this._header.node.appendChild(t),this._header.node.appendChild(document.createElement("span")),this._content=new I.Panel,this._content.addClass("jupyter-widget-Collapse-contents");const s=new I.PanelLayout;this.layout=s,s.addWidget(this._header),s.addWidget(this._content),e.widget&&(this.widget=e.widget),this.collapsed=!1}dispose(){this.isDisposed||(super.dispose(),this._header=null,this._widget=null,this._content=null)}get widget(){return this._widget}set widget(e){const t=this._widget;t&&(t.disposed.disconnect(this._onChildDisposed,this),t.title.changed.disconnect(this._onTitleChanged,this),t.parent=null),this._widget=e,e.disposed.connect(this._onChildDisposed,this),e.title.changed.connect(this._onTitleChanged,this),this._onTitleChanged(e.title),this._content.addWidget(e)}get collapsed(){return this._collapsed}set collapsed(e){e!==this._collapsed&&(e?this._collapse():this._uncollapse())}toggle(){this.collapsed=!this.collapsed}get collapseChanged(){return this._collapseChanged}_collapse(){this._collapsed=!0,this._content&&this._content.hide(),this.removeClass(Mt),this._header.node.children[0].classList.add("fa-caret-right"),this._header.node.children[0].classList.remove("fa-caret-down"),this._collapseChanged.emit(void 0)}_uncollapse(){this._collapsed=!1,this._content&&this._content.show(),this.addClass(Mt),this._header.node.children[0].classList.add("fa-caret-down"),this._header.node.children[0].classList.remove("fa-caret-right"),this._collapseChanged.emit(void 0)}handleEvent(e){"click"===e.type&&this._evtClick(e)}_evtClick(e){this.toggle()}_onTitleChanged(e){this._header.node.children[1].textContent=this._widget.title.label}_onChildDisposed(e){this.dispose()}}const Tt="jupyter-widget-Accordion-child-active";class St extends I.Panel{constructor(e){super(e),this._selection=new Ct(this.widgets),this._selection.selectionChanged.connect(this._onSelectionChanged,this),this.addClass("jupyter-widget-Accordion")}get collapseWidgets(){return this.layout.widgets}get selection(){return this._selection}indexOf(e){return L.ArrayExt.findFirstIndex(this.collapseWidgets,(t=>t.widget===e))}addWidget(e){const t=this._wrapWidget(e);return t.collapsed=!0,super.addWidget(t),this._selection.adjustSelectionForInsert(this.widgets.length-1,t),t}insertWidget(e,t){const s=this._wrapWidget(t);s.collapsed=!0,super.insertWidget(e,s),this._selection.adjustSelectionForInsert(e,s)}removeWidget(e){const t=this.indexOf(e);if(t>=0){const s=this.collapseWidgets[t];e.parent=null,s.dispose(),this._selection.adjustSelectionForRemove(t,null)}}_wrapWidget(e){const t=new jt({widget:e});return t.addClass("jupyter-widget-Accordion-child"),t.collapseChanged.connect(this._onCollapseChange,this),t}_onCollapseChange(e){e.collapsed?this._selection.value===e&&e.collapsed&&(this._selection.value=null):this._selection.value=e}_onSelectionChanged(e,t){const s=t.previousValue,i=t.currentValue;s&&(s.collapsed=!0,s.removeClass(Tt)),i&&(i.collapsed=!1,i.addClass(Tt))}}class Ot extends E{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"SelectionContainerModel",selected_index:null,titles:[]})}}class kt extends Ot{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"AccordionModel",_view_name:"AccordionView"})}}class Lt extends St{constructor(e){const t=e.view;delete e.view,super(e),this._view=t}processMessage(e){var t;super.processMessage(e),null===(t=this._view)||void 0===t||t.processLuminoMessage(e)}dispose(){this.isDisposed||(super.dispose(),this._view.remove(),this._view=null)}}class Vt extends i.DOMWidgetView{_createElement(e){return this.luminoWidget=new Lt({view:this}),this.luminoWidget.node}_setElement(e){if(this.el||e!==this.luminoWidget.node)throw new Error("Cannot reset the DOM element.");this.el=this.luminoWidget.node,this.$el=W()(this.luminoWidget.node)}initialize(e){super.initialize(e),this.children_views=new i.ViewList(this.add_child_view,this.remove_child_view,this),this.listenTo(this.model,"change:children",(()=>this.updateChildren())),this.listenTo(this.model,"change:selected_index",(()=>this.update_selected_index())),this.listenTo(this.model,"change:titles",(()=>this.update_titles()))}render(){var e;super.render();const t=this.luminoWidget;t.addClass("jupyter-widgets"),t.addClass("widget-accordion"),t.addClass("widget-container"),t.selection.selectionChanged.connect((e=>{this.updatingChildren||(this.model.set("selected_index",t.selection.index),this.touch())})),null===(e=this.children_views)||void 0===e||e.update(this.model.get("children")),this.update_titles(),this.update_selected_index()}updateChildren(){var e;this.updatingChildren=!0,this.luminoWidget.selection.index=null,null===(e=this.children_views)||void 0===e||e.update(this.model.get("children")),this.update_selected_index(),this.updatingChildren=!1}update_titles(){const e=this.luminoWidget.collapseWidgets,t=this.model.get("titles");for(let s=0;s{const t=e.luminoWidget;return t.title.label=a.title.label,s.collapseWidgets[s.indexOf(a)].widget=t,a.dispose(),e})).catch((0,i.reject)("Could not add child view to box",!0))}remove(){this.children_views=null,super.remove()}}class It extends Ot{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"TabModel",_view_name:"TabView"})}}class At extends yt{constructor(e){const t=e.view;delete e.view,super(e),this._view=t,V.MessageLoop.installMessageHook(this.tabContents,((e,t)=>(this._view.processLuminoMessage(t),!0)))}dispose(){this.isDisposed||(super.dispose(),this._view.remove(),this._view=null)}}class Wt extends i.DOMWidgetView{constructor(){super(...arguments),this.updatingTabs=!1}_createElement(e){return this.luminoWidget=new At({view:this}),this.luminoWidget.node}_setElement(e){if(this.el||e!==this.luminoWidget.node)throw new Error("Cannot reset the DOM element.");this.el=this.luminoWidget.node,this.$el=W()(this.luminoWidget.node)}initialize(e){super.initialize(e),this.childrenViews=new i.ViewList(this.addChildView,(e=>{e.remove()}),this),this.listenTo(this.model,"change:children",(()=>this.updateTabs())),this.listenTo(this.model,"change:titles",(()=>this.updateTitles()))}render(){super.render();const e=this.luminoWidget;e.addClass("jupyter-widgets"),e.addClass("widget-container"),e.addClass("jupyter-widget-tab"),e.addClass("widget-tab"),e.tabsMovable=!0,e.tabBar.insertBehavior="none",e.tabBar.currentChanged.connect(this._onTabChanged,this),e.tabBar.tabMoved.connect(this._onTabMoved,this),e.tabBar.addClass("widget-tab-bar"),e.tabContents.addClass("widget-tab-contents"),e.tabBar.tabsMovable=!1,this.updateTabs(),this.update()}updateTabs(){var e;this.updatingTabs=!0,this.luminoWidget.currentIndex=null,null===(e=this.childrenViews)||void 0===e||e.update(this.model.get("children")),this.luminoWidget.currentIndex=this.model.get("selected_index"),this.updatingTabs=!1}addChildView(e,t){const s=this.model.get("titles")[t]||"",a=this.luminoWidget,l=new I.Widget;return l.title.label=s,a.addWidget(l),this.create_child_view(e).then((e=>{const t=e.luminoWidget;t.title.label=l.title.label,t.title.closable=!1;const s=L.ArrayExt.firstIndexOf(a.widgets,l);return a.insertWidget(s+1,t),l.dispose(),e})).catch((0,i.reject)("Could not add child view to box",!0))}update(){return this.updateSelectedIndex(),super.update()}updateTitles(){const e=this.model.get("titles")||[];(0,L.each)(this.luminoWidget.widgets,((t,s)=>{t.title.label=e[s]||""}))}updateSelectedIndex(){this.luminoWidget.currentIndex=this.model.get("selected_index")}remove(){this.childrenViews=null,super.remove()}_onTabChanged(e,t){if(!this.updatingTabs){const e=t.currentIndex;this.model.set("selected_index",-1===e?null:e),this.touch()}}_onTabMoved(e,t){const s=this.model.get("children").slice();L.ArrayExt.move(s,t.fromIndex,t.toIndex),this.model.set("children",s),this.touch()}}class Et extends Ot{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"StackModel",_view_name:"StackView"})}}class Bt extends D{initialize(e){super.initialize(e),this.listenTo(this.model,"change:selected_index",this.update_children)}update_children(){var e;let t;t=null===this.model.get("selected_index")?[]:[this.model.get("children")[this.model.get("selected_index")]],null===(e=this.children_views)||void 0===e||e.update(t).then((e=>{e.forEach((e=>{V.MessageLoop.postMessage(e.luminoWidget,I.Widget.ResizeMessage.UnknownSize)}))}))}}var zt=s(8996);function Dt(e){for(;e.firstChild;)e.removeChild(e.firstChild)}class Pt{constructor(e,t,s){this.start=e,this.dx=t,this.max=s}isSelected(e){let t,s;return this.dx>=0?(t=this.start,s=this.start+this.dx):(t=this.start+this.dx,s=this.start),t<=e&&ethis.max&&(this.dx=this.max-this.start),this.start+this.dx<0&&(this.dx=-this.start)}}class Ut extends g{defaults(){return Object.assign(Object.assign({},super.defaults()),{value:[],placeholder:"​",allowed_tags:null,allow_duplicates:!0})}}class Ft extends i.DOMWidgetView{constructor(){super(...arguments),this.hoveredTag=null,this.hoveredTagIndex=null}render(){super.render(),this.el.classList.add("jupyter-widgets"),this.el.classList.add("jupyter-widget-tagsinput"),this.taginputWrapper=document.createElement("div"),this.model.get("value").length?this.taginputWrapper.style.display="none":this.taginputWrapper.style.display="inline-block",this.datalistID=(0,i.uuid)(),this.taginput=document.createElement("input"),this.taginput.classList.add("jupyter-widget-tag"),this.taginput.classList.add("jupyter-widget-taginput"),this.taginput.setAttribute("list",this.datalistID),this.taginput.setAttribute("type","text"),this.autocompleteList=document.createElement("datalist"),this.autocompleteList.id=this.datalistID,this.updateAutocomplete(),this.model.on("change:allowed_tags",this.updateAutocomplete.bind(this)),this.updatePlaceholder(),this.model.on("change:placeholder",this.updatePlaceholder.bind(this)),this.taginputWrapper.classList.add("widget-text"),this.taginputWrapper.appendChild(this.taginput),this.taginputWrapper.appendChild(this.autocompleteList),this.el.onclick=this.focus.bind(this),this.el.ondrop=e=>{const t=null==this.hoveredTagIndex?this.tags.length:this.hoveredTagIndex;return this.ondrop(e,t)},this.el.ondragover=this.ondragover.bind(this),this.taginput.onchange=this.handleValueAdded.bind(this),this.taginput.oninput=this.resizeInput.bind(this),this.taginput.onkeydown=this.handleKeyEvent.bind(this),this.taginput.onblur=this.loseFocus.bind(this),this.resizeInput(),this.inputIndex=this.model.get("value").length,this.selection=null,this.preventLoosingFocus=!1,this.update()}update(){this.preventLoosingFocus=!0,Dt(this.el),this.tags=[];const e=this.model.get("value");this.inputIndex=e.length;for(const t in e){const s=parseInt(t),i=this.createTag(e[s],s,null!=this.selection&&this.selection.isSelected(s));i.draggable=!0,i.ondragstart=((e,t)=>s=>{this.ondragstart(s,e,t,this.model.model_id)})(s,e[s]),i.ondrop=(e=>t=>{this.ondrop(t,e)})(s),i.ondragover=this.ondragover.bind(this),i.ondragenter=(e=>t=>{this.ondragenter(t,e)})(s),i.ondragend=this.ondragend.bind(this),this.tags.push(i),this.el.appendChild(i)}return this.el.insertBefore(this.taginputWrapper,this.el.children[this.inputIndex]),this.model.get("value").length?this.taginputWrapper.style.display="none":this.taginputWrapper.style.display="inline-block",this.preventLoosingFocus=!1,super.update()}updateAutocomplete(){Dt(this.autocompleteList);const e=this.model.get("allowed_tags");for(const t of e){const e=document.createElement("option");e.value=t,this.autocompleteList.appendChild(e)}}updatePlaceholder(){this.taginput.placeholder=this.model.get("placeholder"),this.resizeInput()}updateTags(){const e=this.model.get("value");for(const t in this.tags){const s=parseInt(t);this.updateTag(this.tags[s],e[s],s,null!=this.selection&&this.selection.isSelected(s))}}handleValueAdded(e){const t=this.taginput.value.replace(/^\s+|\s+$/g,""),s=this.inputIndex;""!=t&&(this.inputIndex++,this.addTag(s,t)&&(this.taginput.value="",this.resizeInput(),this.focus()))}addTag(e,t){const s=this.model.get("value");let i;try{i=this.validateValue(t)}catch(e){return!1}const a=this.model.get("allowed_tags");if(a.length&&!a.includes(i))return!1;if(!this.model.get("allow_duplicates")&&s.includes(i))return!1;this.selection=null;const l=[...s];return l.splice(e,0,i),this.model.set("value",l),this.model.save_changes(),!0}resizeInput(){let e;e=0!=this.taginput.value.length?this.taginput.value:this.model.get("placeholder");const t=e.length+1;this.taginput.setAttribute("size",String(t))}handleKeyEvent(e){const t=this.model.get("value").length;if(this.taginput.value.length)return;const s=this.inputIndex;switch(e.key){case"ArrowLeft":e.ctrlKey&&e.shiftKey&&this.select(s,-s),!e.ctrlKey&&e.shiftKey&&this.select(s,-1),e.ctrlKey?this.inputIndex=0:this.inputIndex--;break;case"ArrowRight":e.ctrlKey&&e.shiftKey&&this.select(s,t-s),!e.ctrlKey&&e.shiftKey&&this.select(s,1),e.ctrlKey?this.inputIndex=t:this.inputIndex++;break;case"Backspace":this.selection?this.removeSelectedTags():this.removeTag(this.inputIndex-1);break;case"Delete":this.selection?this.removeSelectedTags():this.removeTag(this.inputIndex);break;default:return}var i,a;e.shiftKey||(this.selection=null),this.inputIndex=(i=this.inputIndex,a=t,Math.min(Math.max(i,0),a)),this.update(),this.focus()}ondragstart(e,t,s,i){null!=e.dataTransfer&&(e.dataTransfer.setData("index",String(t)),e.dataTransfer.setData("tagValue",String(s)),e.dataTransfer.setData("origin",i))}ondrop(e,t){if(null==e.dataTransfer)return;e.preventDefault(),e.stopPropagation();const s=e.dataTransfer.getData("tagValue"),i=parseInt(e.dataTransfer.getData("index")),a=e.dataTransfer.getData("origin")==this.model.model_id;if(!isNaN(i)){if(a){const e=[...this.model.get("value")];return i=0;t--)null!=this.selection&&this.selection.isSelected(t)&&(e.splice(t,1),t()=>{this.removeTag(e),this.loseFocus()})(t),i}getTagText(e){return e}updateTag(e,t,s,i){i?e.classList.add("mod-active"):e.classList.remove("mod-active")}}$t.class_map={primary:"mod-primary",success:"mod-success",info:"mod-info",warning:"mod-warning",danger:"mod-danger"};class Nt extends Ut{defaults(){return Object.assign(Object.assign({},super.defaults()),{value:[],_view_name:"ColorsInputView",_model_name:"ColorsInputModel"})}}class Ht extends Ft{createTag(e,t,s){const i=document.createElement("div"),a=e,l=zt.Ay(e).darker().toString();i.classList.add("jupyter-widget-tag"),i.classList.add("jupyter-widget-colortag"),s?(i.classList.add("mod-active"),i.style.backgroundColor=l):i.style.backgroundColor=a;const d=document.createElement("i");return d.classList.add("fa"),d.classList.add("fa-times"),d.classList.add("jupyter-widget-tag-close"),i.appendChild(d),d.onmousedown=(e=>()=>{this.removeTag(e),this.loseFocus()})(t),i}updateTag(e,t,s,i){const a=t,l=zt.Ay(t).darker().toString();i?(e.classList.add("mod-active"),e.style.backgroundColor=l):(e.classList.remove("mod-active"),e.style.backgroundColor=a)}validateValue(e){if(null==zt.Ay(e))throw e+" is not a valid Color";return e}}class Kt extends Rt{defaults(){return Object.assign(Object.assign({},super.defaults()),{min:null,max:null})}}class qt extends $t{render(){this.model.on("change:format",(()=>{this.formatter=ve.GP(this.model.get("format")),this.update()})),this.formatter=ve.GP(this.model.get("format")),super.render()}getTagText(e){return this.formatter(this.parseNumber(e))}validateValue(e){const t=this.parseNumber(e),s=this.model.get("min"),i=this.model.get("max");if(isNaN(t)||null!=s&&ti)throw e+" is not a valid number, it should be in the range ["+s+", "+i+"]";return t}}class Gt extends Kt{defaults(){return Object.assign(Object.assign({},super.defaults()),{_view_name:"FloatsInputView",_model_name:"FloatsInputModel",format:".1f"})}}class Jt extends qt{parseNumber(e){return parseFloat(e)}}class Yt extends Kt{defaults(){return Object.assign(Object.assign({},super.defaults()),{_view_name:"IntsInputView",_model_name:"IntsInputModel",format:"d"})}}class Qt extends qt{parseNumber(e){const t=parseInt(e);if(t!=parseFloat(e))throw e+" should be an integer";return t}}class Xt extends o{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"StringStyleModel",_model_module:"@jupyter-widgets/controls",_model_module_version:n.A})}}Xt.styleProperties=Object.assign(Object.assign({},o.styleProperties),{background:{selector:"",attribute:"background",default:null},font_size:{selector:"",attribute:"font-size",default:""},text_color:{selector:"",attribute:"color",default:""}});class Zt extends Xt{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"HTMLStyleModel",_model_module:"@jupyter-widgets/controls",_model_module_version:n.A})}}Zt.styleProperties=Object.assign({},Xt.styleProperties);class es extends Xt{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"HTMLMathStyleModel",_model_module:"@jupyter-widgets/controls",_model_module_version:n.A})}}es.styleProperties=Object.assign({},Xt.styleProperties);class ts extends Xt{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"LabelStyleModel",_model_module:"@jupyter-widgets/controls",_model_module_version:n.A})}}ts.styleProperties=Object.assign(Object.assign({},Xt.styleProperties),{font_family:{selector:"",attribute:"font-family",default:""},font_style:{selector:"",attribute:"font-style",default:""},font_variant:{selector:"",attribute:"font-variant",default:""},font_weight:{selector:"",attribute:"font-weight",default:""},text_decoration:{selector:"",attribute:"text-decoration",default:""}});class ss extends o{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"TextStyleModel",_model_module:"@jupyter-widgets/controls",_model_module_version:n.A})}}ss.styleProperties=Object.assign(Object.assign({},o.styleProperties),{background:{selector:".widget-input",attribute:"background",default:null},font_size:{selector:".widget-input",attribute:"font-size",default:""},text_color:{selector:".widget-input",attribute:"color",default:""}});class is extends m{defaults(){return Object.assign(Object.assign({},super.defaults()),{value:"",disabled:!1,placeholder:"​",_model_name:"StringModel"})}}class as extends h{render(){super.render(),this.el.classList.add("jupyter-widgets"),this.el.classList.add("widget-inline-hbox")}}class ls extends is{defaults(){return Object.assign(Object.assign({},super.defaults()),{_view_name:"HTMLView",_model_name:"HTMLModel"})}}class ds extends as{render(){super.render(),this.el.classList.add("widget-html"),this.content=document.createElement("div"),this.content.classList.add("widget-html-content"),this.el.appendChild(this.content),this.update()}update(){return this.content.innerHTML=this.model.get("value"),super.update()}handle_message(e){"focus"===e.do?this.content.focus():"blur"===e.do&&this.content.blur()}}class ns extends is{defaults(){return Object.assign(Object.assign({},super.defaults()),{_view_name:"HTMLMathView",_model_name:"HTMLMathModel"})}}class os extends as{render(){super.render(),this.el.classList.add("widget-htmlmath"),this.content=document.createElement("div"),this.content.classList.add("widget-htmlmath-content"),this.el.appendChild(this.content),this.update()}update(){return this.content.innerHTML=this.model.get("value"),this.typeset(this.content),super.update()}handle_message(e){"focus"===e.do?this.content.focus():"blur"===e.do&&this.content.blur()}}class rs extends is{defaults(){return Object.assign(Object.assign({},super.defaults()),{_view_name:"LabelView",_model_name:"LabelModel"})}}class hs extends as{render(){super.render(),this.el.classList.add("widget-label"),this.update()}update(){return this.typeset(this.el,this.model.get("value")),super.update()}}class us extends is{defaults(){return Object.assign(Object.assign({},super.defaults()),{_view_name:"TextareaView",_model_name:"TextareaModel",rows:null,continuous_update:!0})}}class cs extends as{render(){super.render(),this.el.classList.add("widget-textarea"),this.textbox=document.createElement("textarea"),this.textbox.setAttribute("rows","5"),this.textbox.id=this.label.htmlFor=(0,i.uuid)(),this.textbox.classList.add("widget-input"),this.el.appendChild(this.textbox),this.update(),this.listenTo(this.model,"change:placeholder",((e,t,s)=>{this.update_placeholder(t)})),this.update_placeholder(),this.updateTooltip()}update_placeholder(e){const t=e||this.model.get("placeholder");this.textbox.setAttribute("placeholder",t.toString())}update(e){if(void 0===e||e.updated_view!==this){this.textbox.value=this.model.get("value");let e=this.model.get("rows");null===e&&(e=""),this.textbox.setAttribute("rows",e),this.textbox.disabled=this.model.get("disabled")}return this.updateTabindex(),this.updateTooltip(),super.update()}updateTabindex(){if(!this.textbox)return;const e=this.model.get("tabbable");!0===e?this.textbox.setAttribute("tabIndex","0"):!1===e?this.textbox.setAttribute("tabIndex","-1"):null===e&&this.textbox.removeAttribute("tabIndex")}updateTooltip(){if(!this.textbox)return;const e=this.model.get("tooltip");e?0===this.model.get("description").length&&this.textbox.setAttribute("title",e):this.textbox.removeAttribute("title")}events(){return{"keydown textarea":"handleKeyDown","keypress textarea":"handleKeypress","input textarea":"handleChanging","change textarea":"handleChanged"}}handleKeyDown(e){e.stopPropagation()}handleKeypress(e){e.stopPropagation()}handleChanging(e){this.model.get("continuous_update")&&this.handleChanged(e)}handleChanged(e){const t=e.target;this.model.set("value",t.value,{updated_view:this}),this.touch()}handle_message(e){"focus"===e.do?this.textbox.focus():"blur"===e.do&&this.textbox.blur()}}class ps extends is{defaults(){return Object.assign(Object.assign({},super.defaults()),{_view_name:"TextView",_model_name:"TextModel",continuous_update:!0})}}class gs extends as{constructor(){super(...arguments),this.inputType="text"}render(){super.render(),this.el.classList.add("widget-text"),this.textbox=document.createElement("input"),this.textbox.setAttribute("type",this.inputType),this.textbox.id=this.label.htmlFor=(0,i.uuid)(),this.textbox.classList.add("widget-input"),this.el.appendChild(this.textbox),this.update(),this.listenTo(this.model,"change:placeholder",((e,t,s)=>{this.update_placeholder(t)})),this.update_placeholder(),this.updateTabindex(),this.updateTooltip()}update_placeholder(e){this.textbox.setAttribute("placeholder",e||this.model.get("placeholder"))}updateTabindex(){if(!this.textbox)return;const e=this.model.get("tabbable");!0===e?this.textbox.setAttribute("tabIndex","0"):!1===e?this.textbox.setAttribute("tabIndex","-1"):null===e&&this.textbox.removeAttribute("tabIndex")}updateTooltip(){if(!this.textbox)return;const e=this.model.get("tooltip");e?0===this.model.get("description").length&&this.textbox.setAttribute("title",e):this.textbox.removeAttribute("title")}update(e){return void 0!==e&&e.updated_view===this||(this.textbox.value!==this.model.get("value")&&(this.textbox.value=this.model.get("value")),this.textbox.disabled=this.model.get("disabled")),super.update()}events(){return{"keydown input":"handleKeyDown","keypress input":"handleKeypress","input input":"handleChanging","change input":"handleChanged"}}handleKeyDown(e){e.stopPropagation()}handleKeypress(e){e.stopPropagation(),13===e.keyCode&&this.send({event:"submit"})}handleChanging(e){this.model.get("continuous_update")&&this.handleChanged(e)}handleChanged(e){const t=e.target;this.model.set("value",t.value,{updated_view:this}),this.touch()}handle_message(e){"focus"===e.do?this.textbox.focus():"blur"===e.do&&this.textbox.blur()}}class ms extends ps{defaults(){return Object.assign(Object.assign({},super.defaults()),{_view_name:"PasswordView",_model_name:"PasswordModel"})}}class _s extends gs{constructor(){super(...arguments),this.inputType="password"}}class bs extends ps{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"ComboboxModel",_view_name:"ComboboxView",options:[],ensure_options:!1})}}class vs extends gs{constructor(){super(...arguments),this.isInitialRender=!0}render(){this.datalist=document.createElement("datalist"),this.datalist.id=(0,i.uuid)(),super.render(),this.textbox.setAttribute("list",this.datalist.id),this.el.appendChild(this.datalist),this.updateTooltip()}update(e){if(super.update(e),!this.datalist)return;const t=this.isValid(this.model.get("value"));if(this.highlightValidState(t),void 0!==e&&e.updated_view||!this.model.hasChanged("options")&&!this.isInitialRender)return;this.isInitialRender=!1;const s=this.model.get("options"),i=document.createDocumentFragment();for(const e of s){const t=document.createElement("option");t.value=e,i.appendChild(t)}this.datalist.replaceChildren(...i.children)}isValid(e){return!0!==this.model.get("ensure_option")||-1!==this.model.get("options").indexOf(e)}handleChanging(e){const t=e.target,s=this.isValid(t.value);this.highlightValidState(s),s&&super.handleChanging(e)}handleChanged(e){const t=e.target,s=this.isValid(t.value);this.highlightValidState(s),s&&super.handleChanged(e)}handle_message(e){"focus"===e.do?this.textbox.focus():"blur"===e.do&&this.textbox.blur()}highlightValidState(e){this.textbox.classList.toggle("jpwidgets-invalidComboValue",!e)}}class xs extends g{defaults(){return Object.assign(Object.assign({},super.defaults()),{_model_name:"FileUploadModel",_view_name:"FileUploadView",accept:"",description:"Upload",disabled:!1,icon:"upload",button_style:"",multiple:!1,value:[],error:"",style:null})}}xs.serializers=Object.assign(Object.assign({},g.serializers),{value:{serialize:e=>e}});class fs extends i.DOMWidgetView{preinitialize(){this.tagName="button"}render(){super.render(),this.el.classList.add("jupyter-widgets"),this.el.classList.add("widget-upload"),this.el.classList.add("jupyter-button"),this.fileInput=document.createElement("input"),this.fileInput.type="file",this.fileInput.style.display="none",this.el.addEventListener("click",(()=>{this.fileInput.click()})),this.fileInput.addEventListener("click",(()=>{this.fileInput.value=""})),this.fileInput.addEventListener("change",(()=>{var e;const t=[];Array.from(null!==(e=this.fileInput.files)&&void 0!==e?e:[]).forEach((e=>{t.push(new Promise(((t,s)=>{const i=new FileReader;i.onload=()=>{const s=i.result;t({content:s,name:e.name,type:e.type,size:e.size,last_modified:e.lastModified})},i.onerror=()=>{s()},i.onabort=i.onerror,i.readAsArrayBuffer(e)})))})),Promise.all(t).then((e=>{this.model.set({value:e,error:""}),this.touch()})).catch((e=>{console.error("error in file upload: %o",e),this.model.set({error:e}),this.touch()}))})),this.listenTo(this.model,"change:button_style",this.update_button_style),this.set_button_style(),this.update()}update(){this.el.disabled=this.model.get("disabled"),this.el.setAttribute("title",this.model.get("tooltip"));const e=this.model.get("value"),t=`${this.model.get("description")} (${e.length})`,s=this.model.get("icon");if(t.length||s.length){if(this.el.textContent="",s.length){const e=document.createElement("i");e.classList.add("fa"),e.classList.add("fa-"+s),0===t.length&&e.classList.add("center"),this.el.appendChild(e)}this.el.appendChild(document.createTextNode(t))}return this.fileInput.accept=this.model.get("accept"),this.fileInput.multiple=this.model.get("multiple"),super.update()}update_button_style(){this.update_mapped_classes(fs.class_map,"button_style",this.el)}set_button_style(){this.set_mapped_classes(fs.class_map,"button_style",this.el)}}fs.class_map={primary:["mod-primary"],success:["mod-success"],info:["mod-info"],warning:["mod-warning"],danger:["mod-danger"]};const ws=s(5394).rE},5394:e=>{e.exports={rE:"5.0.12"}}}]); \ No newline at end of file diff --git a/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/647.8458d9c331000024a14a.js b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/647.8458d9c331000024a14a.js new file mode 100644 index 0000000..c31c649 --- /dev/null +++ b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/647.8458d9c331000024a14a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_jupyter_widgets_jupyterlab_manager=self.webpackChunk_jupyter_widgets_jupyterlab_manager||[]).push([[647],{909:(e,t,s)=>{s.r(t),s.d(t,{BROKEN_FILE_SVG_ICON:()=>p,DOMWidgetModel:()=>z,DOMWidgetView:()=>I,ErrorWidgetView:()=>F,IJupyterWidgetRegistry:()=>G,JUPYTER_WIDGETS_VERSION:()=>x,JupyterLuminoPanelWidget:()=>N,JupyterLuminoWidget:()=>A,JupyterPhosphorPanelWidget:()=>V,JupyterPhosphorWidget:()=>T,LayoutModel:()=>D,LayoutView:()=>U,PROTOCOL_VERSION:()=>S,StyleModel:()=>$,StyleView:()=>R,ViewList:()=>H,WidgetModel:()=>C,WidgetView:()=>W,assign:()=>a,createErrorWidgetModel:()=>q,createErrorWidgetView:()=>K,difference:()=>r,isEqual:()=>l,isObject:()=>m,isSerializable:()=>_,pack_models:()=>L,put_buffers:()=>u,reject:()=>d,remove_buffers:()=>g,resolvePromisesDict:()=>h,shims:()=>B,unpack_models:()=>M,uuid:()=>c});var i=s(7262),n=s(6343),o=s.n(n);function r(e,t){return e.filter((e=>-1===t.indexOf(e)))}function l(e,t){return o()(e,t)}const a=Object.assign||function(e,...t){for(let s=1;s{const s={};for(let i=0;i=0&&t.item(s)!==this;);return s>-1};class j extends v.View{_removeElement(){this.undelegateEvents(),this.el.parentNode&&this.el.parentNode.removeChild(this.el)}_setElement(e){this.el=e}_setAttributes(e){for(const t in e)t in this.el?this.el[t]=e[t]:this.el.setAttribute(t,e[t])}delegate(e,t,s){"string"!=typeof t&&(s=t,t=null),void 0===this._domEvents&&(this._domEvents=[]);const i=this.el,n=t?function(e){let n=e.target||e.srcElement;for(;n&&n!==i;n=n.parentNode)if(k.call(n,t))return e.delegateTarget=n,s.handleEvent?s.handleEvent(e):s(e)}:s;return this.el.addEventListener(e,n,!1),this._domEvents.push({eventName:e,handler:n,listener:s,selector:t}),n}undelegate(e,t,s){if("function"==typeof t&&(s=t,t=null),this.el&&this._domEvents){const i=this._domEvents.slice();let n=i.length;for(;n--;){const o=i[n];!(o.eventName!==e||s&&o.listener!==s||t&&o.selector!==t)&&(this.el.removeEventListener(o.eventName,o.handler,!1),this._domEvents.splice(n,1))}}return this}undelegateEvents(){if(this.el&&this._domEvents){const e=this._domEvents.length;for(let t=0;tthis.views[e].then((e=>e.remove()))));return delete this.views,Promise.all(e).then((()=>{}))}return Promise.resolve()}_handle_comm_closed(e){this.trigger("comm:close"),this.close(!0)}_handle_comm_msg(e){const t=e.content.data,s=t.method;switch(s){case"update":case"echo_update":return this.state_change=this.state_change.then((()=>{var i,n,o;const r=t.state,l=null!==(i=t.buffer_paths)&&void 0!==i?i:[],a=null!==(o=null===(n=e.buffers)||void 0===n?void 0:n.slice(0,l.length))&&void 0!==o?o:[];if(u(r,l,a),e.parent_header&&"echo_update"===s){const t=e.parent_header.msg_id;Object.keys(r).filter((e=>this._expectedEchoMsgIds.has(e))).forEach((e=>{this._expectedEchoMsgIds.get(e)!==t?delete r[e]:(this._expectedEchoMsgIds.delete(e),null!==this._msg_buffer&&Object.prototype.hasOwnProperty.call(this._msg_buffer,e)&&delete r[e])}))}return this.constructor._deserialize_state(r,this.widget_manager)})).then((e=>{this.set_state(e)})).catch(d(`Could not process update msg for model id: ${this.model_id}`,!0)),this.state_change;case"custom":return this.trigger("msg:custom",t.content,e.buffers),Promise.resolve()}return Promise.resolve()}set_state(e){this._state_lock=e;try{this.set(e)}catch(e){console.error(`Error setting state: ${e instanceof Error?e.message:e}`)}finally{this._state_lock=null}}get_state(e){const t=this.attributes;if(e){const e=this.defaults,s="function"==typeof e?e.call(this):e,i={};return Object.keys(t).forEach((e=>{l(t[e],s[e])||(i[e]=t[e])})),i}return Object.assign({},t)}_handle_status(e){if(void 0!==this.comm&&"idle"===e.content.execution_state&&(this._pending_msgs--,this._pending_msgs<0&&(console.error(`Jupyter Widgets message throttle: Pending messages < 0 (=${this._pending_msgs}), which is unexpected. Resetting to 0 to continue.`),this._pending_msgs=0),null!==this._msg_buffer&&this._pending_msgs<1)){const e=this.send_sync_message(this._msg_buffer,this._msg_buffer_callbacks);this.rememberLastUpdateFor(e),this._msg_buffer=null,this._msg_buffer_callbacks=null}}callbacks(e){return this.widget_manager.callbacks(e)}set(e,t,s){const i=f.call(this,e,t,s);if(void 0!==this._buffered_state_diff){const e=this.changedAttributes()||{};if(this._state_lock)for(const t of Object.keys(this._state_lock))e[t]===this._state_lock[t]&&delete e[t];if(this._buffered_state_diff_synced)for(const t of Object.keys(this._buffered_state_diff_synced))e[t]===this._buffered_state_diff_synced[t]&&delete e[t];this._buffered_state_diff=a(this._buffered_state_diff,e)}return!1===this._changing&&(this._buffered_state_diff_synced={}),i}sync(e,t,s={}){if(void 0===this.comm)throw"Syncing error: no comm channel defined";const i="patch"===e?s.attrs:t.get_state(s.drop_defaults);if(this._state_lock)for(const e of Object.keys(this._state_lock))i[e]===this._state_lock[e]&&delete i[e];Object.keys(i).forEach((e=>{this._attrsToUpdate.add(e)}));const n=this.serialize(i);if(Object.keys(n).length>0){const t=s.callbacks||this.callbacks();if(this._pending_msgs>=1){switch(e){case"patch":this._msg_buffer=a(this._msg_buffer||{},n);break;case"update":case"create":this._msg_buffer=n;break;default:throw"unrecognized syncing method"}this._msg_buffer_callbacks=t}else{const e=this.send_sync_message(i,t);this.rememberLastUpdateFor(e)}}}rememberLastUpdateFor(e){this._attrsToUpdate.forEach((t=>{this._expectedEchoMsgIds.set(t,e)})),this._attrsToUpdate=new Set}serialize(e){const t=this.constructor.serializers||i.JSONExt.emptyObject;for(const s of Object.keys(e))try{t[s]&&t[s].serialize?e[s]=t[s].serialize(e[s],this):e[s]=JSON.parse(JSON.stringify(e[s])),e[s]&&e[s].toJSON&&(e[s]=e[s].toJSON())}catch(e){throw console.error("Error serializing widget state attribute: ",s),e}return e}send_sync_message(e,t={}){if(!this.comm)return"";try{const s=(t={shell:Object.assign({},t.shell),iopub:Object.assign({},t.iopub),input:t.input}).iopub.status;t.iopub.status=e=>{this._handle_status(e),s&&s(e)};const i=g(e),n=this.comm.send({method:"update",state:i.state,buffer_paths:i.buffer_paths},t,{},i.buffers);return this._pending_msgs++,n}catch(e){console.error("Could not send widget sync message",e)}return""}save_changes(e){if(this.comm_live){const t={patch:!0};e&&(t.callbacks=e),this.save(this._buffered_state_diff,t),this._changing&&a(this._buffered_state_diff_synced,this._buffered_state_diff),this._buffered_state_diff={}}}on_some_change(e,t,s){this.on("change",((...i)=>{e.some(this.hasChanged,this)&&t.apply(s,i)}),this)}toJSON(e){return`IPY_MODEL_${this.model_id}`}static _deserialize_state(e,t){const s=this.serializers;let i;if(s){i={};for(const n in e)s[n]&&s[n].deserialize?i[n]=s[n].deserialize(e[n],t):i[n]=e[n]}else i=e;return h(i)}}class z extends C{defaults(){return a(super.defaults(),{_dom_classes:[],tabbable:null,tooltip:null})}}z.serializers=Object.assign(Object.assign({},C.serializers),{layout:{deserialize:M},style:{deserialize:M}});class W extends j{constructor(e){super(e)}initialize(e){this.listenTo(this.model,"change",((e,t)=>{const s=Object.keys(this.model.changedAttributes()||{});"_view_count"===s[0]&&1===s.length||this.update(t)})),this.options=e.options,this.once("remove",(()=>{"number"==typeof this.model.get("_view_count")&&(this.model.set("_view_count",this.model.get("_view_count")-1),this.model.save_changes())})),this.once("displayed",(()=>{"number"==typeof this.model.get("_view_count")&&(this.model.set("_view_count",this.model.get("_view_count")+1),this.model.save_changes())})),this.displayed=new Promise(((e,t)=>{this.once("displayed",e),this.model.on("msg:custom",this.handle_message.bind(this))}))}handle_message(e){"focus"===e.do?this.el.focus():"blur"===e.do&&this.el.blur()}update(e){}render(){}create_child_view(e,t={}){return t=Object.assign({parent:this},t),this.model.widget_manager.create_view(e,t).catch(d("Could not create child view",!0))}callbacks(){return this.model.callbacks(this)}send(e,t){this.model.send(e,this.callbacks(),t)}touch(){this.model.save_changes(this.callbacks())}remove(){return super.remove(),this.trigger("remove"),this}}class A extends E.Widget{constructor(e){const t=e.view;delete e.view,super(e),this._view=t}dispose(){this.isDisposed||(super.dispose(),this._view.remove(),this._view=null)}processMessage(e){super.processMessage(e),this._view.processLuminoMessage(e)}}const T=A;class N extends E.Panel{constructor(e){const t=e.view;delete e.view,super(e),this._view=t}processMessage(e){super.processMessage(e),this._view.processLuminoMessage(e)}dispose(){var e;this.isDisposed||(super.dispose(),null===(e=this._view)||void 0===e||e.remove(),this._view=null)}}const V=N;class I extends W{initialize(e){super.initialize(e),this.listenTo(this.model,"change:_dom_classes",((e,t)=>{const s=e.previous("_dom_classes");this.update_classes(s,t)})),this.layoutPromise=Promise.resolve(),this.listenTo(this.model,"change:layout",((e,t)=>{this.setLayout(t,e.previous("layout"))})),this.stylePromise=Promise.resolve(),this.listenTo(this.model,"change:style",((e,t)=>{this.setStyle(t,e.previous("style"))})),this.displayed.then((()=>{this.update_classes([],this.model.get("_dom_classes")),this.setLayout(this.model.get("layout")),this.setStyle(this.model.get("style"))})),this._comm_live_update(),this.listenTo(this.model,"comm_live_update",(()=>{this._comm_live_update()})),this.listenTo(this.model,"change:tooltip",this.updateTooltip),this.updateTooltip()}setLayout(e,t){e&&(this.layoutPromise=this.layoutPromise.then((t=>(t&&(t.unlayout(),this.stopListening(t.model),t.remove()),this.create_child_view(e).then((e=>this.displayed.then((()=>(e.trigger("displayed"),this.listenTo(e.model,"change",(()=>{O.MessageLoop.postMessage(this.luminoWidget,E.Widget.ResizeMessage.UnknownSize)})),O.MessageLoop.postMessage(this.luminoWidget,E.Widget.ResizeMessage.UnknownSize),this.trigger("layout-changed"),e))))).catch(d("Could not add LayoutView to DOMWidgetView",!0))))))}setStyle(e,t){e&&(this.stylePromise=this.stylePromise.then((t=>(t&&(t.unstyle(),this.stopListening(t.model),t.remove()),this.create_child_view(e).then((e=>this.displayed.then((()=>(e.trigger("displayed"),this.trigger("style-changed"),e))))).catch(d("Could not add styleView to DOMWidgetView",!0))))))}updateTooltip(){const e=this.model.get("tooltip");e?0===this.model.get("description").length&&this.el.setAttribute("title",e):this.el.removeAttribute("title")}update_classes(e,t,s){void 0===s&&(s=this.el),r(e,t).map((function(e){s.classList?s.classList.remove(e):s.setAttribute("class",s.getAttribute("class").replace(e,""))})),r(t,e).map((function(e){s.classList?s.classList.add(e):s.setAttribute("class",s.getAttribute("class").concat(" ",e))}))}update_mapped_classes(e,t,s){let i=this.model.previous(t);const n=e[i]?e[i]:[];i=this.model.get(t);const o=e[i]?e[i]:[];this.update_classes(n,o,s||this.el)}set_mapped_classes(e,t,s){const i=this.model.get(t),n=e[i]?e[i]:[];this.update_classes([],n,s||this.el)}_setElement(e){this.luminoWidget&&this.luminoWidget.dispose(),this.$el=e instanceof y()?e:y()(e),this.el=this.$el[0],this.luminoWidget=new A({node:e,view:this})}remove(){return this.luminoWidget&&this.luminoWidget.dispose(),super.remove()}processPhosphorMessage(e){this.processLuminoMessage(e)}processLuminoMessage(e){switch(e.type){case"after-attach":this.trigger("displayed");break;case"show":this.trigger("shown")}}_comm_live_update(){this.model.comm_live?this.luminoWidget.removeClass("jupyter-widgets-disconnected"):this.luminoWidget.addClass("jupyter-widgets-disconnected")}updateTabindex(){const e=this.model.get("tabbable");!0===e?this.el.setAttribute("tabIndex","0"):!1===e?this.el.setAttribute("tabIndex","-1"):null===e&&this.el.removeAttribute("tabIndex")}get pWidget(){return this.luminoWidget}set pWidget(e){this.luminoWidget=e}}const J={align_content:null,align_items:null,align_self:null,border_top:null,border_right:null,border_bottom:null,border_left:null,bottom:null,display:null,flex:null,flex_flow:null,height:null,justify_content:null,justify_items:null,left:null,margin:null,max_height:null,max_width:null,min_height:null,min_width:null,overflow:null,order:null,padding:null,right:null,top:null,visibility:null,width:null,object_fit:null,object_position:null,grid_auto_columns:null,grid_auto_flow:null,grid_auto_rows:null,grid_gap:null,grid_template_rows:null,grid_template_columns:null,grid_template_areas:null,grid_row:null,grid_column:null,grid_area:null};class D extends C{defaults(){return a(super.defaults(),{_model_name:"LayoutModel",_view_name:"LayoutView"},J)}}class U extends W{initialize(e){this._traitNames=[],super.initialize(e);for(const e of Object.keys(J))this.registerTrait(e)}registerTrait(e){this._traitNames.push(e),this.listenTo(this.model,"change:"+e,((t,s)=>{this.handleChange(e,s)})),this.handleChange(e,this.model.get(e))}css_name(e){return e.replace(/_/g,"-")}handleChange(e,t){const s=this.options.parent;s?null===t?s.el.style.removeProperty(this.css_name(e)):s.el.style.setProperty(this.css_name(e),t):console.warn("Style not applied because a parent view does not exist")}unlayout(){const e=this.options.parent;this._traitNames.forEach((t=>{e?e.el.style.removeProperty(this.css_name(t)):console.warn("Style not removed because a parent view does not exist")}),this)}}class $ extends C{defaults(){const e=this.constructor;return a(super.defaults(),{_model_name:"StyleModel",_view_name:"StyleView"},Object.keys(e.styleProperties).reduce(((t,s)=>(t[s]=e.styleProperties[s].default,t)),{}))}}$.styleProperties={};class R extends W{initialize(e){this._traitNames=[],super.initialize(e);const t=this.model.constructor;for(const e of Object.keys(t.styleProperties))this.registerTrait(e);this.style()}registerTrait(e){this._traitNames.push(e),this.listenTo(this.model,"change:"+e,((t,s)=>{this.handleChange(e,s)}))}handleChange(e,t){const s=this.options.parent;if(s){const i=this.model.constructor.styleProperties,n=i[e].attribute,o=i[e].selector,r=o?s.el.querySelectorAll(o):[s.el];if(null===t)for(let e=0;e!==r.length;++e)r[e].style.removeProperty(n);else for(let e=0;e!==r.length;++e)r[e].style.setProperty(n,t)}else console.warn("Style not applied because a parent view does not exist")}style(){for(const e of this._traitNames)this.handleChange(e,this.model.get(e))}unstyle(){const e=this.options.parent,t=this.model.constructor.styleProperties;this._traitNames.forEach((s=>{if(e){const i=t[s].attribute,n=t[s].selector,o=n?e.el.querySelectorAll(n):[e.el];for(let e=0;e!==o.length;++e)o[e].style.removeProperty(i)}else console.warn("Style not removed because a parent view does not exist")}),this)}}var B;!function(e){let t;!function(e){e.CommManager=class{constructor(e){this.targets=Object.create(null),this.comms=Object.create(null),this.init_kernel(e)}init_kernel(e){this.kernel=e,this.jsServicesKernel=e}async new_comm(e,s,i,n,o,r){const l=this.jsServicesKernel.createComm(e,o),a=new t(l);return this.register_comm(a),a.open(s,i,n,r),a}register_target(e,s){const i=this.jsServicesKernel.registerCommTarget(e,((e,i)=>{const n=new t(e);this.register_comm(n);try{return s(n,i)}catch(e){n.close(),console.error(e),console.error(new Error("Exception opening new comm"))}}));this.targets[e]=i}unregister_target(e,t){this.targets[e].dispose(),delete this.targets[e]}register_comm(e){return this.comms[e.comm_id]=Promise.resolve(e),e.kernel=this.kernel,e.comm_id}};class t{constructor(e){this.jsServicesComm=e}get comm_id(){return this.jsServicesComm.commId}get target_name(){return this.jsServicesComm.targetName}open(e,t,s,i){const n=this.jsServicesComm.open(e,s,i);return this._hookupCallbacks(n,t),n.msg.header.msg_id}send(e,t,s,i){const n=this.jsServicesComm.send(e,s,i);return this._hookupCallbacks(n,t),n.msg.header.msg_id}close(e,t,s,i){const n=this.jsServicesComm.close(e,s,i);return this._hookupCallbacks(n,t),n.msg.header.msg_id}on_msg(e){this.jsServicesComm.onMsg=e.bind(this)}on_close(e){this.jsServicesComm.onClose=e.bind(this)}_hookupCallbacks(e,t){t&&(e.onReply=function(e){t.shell&&t.shell.reply&&t.shell.reply(e)},e.onStdin=function(e){t.input&&t.input(e)},e.onIOPub=function(e){if(t.iopub)if(t.iopub.status&&"status"===e.header.msg_type)t.iopub.status(e);else if(t.iopub.clear_output&&"clear_output"===e.header.msg_type)t.iopub.clear_output(e);else if(t.iopub.output)switch(e.header.msg_type){case"display_data":case"execute_result":case"stream":case"error":t.iopub.output(e)}})}}e.Comm=t}(t=e.services||(e.services={}))}(B||(B={}));class H{constructor(e,t,s){this.initialize(e,t,s)}initialize(e,t,s){this._handler_context=s||this,this._models=[],this.views=[],this._create_view=e,this._remove_view=t||function(e){e.remove()}}update(e,t,s,i){const n=s||this._remove_view,o=t||this._create_view;i=i||this._handler_context;let r=0;for(;r=this._models.length||e[r]!==this._models[r]);r++);const l=r,a=this.views.splice(l,this.views.length-l);for(let e=0;e{e.forEach((e=>this._remove_view.call(this._handler_context,e))),this.views=[],this._models=[]}))}dispose(){this.views=null,this._models=null}}const G=new i.Token("jupyter.extensions.jupyterWidgetRegistry");function q(e,t){return class extends z{constructor(s,i){super(s=Object.assign(Object.assign({},s),{_view_name:"ErrorWidgetView",_view_module:"@jupyter-widgets/base",_model_module_version:x,_view_module_version:x,msg:t,error:e}),i),this.comm_live=!0}}}class F extends I{generateErrorMessage(){return{msg:this.model.get("msg"),stack:String(this.model.get("error").stack)}}render(){const{msg:e,stack:t}=this.generateErrorMessage();this.el.classList.add("jupyter-widgets");const s=document.createElement("div");s.classList.add("jupyter-widgets-error-widget","icon-error"),s.innerHTML=p;const i=document.createElement("pre");let n,o;i.style.textAlign="center",i.innerText="Click to show javascript error.",s.append(i),this.el.appendChild(s),this.el.onclick=()=>{s.classList.contains("icon-error")&&(o=o||s.clientHeight,n=n||s.clientWidth,s.classList.remove("icon-error"),s.innerHTML=`\n
[Open Browser Console for more detailed log - Double click to close this message]\n${e}\n${t}
\n `,s.style.height=`${o}px`,s.style.width=`${n}px`,s.classList.add("text-error"))},this.el.ondblclick=()=>{s.classList.contains("text-error")&&(s.classList.remove("text-error"),s.innerHTML=p,s.append(i),s.classList.add("icon-error"))}}}function K(e,t){return class extends F{generateErrorMessage(){return{msg:t,stack:String(e instanceof Error?e.stack:e)}}}}}}]); \ No newline at end of file diff --git a/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/651.fe40a967a60b543cf15c.js b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/651.fe40a967a60b543cf15c.js new file mode 100644 index 0000000..d400082 --- /dev/null +++ b/.venv-sp/share/jupyter/labextensions/@jupyter-widgets/jupyterlab-manager/static/651.fe40a967a60b543cf15c.js @@ -0,0 +1,2 @@ +/*! For license information please see 651.fe40a967a60b543cf15c.js.LICENSE.txt */ +(self.webpackChunk_jupyter_widgets_jupyterlab_manager=self.webpackChunk_jupyter_widgets_jupyterlab_manager||[]).push([[651],{4651:function(e,t){var n;!function(t,n){"use strict";"object"==typeof e.exports?e.exports=t.document?n(t,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return n(e)}:n(t)}("undefined"!=typeof window?window:this,(function(r,i){"use strict";var o=[],a=Object.getPrototypeOf,s=o.slice,u=o.flat?function(e){return o.flat.call(e)}:function(e){return o.concat.apply([],e)},l=o.push,c=o.indexOf,f={},p=f.toString,d=f.hasOwnProperty,h=d.toString,g=h.call(Object),v={},y=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},m=function(e){return null!=e&&e===e.window},x=r.document,b={type:!0,src:!0,nonce:!0,noModule:!0};function w(e,t,n){var r,i,o=(n=n||x).createElement("script");if(o.text=e,t)for(r in b)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function T(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?f[p.call(e)]||"object":typeof e}var C="3.7.1",k=/HTML$/i,S=function(e,t){return new S.fn.init(e,t)};function E(e){var t=!!e&&"length"in e&&e.length,n=T(e);return!y(e)&&!m(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function j(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}S.fn=S.prototype={jquery:C,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(e){return this.pushStack(S.map(this,(function(t,n){return e.call(t,n,t)})))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,(function(e,t){return(t+1)%2})))},odd:function(){return this.pushStack(S.grep(this,(function(e,t){return t%2})))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n+~]|"+q+")"+q+"*"),$=new RegExp(q+"|>"),_=new RegExp(R),B=new RegExp("^"+H+"$"),z={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+R),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+q+"*(even|odd|(([+-]|)(\\d*)n|)"+q+"*(?:([+-]|)"+q+"*(\\d+)|))"+q+"*\\)|)","i"),bool:new RegExp("^(?:"+E+")$","i"),needsContext:new RegExp("^"+q+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+q+"*((?:-\\d)?\\d*)"+q+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,U=/^h\d$/i,V=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/[+~]/,Y=new RegExp("\\\\[\\da-fA-F]{1,6}"+q+"?|\\\\([^\\r\\n\\f])","g"),Q=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},J=function(){ue()},K=pe((function(e){return!0===e.disabled&&j(e,"fieldset")}),{dir:"parentNode",next:"legend"});try{g.apply(o=s.call(P.childNodes),P.childNodes),o[P.childNodes.length].nodeType}catch(e){g={apply:function(e,t){M.apply(e,s.call(t))},call:function(e){M.apply(e,s.call(arguments,1))}}}function Z(e,t,n,r){var i,o,a,s,l,c,d,h=t&&t.ownerDocument,m=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==m&&9!==m&&11!==m)return n;if(!r&&(ue(t),t=t||u,f)){if(11!==m&&(l=V.exec(e)))if(i=l[1]){if(9===m){if(!(a=t.getElementById(i)))return n;if(a.id===i)return g.call(n,a),n}else if(h&&(a=h.getElementById(i))&&Z.contains(t,a)&&a.id===i)return g.call(n,a),n}else{if(l[2])return g.apply(n,t.getElementsByTagName(e)),n;if((i=l[3])&&t.getElementsByClassName)return g.apply(n,t.getElementsByClassName(i)),n}if(!(C[e+" "]||p&&p.test(e))){if(d=e,h=t,1===m&&($.test(e)||F.test(e))){for((h=G.test(e)&&se(t.parentNode)||t)==t&&v.scope||((s=t.getAttribute("id"))?s=S.escapeSelector(s):t.setAttribute("id",s=y)),o=(c=ce(e)).length;o--;)c[o]=(s?"#"+s:":scope")+" "+fe(c[o]);d=c.join(",")}try{return g.apply(n,h.querySelectorAll(d)),n}catch(t){C(e,!0)}finally{s===y&&t.removeAttribute("id")}}}return me(e.replace(L,"$1"),t,n,r)}function ee(){var e=[];return function n(r,i){return e.push(r+" ")>t.cacheLength&&delete n[e.shift()],n[r+" "]=i}}function te(e){return e[y]=!0,e}function ne(e){var t=u.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function re(e){return function(t){return j(t,"input")&&t.type===e}}function ie(e){return function(t){return(j(t,"input")||j(t,"button"))&&t.type===e}}function oe(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&K(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function ae(e){return te((function(t){return t=+t,te((function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))}))}))}function se(e){return e&&void 0!==e.getElementsByTagName&&e}function ue(e){var n,r=e?e.ownerDocument||e:P;return r!=u&&9===r.nodeType&&r.documentElement?(l=(u=r).documentElement,f=!S.isXMLDoc(u),h=l.matches||l.webkitMatchesSelector||l.msMatchesSelector,l.msMatchesSelector&&P!=u&&(n=u.defaultView)&&n.top!==n&&n.addEventListener("unload",J),v.getById=ne((function(e){return l.appendChild(e).id=S.expando,!u.getElementsByName||!u.getElementsByName(S.expando).length})),v.disconnectedMatch=ne((function(e){return h.call(e,"*")})),v.scope=ne((function(){return u.querySelectorAll(":scope")})),v.cssHas=ne((function(){try{return u.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}})),v.getById?(t.filter.ID=function(e){var t=e.replace(Y,Q);return function(e){return e.getAttribute("id")===t}},t.find.ID=function(e,t){if(void 0!==t.getElementById&&f){var n=t.getElementById(e);return n?[n]:[]}}):(t.filter.ID=function(e){var t=e.replace(Y,Q);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},t.find.ID=function(e,t){if(void 0!==t.getElementById&&f){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),t.find.TAG=function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},t.find.CLASS=function(e,t){if(void 0!==t.getElementsByClassName&&f)return t.getElementsByClassName(e)},p=[],ne((function(e){var t;l.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||p.push("\\["+q+"*(?:value|"+E+")"),e.querySelectorAll("[id~="+y+"-]").length||p.push("~="),e.querySelectorAll("a#"+y+"+*").length||p.push(".#.+[+~]"),e.querySelectorAll(":checked").length||p.push(":checked"),(t=u.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),l.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&p.push(":enabled",":disabled"),(t=u.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||p.push("\\["+q+"*name"+q+"*="+q+"*(?:''|\"\")")})),v.cssHas||p.push(":has"),p=p.length&&new RegExp(p.join("|")),k=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!v.sortDetached&&t.compareDocumentPosition(e)===n?e===u||e.ownerDocument==P&&Z.contains(P,e)?-1:t===u||t.ownerDocument==P&&Z.contains(P,t)?1:i?c.call(i,e)-c.call(i,t):0:4&n?-1:1)},u):u}for(e in Z.matches=function(e,t){return Z(e,null,null,t)},Z.matchesSelector=function(e,t){if(ue(e),f&&!C[t+" "]&&(!p||!p.test(t)))try{var n=h.call(e,t);if(n||v.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){C(t,!0)}return Z(t,u,null,[e]).length>0},Z.contains=function(e,t){return(e.ownerDocument||e)!=u&&ue(e),S.contains(e,t)},Z.attr=function(e,n){(e.ownerDocument||e)!=u&&ue(e);var r=t.attrHandle[n.toLowerCase()],i=r&&d.call(t.attrHandle,n.toLowerCase())?r(e,n,!f):void 0;return void 0!==i?i:e.getAttribute(n)},Z.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},S.uniqueSort=function(e){var t,n=[],r=0,o=0;if(a=!v.sortStable,i=!v.sortStable&&s.call(e,0),D.call(e,k),a){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)N.call(e,n[r],1)}return i=null,e},S.fn.uniqueSort=function(){return this.pushStack(S.uniqueSort(s.apply(this)))},t=S.expr={cacheLength:50,createPseudo:te,match:z,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Y,Q),e[3]=(e[3]||e[4]||e[5]||"").replace(Y,Q),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||Z.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&Z.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return z.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&_.test(n)&&(t=ce(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Y,Q).toLowerCase();return"*"===e?function(){return!0}:function(e){return j(e,t)}},CLASS:function(e){var t=b[e+" "];return t||(t=new RegExp("(^|"+q+")"+e+"("+q+"|$)"))&&b(e,(function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,t,n){return function(r){var i=Z.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(I," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h=o!==a?"nextSibling":"previousSibling",g=t.parentNode,v=s&&t.nodeName.toLowerCase(),x=!u&&!s,b=!1;if(g){if(o){for(;h;){for(f=t;f=f[h];)if(s?j(f,v):1===f.nodeType)return!1;d=h="only"===e&&!d&&"nextSibling"}return!0}if(d=[a?g.firstChild:g.lastChild],a&&x){for(b=(p=(l=(c=g[y]||(g[y]={}))[e]||[])[0]===m&&l[1])&&l[2],f=p&&g.childNodes[p];f=++p&&f&&f[h]||(b=p=0)||d.pop();)if(1===f.nodeType&&++b&&f===t){c[e]=[m,p,b];break}}else if(x&&(b=p=(l=(c=t[y]||(t[y]={}))[e]||[])[0]===m&&l[1]),!1===b)for(;(f=++p&&f&&f[h]||(b=p=0)||d.pop())&&(!(s?j(f,v):1===f.nodeType)||!++b||(x&&((c=f[y]||(f[y]={}))[e]=[m,b]),f!==t)););return(b-=i)===r||b%r==0&&b/r>=0}}},PSEUDO:function(e,n){var r,i=t.pseudos[e]||t.setFilters[e.toLowerCase()]||Z.error("unsupported pseudo: "+e);return i[y]?i(n):i.length>1?(r=[e,e,"",n],t.setFilters.hasOwnProperty(e.toLowerCase())?te((function(e,t){for(var r,o=i(e,n),a=o.length;a--;)e[r=c.call(e,o[a])]=!(t[r]=o[a])})):function(e){return i(e,0,r)}):i}},pseudos:{not:te((function(e){var t=[],n=[],r=ye(e.replace(L,"$1"));return r[y]?te((function(e,t,n,i){for(var o,a=r(e,null,i,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))})):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}})),has:te((function(e){return function(t){return Z(e,t).length>0}})),contains:te((function(e){return e=e.replace(Y,Q),function(t){return(t.textContent||S.text(t)).indexOf(e)>-1}})),lang:te((function(e){return B.test(e||"")||Z.error("unsupported lang: "+e),e=e.replace(Y,Q).toLowerCase(),function(t){var n;do{if(n=f?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}})),target:function(e){var t=r.location&&r.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===l},focus:function(e){return e===function(){try{return u.activeElement}catch(e){}}()&&u.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:oe(!1),disabled:oe(!0),checked:function(e){return j(e,"input")&&!!e.checked||j(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!t.pseudos.empty(e)},header:function(e){return U.test(e.nodeName)},input:function(e){return X.test(e.nodeName)},button:function(e){return j(e,"input")&&"button"===e.type||j(e,"button")},text:function(e){var t;return j(e,"input")&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ae((function(){return[0]})),last:ae((function(e,t){return[t-1]})),eq:ae((function(e,t,n){return[n<0?n+t:n]})),even:ae((function(e,t){for(var n=0;nt?t:n;--r>=0;)e.push(r);return e})),gt:ae((function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function he(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s-1&&(o[l]=!(a[l]=p))}}else d=he(d===a?d.splice(y,d.length):d),i?i(null,a,d,u):g.apply(a,d)}))}function ve(e){for(var r,i,o,a=e.length,s=t.relative[e[0].type],u=s||t.relative[" "],l=s?1:0,f=pe((function(e){return e===r}),u,!0),p=pe((function(e){return c.call(r,e)>-1}),u,!0),d=[function(e,t,i){var o=!s&&(i||t!=n)||((r=t).nodeType?f(e,t,i):p(e,t,i));return r=null,o}];l1&&de(d),l>1&&fe(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(L,"$1"),i,l0,o=e.length>0,a=function(a,s,l,c,p){var d,h,v,y=0,x="0",b=a&&[],w=[],T=n,C=a||o&&t.find.TAG("*",p),k=m+=null==T?1:Math.random()||.1,E=C.length;for(p&&(n=s==u||s||p);x!==E&&null!=(d=C[x]);x++){if(o&&d){for(h=0,s||d.ownerDocument==u||(ue(d),l=!f);v=e[h++];)if(v(d,s||u,l)){g.call(c,d);break}p&&(m=k)}i&&((d=!v&&d)&&y--,a&&b.push(d))}if(y+=x,i&&x!==y){for(h=0;v=r[h++];)v(b,w,s,l);if(a){if(y>0)for(;x--;)b[x]||w[x]||(w[x]=A.call(c));w=he(w)}g.apply(c,w),p&&!a&&w.length>0&&y+r.length>1&&S.uniqueSort(c)}return p&&(m=k,n=T),b};return i?te(a):a}(a,o)),s.selector=e}return s}function me(e,n,r,i){var o,a,s,u,l,c="function"==typeof e&&e,p=!i&&ce(e=c.selector||e);if(r=r||[],1===p.length){if((a=p[0]=p[0].slice(0)).length>2&&"ID"===(s=a[0]).type&&9===n.nodeType&&f&&t.relative[a[1].type]){if(!(n=(t.find.ID(s.matches[0].replace(Y,Q),n)||[])[0]))return r;c&&(n=n.parentNode),e=e.slice(a.shift().value.length)}for(o=z.needsContext.test(e)?0:a.length;o--&&(s=a[o],!t.relative[u=s.type]);)if((l=t.find[u])&&(i=l(s.matches[0].replace(Y,Q),G.test(a[0].type)&&se(n.parentNode)||n))){if(a.splice(o,1),!(e=i.length&&fe(a)))return g.apply(r,i),r;break}}return(c||ye(e,p))(i,n,!f,r,!n||G.test(e)&&se(n.parentNode)||n),r}le.prototype=t.filters=t.pseudos,t.setFilters=new le,v.sortStable=y.split("").sort(k).join("")===y,ue(),v.sortDetached=ne((function(e){return 1&e.compareDocumentPosition(u.createElement("fieldset"))})),S.find=Z,S.expr[":"]=S.expr.pseudos,S.unique=S.uniqueSort,Z.compile=ye,Z.select=me,Z.setDocument=ue,Z.tokenize=ce,Z.escape=S.escapeSelector,Z.getText=S.text,Z.isXML=S.isXMLDoc,Z.selectors=S.expr,Z.support=S.support,Z.uniqueSort=S.uniqueSort}();var R=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},I=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},W=S.expr.match.needsContext,F=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function $(e,t,n){return y(t)?S.grep(e,(function(e,r){return!!t.call(e,r,e)!==n})):t.nodeType?S.grep(e,(function(e){return e===t!==n})):"string"!=typeof t?S.grep(e,(function(e){return c.call(t,e)>-1!==n})):S.filter(t,e,n)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,(function(e){return 1===e.nodeType})))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter((function(){for(t=0;t1?S.uniqueSort(n):n},filter:function(e){return this.pushStack($(this,e||[],!1))},not:function(e){return this.pushStack($(this,e||[],!0))},is:function(e){return!!$(this,"string"==typeof e&&W.test(e)?S(e):e||[],!1).length}});var _,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||_,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:B.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:x,!0)),F.test(r[1])&&S.isPlainObject(t))for(r in t)y(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=x.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):y(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,_=S(x);var z=/^(?:parents|prev(?:Until|All))/,X={children:!0,contents:!0,next:!0,prev:!0};function U(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter((function(){for(var e=0;e-1:1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?c.call(S(e),this[0]):c.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return R(e,"parentNode")},parentsUntil:function(e,t,n){return R(e,"parentNode",n)},next:function(e){return U(e,"nextSibling")},prev:function(e){return U(e,"previousSibling")},nextAll:function(e){return R(e,"nextSibling")},prevAll:function(e){return R(e,"previousSibling")},nextUntil:function(e,t,n){return R(e,"nextSibling",n)},prevUntil:function(e,t,n){return R(e,"previousSibling",n)},siblings:function(e){return I((e.parentNode||{}).firstChild,e)},children:function(e){return I(e.firstChild)},contents:function(e){return null!=e.contentDocument&&a(e.contentDocument)?e.contentDocument:(j(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},(function(e,t){S.fn[e]=function(n,r){var i=S.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=S.filter(r,i)),this.length>1&&(X[e]||S.uniqueSort(i),z.test(e)&&i.reverse()),this.pushStack(i)}}));var V=/[^\x20\t\r\n\f]+/g;function G(e){return e}function Y(e){throw e}function Q(e,t,n,r){var i;try{e&&y(i=e.promise)?i.call(e).done(t).fail(n):e&&y(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(e){e="string"==typeof e?function(e){var t={};return S.each(e.match(V)||[],(function(e,n){t[n]=!0})),t}(e):S.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1)for(n=a.shift();++s-1;)o.splice(n,1),n<=s&&s--})),this},has:function(e){return e?S.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},S.extend({Deferred:function(e){var t=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],n="pending",i={state:function(){return n},always:function(){return o.done(arguments).fail(arguments),this},catch:function(e){return i.then(null,e)},pipe:function(){var e=arguments;return S.Deferred((function(n){S.each(t,(function(t,r){var i=y(e[r[4]])&&e[r[4]];o[r[1]]((function(){var e=i&&i.apply(this,arguments);e&&y(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[r[0]+"With"](this,i?[e]:arguments)}))})),e=null})).promise()},then:function(e,n,i){var o=0;function a(e,t,n,i){return function(){var s=this,u=arguments,l=function(){var r,l;if(!(e=o&&(n!==Y&&(s=void 0,u=[r]),t.rejectWith(s,u))}};e?c():(S.Deferred.getErrorHook?c.error=S.Deferred.getErrorHook():S.Deferred.getStackHook&&(c.error=S.Deferred.getStackHook()),r.setTimeout(c))}}return S.Deferred((function(r){t[0][3].add(a(0,r,y(i)?i:G,r.notifyWith)),t[1][3].add(a(0,r,y(e)?e:G)),t[2][3].add(a(0,r,y(n)?n:Y))})).promise()},promise:function(e){return null!=e?S.extend(e,i):i}},o={};return S.each(t,(function(e,r){var a=r[2],s=r[5];i[r[1]]=a.add,s&&a.add((function(){n=s}),t[3-e][2].disable,t[3-e][3].disable,t[0][2].lock,t[0][3].lock),a.add(r[3].fire),o[r[0]]=function(){return o[r[0]+"With"](this===o?void 0:this,arguments),this},o[r[0]+"With"]=a.fireWith})),i.promise(o),e&&e.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=s.call(arguments),o=S.Deferred(),a=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?s.call(arguments):n,--t||o.resolveWith(r,i)}};if(t<=1&&(Q(e,o.done(a(n)).resolve,o.reject,!t),"pending"===o.state()||y(i[n]&&i[n].then)))return o.then();for(;n--;)Q(i[n],a(n),o.reject);return o.promise()}});var J=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){r.console&&r.console.warn&&e&&J.test(e.name)&&r.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){r.setTimeout((function(){throw e}))};var K=S.Deferred();function Z(){x.removeEventListener("DOMContentLoaded",Z),r.removeEventListener("load",Z),S.ready()}S.fn.ready=function(e){return K.then(e).catch((function(e){S.readyException(e)})),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0,!0!==e&&--S.readyWait>0||K.resolveWith(x,[S]))}}),S.ready.then=K.then,"complete"===x.readyState||"loading"!==x.readyState&&!x.documentElement.doScroll?r.setTimeout(S.ready):(x.addEventListener("DOMContentLoaded",Z),r.addEventListener("load",Z));var ee=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===T(n))for(s in i=!0,n)ee(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,y(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each((function(){ue.remove(this,e)}))}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=se.get(e,t),n&&(!r||Array.isArray(n)?r=se.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,(function(){S.dequeue(e,t)}),o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return se.get(e,n)||se.access(e,n,{empty:S.Callbacks("once memory").add((function(){se.remove(e,[t+"queue",n])}))})}}),S.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]*)/i,je=/^$|^module$|\/(?:java|ecma)script/i;Ce=x.createDocumentFragment().appendChild(x.createElement("div")),(ke=x.createElement("input")).setAttribute("type","radio"),ke.setAttribute("checked","checked"),ke.setAttribute("name","t"),Ce.appendChild(ke),v.checkClone=Ce.cloneNode(!0).cloneNode(!0).lastChild.checked,Ce.innerHTML="",v.noCloneChecked=!!Ce.cloneNode(!0).lastChild.defaultValue,Ce.innerHTML="",v.option=!!Ce.lastChild;var Ae={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function De(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&j(e,t)?S.merge([e],n):n}function Ne(e,t){for(var n=0,r=e.length;n",""]);var qe=/<|&#?\w+;/;function Le(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d-1)i&&i.push(o);else if(l=ve(o),a=De(f.appendChild(o),"script"),l&&Ne(a),n)for(c=0;o=a[c++];)je.test(o.type||"")&&n.push(o);return f}var He=/^([^.]*)(?:\.(.+)|)/;function Oe(){return!0}function Pe(){return!1}function Me(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Me(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Pe;else if(!i)return e;return 1===o&&(a=i,i=function(e){return S().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=S.guid++)),e.each((function(){S.event.add(this,t,i,r,n)}))}function Re(e,t,n){n?(se.set(e,t,!1),S.event.add(e,t,{namespace:!1,handler:function(e){var n,r=se.get(this,t);if(1&e.isTrigger&&this[t]){if(r)(S.event.special[t]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),se.set(this,t,r),this[t](),n=se.get(this,t),se.set(this,t,!1),r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n}else r&&(se.set(this,t,S.event.trigger(r[0],r.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Oe)}})):void 0===se.get(e,t)&&S.event.add(e,t,Oe)}S.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=se.get(e);if(oe(e))for(n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(ge,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(t){return void 0!==S&&S.event.triggered!==t.type?S.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(V)||[""]).length;l--;)d=g=(s=He.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=se.hasData(e)&&se.get(e);if(v&&(u=v.events)){for(l=(t=(t||"").match(V)||[""]).length;l--;)if(d=g=(s=He.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){for(f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;o--;)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&se.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(se.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\s*$/g;function $e(e,t){return j(e,"table")&&j(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function _e(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Be(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function ze(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(se.hasData(e)&&(s=se.get(e).events))for(i in se.remove(t,"handle events"),s)for(n=0,r=s[i].length;n1&&"string"==typeof h&&!v.checkClone&&We.test(h))return e.each((function(i){var o=e.eq(i);g&&(t[0]=h.call(this,i,o.html())),Ue(o,t,n,r)}));if(p&&(o=(i=Le(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=(a=S.map(De(i,"script"),_e)).length;f0&&Ne(a,!u&&De(e,"script")),s},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(oe(n)){if(t=n[se.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[se.expando]=void 0}n[ue.expando]&&(n[ue.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Ve(this,e,!0)},remove:function(e){return Ve(this,e)},text:function(e){return ee(this,(function(e){return void 0===e?S.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)}))}),null,e,arguments.length)},append:function(){return Ue(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||$e(this,e).appendChild(e)}))},prepend:function(){return Ue(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=$e(this,e);t.insertBefore(e,t.firstChild)}}))},before:function(){return Ue(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return Ue(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(De(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map((function(){return S.clone(this,e,t)}))},html:function(e){return ee(this,(function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ie.test(e)&&!Ae[(Ee.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u+l}function ct(e,t,n){var r=Qe(e),i=(!v.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Ze(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Ge.test(a)){if(!n)return a;a="auto"}return(!v.boxSizingReliable()&&i||!v.reliableTrDimensions()&&j(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+lt(e,t,n||(i?"border":"content"),o,r,a)+"px"}function ft(e,t,n,r,i){return new ft.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ze(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=ie(t),u=Ye.test(t),l=e.style;if(u||(t=it(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=de.exec(n))&&i[1]&&(n=xe(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),v.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=ie(t);return Ye.test(t)||(t=it(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Ze(e,t,r)),"normal"===i&&t in st&&(i=st[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],(function(e,t){S.cssHooks[t]={get:function(e,n,r){if(n)return!ot.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?ct(e,t,r):Je(e,at,(function(){return ct(e,t,r)}))},set:function(e,n,r){var i,o=Qe(e),a=!v.scrollboxSize()&&"absolute"===o.position,s=(a||r)&&"border-box"===S.css(e,"boxSizing",!1,o),u=r?lt(e,t,r,s,o):0;return s&&a&&(u-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-lt(e,t,"border",!1,o)-.5)),u&&(i=de.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=S.css(e,t)),ut(0,n,u)}}})),S.cssHooks.marginLeft=et(v.reliableMarginLeft,(function(e,t){if(t)return(parseFloat(Ze(e,"marginLeft"))||e.getBoundingClientRect().left-Je(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+"px"})),S.each({margin:"",padding:"",border:"Width"},(function(e,t){S.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+he[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(S.cssHooks[e+t].set=ut)})),S.fn.extend({css:function(e,t){return ee(this,(function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Qe(e),i=t.length;a1)}}),S.Tween=ft,ft.prototype={constructor:ft,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=ft.propHooks[this.prop];return e&&e.get?e.get(this):ft.propHooks._default.get(this)},run:function(e){var t,n=ft.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ft.propHooks._default.set(this),this}},ft.prototype.init.prototype=ft.prototype,ft.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[it(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}},ft.propHooks.scrollTop=ft.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=ft.prototype.init,S.fx.step={};var pt,dt,ht=/^(?:toggle|show|hide)$/,gt=/queueHooks$/;function vt(){dt&&(!1===x.hidden&&r.requestAnimationFrame?r.requestAnimationFrame(vt):r.setTimeout(vt,S.fx.interval),S.fx.tick())}function yt(){return r.setTimeout((function(){pt=void 0})),pt=Date.now()}function mt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=he[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function xt(e,t,n){for(var r,i=(bt.tweeners[t]||[]).concat(bt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each((function(){S.removeAttr(this,e)}))}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?wt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!v.radioValue&&"radio"===t&&j(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(V);if(i&&1===e.nodeType)for(;n=i[r++];)e.removeAttribute(n)}}),wt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),(function(e,t){var n=Tt[t]||S.find.attr;Tt[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=Tt[a],Tt[a]=i,i=null!=n(e,t,r)?a:null,Tt[a]=o),i}}));var Ct=/^(?:input|select|textarea|button)$/i,kt=/^(?:a|area)$/i;function St(e){return(e.match(V)||[]).join(" ")}function Et(e){return e.getAttribute&&e.getAttribute("class")||""}function jt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(V)||[]}S.fn.extend({prop:function(e,t){return ee(this,S.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each((function(){delete this[S.propFix[e]||e]}))}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):Ct.test(e.nodeName)||kt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),v.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){S.propFix[this.toLowerCase()]=this})),S.fn.extend({addClass:function(e){var t,n,r,i,o,a;return y(e)?this.each((function(t){S(this).addClass(e.call(this,t,Et(this)))})):(t=jt(e)).length?this.each((function(){if(r=Et(this),n=1===this.nodeType&&" "+St(r)+" "){for(o=0;o-1;)n=n.replace(" "+i+" "," ");a=St(n),r!==a&&this.setAttribute("class",a)}})):this:this.attr("class","")},toggleClass:function(e,t){var n,r,i,o,a=typeof e,s="string"===a||Array.isArray(e);return y(e)?this.each((function(n){S(this).toggleClass(e.call(this,n,Et(this),t),t)})):"boolean"==typeof t&&s?t?this.addClass(e):this.removeClass(e):(n=jt(e),this.each((function(){if(s)for(o=S(this),i=0;i-1)return!0;return!1}});var At=/\r/g;S.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=y(e),this.each((function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,S(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=S.map(i,(function(e){return null==e?"":e+""}))),(t=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))}))):i?(t=S.valHooks[i.type]||S.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(At,""):null==n?"":n:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:St(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],(function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=S.inArray(S(e).val(),t)>-1}},v.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}));var Dt=r.location,Nt={guid:Date.now()},qt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new r.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,(function(e){return e.textContent})).join("\n"):e)),t};var Lt=/^(?:focusinfocus|focusoutblur)$/,Ht=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,i){var o,a,s,u,l,c,f,p,h=[n||x],g=d.call(e,"type")?e.type:e,v=d.call(e,"namespace")?e.namespace.split("."):[];if(a=p=s=n=n||x,3!==n.nodeType&&8!==n.nodeType&&!Lt.test(g+S.event.triggered)&&(g.indexOf(".")>-1&&(v=g.split("."),g=v.shift(),v.sort()),l=g.indexOf(":")<0&&"on"+g,(e=e[S.expando]?e:new S.Event(g,"object"==typeof e&&e)).isTrigger=i?2:3,e.namespace=v.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+v.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),f=S.event.special[g]||{},i||!f.trigger||!1!==f.trigger.apply(n,t))){if(!i&&!f.noBubble&&!m(n)){for(u=f.delegateType||g,Lt.test(u+g)||(a=a.parentNode);a;a=a.parentNode)h.push(a),s=a;s===(n.ownerDocument||x)&&h.push(s.defaultView||s.parentWindow||r)}for(o=0;(a=h[o++])&&!e.isPropagationStopped();)p=a,e.type=o>1?u:f.bindType||g,(c=(se.get(a,"events")||Object.create(null))[e.type]&&se.get(a,"handle"))&&c.apply(a,t),(c=l&&a[l])&&c.apply&&oe(a)&&(e.result=c.apply(a,t),!1===e.result&&e.preventDefault());return e.type=g,i||e.isDefaultPrevented()||f._default&&!1!==f._default.apply(h.pop(),t)||!oe(n)||l&&y(n[g])&&!m(n)&&((s=n[l])&&(n[l]=null),S.event.triggered=g,e.isPropagationStopped()&&p.addEventListener(g,Ht),n[g](),e.isPropagationStopped()&&p.removeEventListener(g,Ht),S.event.triggered=void 0,s&&(n[l]=s)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each((function(){S.event.trigger(e,t,this)}))},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}});var Ot=/\[\]$/,Pt=/\r?\n/g,Mt=/^(?:submit|button|image|reset|file)$/i,Rt=/^(?:input|select|textarea|keygen)/i;function It(e,t,n,r){var i;if(Array.isArray(t))S.each(t,(function(t,i){n||Ot.test(e)?r(e,i):It(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)}));else if(n||"object"!==T(t))r(e,t);else for(i in t)It(e+"["+i+"]",t[i],n,r)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=y(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,(function(){i(this.name,this.value)}));else for(n in e)It(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Rt.test(this.nodeName)&&!Mt.test(e)&&(this.checked||!Se.test(e))})).map((function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,(function(e){return{name:t.name,value:e.replace(Pt,"\r\n")}})):{name:t.name,value:n.replace(Pt,"\r\n")}})).get()}});var Wt=/%20/g,Ft=/#.*$/,$t=/([?&])_=[^&]*/,_t=/^(.*?):[ \t]*([^\r\n]*)$/gm,Bt=/^(?:GET|HEAD)$/,zt=/^\/\//,Xt={},Ut={},Vt="*/".concat("*"),Gt=x.createElement("a");function Yt(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(V)||[];if(y(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function Qt(e,t,n,r){var i={},o=e===Ut;function a(s){var u;return i[s]=!0,S.each(e[s]||[],(function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)})),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function Jt(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Gt.href=Dt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Dt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Dt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Vt,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"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Jt(Jt(e,S.ajaxSettings),t):Jt(S.ajaxSettings,e)},ajaxPrefilter:Yt(Xt),ajaxTransport:Yt(Ut),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var n,i,o,a,s,u,l,c,f,p,d=S.ajaxSetup({},t),h=d.context||d,g=d.context&&(h.nodeType||h.jquery)?S(h):S.event,v=S.Deferred(),y=S.Callbacks("once memory"),m=d.statusCode||{},b={},w={},T="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=_t.exec(o);)a[t[1].toLowerCase()+" "]=(a[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=a[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return l?o:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)m[t]=[m[t],e[t]];return this},abort:function(e){var t=e||T;return n&&n.abort(t),k(0,t),this}};if(v.promise(C),d.url=((e||d.url||Dt.href)+"").replace(zt,Dt.protocol+"//"),d.type=t.method||t.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(V)||[""],null==d.crossDomain){u=x.createElement("a");try{u.href=d.url,u.href=u.href,d.crossDomain=Gt.protocol+"//"+Gt.host!=u.protocol+"//"+u.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&"string"!=typeof d.data&&(d.data=S.param(d.data,d.traditional)),Qt(Xt,d,t,C),l)return C;for(f in(c=S.event&&d.global)&&0==S.active++&&S.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Bt.test(d.type),i=d.url.replace(Ft,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(Wt,"+")):(p=d.url.slice(i.length),d.data&&(d.processData||"string"==typeof d.data)&&(i+=(qt.test(i)?"&":"?")+d.data,delete d.data),!1===d.cache&&(i=i.replace($t,"$1"),p=(qt.test(i)?"&":"?")+"_="+Nt.guid+++p),d.url=i+p),d.ifModified&&(S.lastModified[i]&&C.setRequestHeader("If-Modified-Since",S.lastModified[i]),S.etag[i]&&C.setRequestHeader("If-None-Match",S.etag[i])),(d.data&&d.hasContent&&!1!==d.contentType||t.contentType)&&C.setRequestHeader("Content-Type",d.contentType),C.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Vt+"; q=0.01":""):d.accepts["*"]),d.headers)C.setRequestHeader(f,d.headers[f]);if(d.beforeSend&&(!1===d.beforeSend.call(h,C,d)||l))return C.abort();if(T="abort",y.add(d.complete),C.done(d.success),C.fail(d.error),n=Qt(Ut,d,t,C)){if(C.readyState=1,c&&g.trigger("ajaxSend",[C,d]),l)return C;d.async&&d.timeout>0&&(s=r.setTimeout((function(){C.abort("timeout")}),d.timeout));try{l=!1,n.send(b,k)}catch(e){if(l)throw e;k(-1,e)}}else k(-1,"No Transport");function k(e,t,a,u){var f,p,x,b,w,T=t;l||(l=!0,s&&r.clearTimeout(s),n=void 0,o=u||"",C.readyState=e>0?4:0,f=e>=200&&e<300||304===e,a&&(b=function(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(d,C,a)),!f&&S.inArray("script",d.dataTypes)>-1&&S.inArray("json",d.dataTypes)<0&&(d.converters["text script"]=function(){}),b=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(d,b,C,f),f?(d.ifModified&&((w=C.getResponseHeader("Last-Modified"))&&(S.lastModified[i]=w),(w=C.getResponseHeader("etag"))&&(S.etag[i]=w)),204===e||"HEAD"===d.type?T="nocontent":304===e?T="notmodified":(T=b.state,p=b.data,f=!(x=b.error))):(x=T,!e&&T||(T="error",e<0&&(e=0))),C.status=e,C.statusText=(t||T)+"",f?v.resolveWith(h,[p,T,C]):v.rejectWith(h,[C,T,x]),C.statusCode(m),m=void 0,c&&g.trigger(f?"ajaxSuccess":"ajaxError",[C,d,f?p:x]),y.fireWith(h,[C,T]),c&&(g.trigger("ajaxComplete",[C,d]),--S.active||S.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],(function(e,t){S[t]=function(e,n,r,i){return y(n)&&(i=i||r,r=n,n=void 0),S.ajax(S.extend({url:e,type:t,dataType:i,data:n,success:r},S.isPlainObject(e)&&e))}})),S.ajaxPrefilter((function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")})),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(y(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(e){return y(e)?this.each((function(t){S(this).wrapInner(e.call(this,t))})):this.each((function(){var t=S(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)}))},wrap:function(e){var t=y(e);return this.each((function(n){S(this).wrapAll(t?e.call(this,n):e)}))},unwrap:function(e){return this.parent(e).not("body").each((function(){S(this).replaceWith(this.childNodes)})),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new r.XMLHttpRequest}catch(e){}};var Kt={0:200,1223:204},Zt=S.ajaxSettings.xhr();v.cors=!!Zt&&"withCredentials"in Zt,v.ajax=Zt=!!Zt,S.ajaxTransport((function(e){var t,n;if(v.cors||Zt&&!e.crossDomain)return{send:function(i,o){var a,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(a in e.xhrFields)s[a]=e.xhrFields[a];for(a in e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest"),i)s.setRequestHeader(a,i[a]);t=function(e){return function(){t&&(t=n=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Kt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=t(),n=s.onerror=s.ontimeout=t("error"),void 0!==s.onabort?s.onabort=n:s.onreadystatechange=function(){4===s.readyState&&r.setTimeout((function(){t&&n()}))},t=t("abort");try{s.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}})),S.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),S.ajaxTransport("script",(function(e){var t,n;if(e.crossDomain||e.scriptAttrs)return{send:function(r,i){t=S("`.\n this.sequenceIndex = Number(c === CharCodes.Lt);\n }\n };\n Tokenizer.prototype.stateCDATASequence = function (c) {\n if (c === Sequences.Cdata[this.sequenceIndex]) {\n if (++this.sequenceIndex === Sequences.Cdata.length) {\n this.state = State.InCommentLike;\n this.currentSequence = Sequences.CdataEnd;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n }\n }\n else {\n this.sequenceIndex = 0;\n this.state = State.InDeclaration;\n this.stateInDeclaration(c); // Reconsume the character\n }\n };\n /**\n * When we wait for one specific character, we can speed things up\n * by skipping through the buffer until we find it.\n *\n * @returns Whether the character was found.\n */\n Tokenizer.prototype.fastForwardTo = function (c) {\n while (++this.index < this.buffer.length + this.offset) {\n if (this.buffer.charCodeAt(this.index - this.offset) === c) {\n return true;\n }\n }\n /*\n * We increment the index at the end of the `parse` loop,\n * so set it to `buffer.length - 1` here.\n *\n * TODO: Refactor `parse` to increment index before calling states.\n */\n this.index = this.buffer.length + this.offset - 1;\n return false;\n };\n /**\n * Comments and CDATA end with `-->` and `]]>`.\n *\n * Their common qualities are:\n * - Their end sequences have a distinct character they start with.\n * - That character is then repeated, so we have to check multiple repeats.\n * - All characters but the start character of the sequence can be skipped.\n */\n Tokenizer.prototype.stateInCommentLike = function (c) {\n if (c === this.currentSequence[this.sequenceIndex]) {\n if (++this.sequenceIndex === this.currentSequence.length) {\n if (this.currentSequence === Sequences.CdataEnd) {\n this.cbs.oncdata(this.sectionStart, this.index, 2);\n }\n else {\n this.cbs.oncomment(this.sectionStart, this.index, 2);\n }\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n this.state = State.Text;\n }\n }\n else if (this.sequenceIndex === 0) {\n // Fast-forward to the first character of the sequence\n if (this.fastForwardTo(this.currentSequence[0])) {\n this.sequenceIndex = 1;\n }\n }\n else if (c !== this.currentSequence[this.sequenceIndex - 1]) {\n // Allow long sequences, eg. --->, ]]]>\n this.sequenceIndex = 0;\n }\n };\n /**\n * HTML only allows ASCII alpha characters (a-z and A-Z) at the beginning of a tag name.\n *\n * XML allows a lot more characters here (@see https://www.w3.org/TR/REC-xml/#NT-NameStartChar).\n * We allow anything that wouldn't end the tag.\n */\n Tokenizer.prototype.isTagStartChar = function (c) {\n return this.xmlMode ? !isEndOfTagSection(c) : isASCIIAlpha(c);\n };\n Tokenizer.prototype.startSpecial = function (sequence, offset) {\n this.isSpecial = true;\n this.currentSequence = sequence;\n this.sequenceIndex = offset;\n this.state = State.SpecialStartSequence;\n };\n Tokenizer.prototype.stateBeforeTagName = function (c) {\n if (c === CharCodes.ExclamationMark) {\n this.state = State.BeforeDeclaration;\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.Questionmark) {\n this.state = State.InProcessingInstruction;\n this.sectionStart = this.index + 1;\n }\n else if (this.isTagStartChar(c)) {\n var lower = c | 0x20;\n this.sectionStart = this.index;\n if (!this.xmlMode && lower === Sequences.TitleEnd[2]) {\n this.startSpecial(Sequences.TitleEnd, 3);\n }\n else {\n this.state =\n !this.xmlMode && lower === Sequences.ScriptEnd[2]\n ? State.BeforeSpecialS\n : State.InTagName;\n }\n }\n else if (c === CharCodes.Slash) {\n this.state = State.BeforeClosingTagName;\n }\n else {\n this.state = State.Text;\n this.stateText(c);\n }\n };\n Tokenizer.prototype.stateInTagName = function (c) {\n if (isEndOfTagSection(c)) {\n this.cbs.onopentagname(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n };\n Tokenizer.prototype.stateBeforeClosingTagName = function (c) {\n if (isWhitespace(c)) {\n // Ignore\n }\n else if (c === CharCodes.Gt) {\n this.state = State.Text;\n }\n else {\n this.state = this.isTagStartChar(c)\n ? State.InClosingTagName\n : State.InSpecialComment;\n this.sectionStart = this.index;\n }\n };\n Tokenizer.prototype.stateInClosingTagName = function (c) {\n if (c === CharCodes.Gt || isWhitespace(c)) {\n this.cbs.onclosetag(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.AfterClosingTagName;\n this.stateAfterClosingTagName(c);\n }\n };\n Tokenizer.prototype.stateAfterClosingTagName = function (c) {\n // Skip everything until \">\"\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.state = State.Text;\n this.baseState = State.Text;\n this.sectionStart = this.index + 1;\n }\n };\n Tokenizer.prototype.stateBeforeAttributeName = function (c) {\n if (c === CharCodes.Gt) {\n this.cbs.onopentagend(this.index);\n if (this.isSpecial) {\n this.state = State.InSpecialTag;\n this.sequenceIndex = 0;\n }\n else {\n this.state = State.Text;\n }\n this.baseState = this.state;\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.Slash) {\n this.state = State.InSelfClosingTag;\n }\n else if (!isWhitespace(c)) {\n this.state = State.InAttributeName;\n this.sectionStart = this.index;\n }\n };\n Tokenizer.prototype.stateInSelfClosingTag = function (c) {\n if (c === CharCodes.Gt) {\n this.cbs.onselfclosingtag(this.index);\n this.state = State.Text;\n this.baseState = State.Text;\n this.sectionStart = this.index + 1;\n this.isSpecial = false; // Reset special state, in case of self-closing special tags\n }\n else if (!isWhitespace(c)) {\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n };\n Tokenizer.prototype.stateInAttributeName = function (c) {\n if (c === CharCodes.Eq || isEndOfTagSection(c)) {\n this.cbs.onattribname(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.AfterAttributeName;\n this.stateAfterAttributeName(c);\n }\n };\n Tokenizer.prototype.stateAfterAttributeName = function (c) {\n if (c === CharCodes.Eq) {\n this.state = State.BeforeAttributeValue;\n }\n else if (c === CharCodes.Slash || c === CharCodes.Gt) {\n this.cbs.onattribend(QuoteType.NoValue, this.index);\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n else if (!isWhitespace(c)) {\n this.cbs.onattribend(QuoteType.NoValue, this.index);\n this.state = State.InAttributeName;\n this.sectionStart = this.index;\n }\n };\n Tokenizer.prototype.stateBeforeAttributeValue = function (c) {\n if (c === CharCodes.DoubleQuote) {\n this.state = State.InAttributeValueDq;\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.SingleQuote) {\n this.state = State.InAttributeValueSq;\n this.sectionStart = this.index + 1;\n }\n else if (!isWhitespace(c)) {\n this.sectionStart = this.index;\n this.state = State.InAttributeValueNq;\n this.stateInAttributeValueNoQuotes(c); // Reconsume token\n }\n };\n Tokenizer.prototype.handleInAttributeValue = function (c, quote) {\n if (c === quote ||\n (!this.decodeEntities && this.fastForwardTo(quote))) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.cbs.onattribend(quote === CharCodes.DoubleQuote\n ? QuoteType.Double\n : QuoteType.Single, this.index);\n this.state = State.BeforeAttributeName;\n }\n else if (this.decodeEntities && c === CharCodes.Amp) {\n this.baseState = this.state;\n this.state = State.BeforeEntity;\n }\n };\n Tokenizer.prototype.stateInAttributeValueDoubleQuotes = function (c) {\n this.handleInAttributeValue(c, CharCodes.DoubleQuote);\n };\n Tokenizer.prototype.stateInAttributeValueSingleQuotes = function (c) {\n this.handleInAttributeValue(c, CharCodes.SingleQuote);\n };\n Tokenizer.prototype.stateInAttributeValueNoQuotes = function (c) {\n if (isWhitespace(c) || c === CharCodes.Gt) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.cbs.onattribend(QuoteType.Unquoted, this.index);\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n else if (this.decodeEntities && c === CharCodes.Amp) {\n this.baseState = this.state;\n this.state = State.BeforeEntity;\n }\n };\n Tokenizer.prototype.stateBeforeDeclaration = function (c) {\n if (c === CharCodes.OpeningSquareBracket) {\n this.state = State.CDATASequence;\n this.sequenceIndex = 0;\n }\n else {\n this.state =\n c === CharCodes.Dash\n ? State.BeforeComment\n : State.InDeclaration;\n }\n };\n Tokenizer.prototype.stateInDeclaration = function (c) {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.ondeclaration(this.sectionStart, this.index);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n };\n Tokenizer.prototype.stateInProcessingInstruction = function (c) {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.onprocessinginstruction(this.sectionStart, this.index);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n };\n Tokenizer.prototype.stateBeforeComment = function (c) {\n if (c === CharCodes.Dash) {\n this.state = State.InCommentLike;\n this.currentSequence = Sequences.CommentEnd;\n // Allow short comments (eg. )\n this.sequenceIndex = 2;\n this.sectionStart = this.index + 1;\n }\n else {\n this.state = State.InDeclaration;\n }\n };\n Tokenizer.prototype.stateInSpecialComment = function (c) {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n };\n Tokenizer.prototype.stateBeforeSpecialS = function (c) {\n var lower = c | 0x20;\n if (lower === Sequences.ScriptEnd[3]) {\n this.startSpecial(Sequences.ScriptEnd, 4);\n }\n else if (lower === Sequences.StyleEnd[3]) {\n this.startSpecial(Sequences.StyleEnd, 4);\n }\n else {\n this.state = State.InTagName;\n this.stateInTagName(c); // Consume the token again\n }\n };\n Tokenizer.prototype.stateBeforeEntity = function (c) {\n // Start excess with 1 to include the '&'\n this.entityExcess = 1;\n this.entityResult = 0;\n if (c === CharCodes.Number) {\n this.state = State.BeforeNumericEntity;\n }\n else if (c === CharCodes.Amp) {\n // We have two `&` characters in a row. Stay in the current state.\n }\n else {\n this.trieIndex = 0;\n this.trieCurrent = this.entityTrie[0];\n this.state = State.InNamedEntity;\n this.stateInNamedEntity(c);\n }\n };\n Tokenizer.prototype.stateInNamedEntity = function (c) {\n this.entityExcess += 1;\n this.trieIndex = (0, decode_js_1.determineBranch)(this.entityTrie, this.trieCurrent, this.trieIndex + 1, c);\n if (this.trieIndex < 0) {\n this.emitNamedEntity();\n this.index--;\n return;\n }\n this.trieCurrent = this.entityTrie[this.trieIndex];\n var masked = this.trieCurrent & decode_js_1.BinTrieFlags.VALUE_LENGTH;\n // If the branch is a value, store it and continue\n if (masked) {\n // The mask is the number of bytes of the value, including the current byte.\n var valueLength = (masked >> 14) - 1;\n // If we have a legacy entity while parsing strictly, just skip the number of bytes\n if (!this.allowLegacyEntity() && c !== CharCodes.Semi) {\n this.trieIndex += valueLength;\n }\n else {\n // Add 1 as we have already incremented the excess\n var entityStart = this.index - this.entityExcess + 1;\n if (entityStart > this.sectionStart) {\n this.emitPartial(this.sectionStart, entityStart);\n }\n // If this is a surrogate pair, consume the next two bytes\n this.entityResult = this.trieIndex;\n this.trieIndex += valueLength;\n this.entityExcess = 0;\n this.sectionStart = this.index + 1;\n if (valueLength === 0) {\n this.emitNamedEntity();\n }\n }\n }\n };\n Tokenizer.prototype.emitNamedEntity = function () {\n this.state = this.baseState;\n if (this.entityResult === 0) {\n return;\n }\n var valueLength = (this.entityTrie[this.entityResult] & decode_js_1.BinTrieFlags.VALUE_LENGTH) >>\n 14;\n switch (valueLength) {\n case 1: {\n this.emitCodePoint(this.entityTrie[this.entityResult] &\n ~decode_js_1.BinTrieFlags.VALUE_LENGTH);\n break;\n }\n case 2: {\n this.emitCodePoint(this.entityTrie[this.entityResult + 1]);\n break;\n }\n case 3: {\n this.emitCodePoint(this.entityTrie[this.entityResult + 1]);\n this.emitCodePoint(this.entityTrie[this.entityResult + 2]);\n }\n }\n };\n Tokenizer.prototype.stateBeforeNumericEntity = function (c) {\n if ((c | 0x20) === CharCodes.LowerX) {\n this.entityExcess++;\n this.state = State.InHexEntity;\n }\n else {\n this.state = State.InNumericEntity;\n this.stateInNumericEntity(c);\n }\n };\n Tokenizer.prototype.emitNumericEntity = function (strict) {\n var entityStart = this.index - this.entityExcess - 1;\n var numberStart = entityStart + 2 + Number(this.state === State.InHexEntity);\n if (numberStart !== this.index) {\n // Emit leading data if any\n if (entityStart > this.sectionStart) {\n this.emitPartial(this.sectionStart, entityStart);\n }\n this.sectionStart = this.index + Number(strict);\n this.emitCodePoint((0, decode_js_1.replaceCodePoint)(this.entityResult));\n }\n this.state = this.baseState;\n };\n Tokenizer.prototype.stateInNumericEntity = function (c) {\n if (c === CharCodes.Semi) {\n this.emitNumericEntity(true);\n }\n else if (isNumber(c)) {\n this.entityResult = this.entityResult * 10 + (c - CharCodes.Zero);\n this.entityExcess++;\n }\n else {\n if (this.allowLegacyEntity()) {\n this.emitNumericEntity(false);\n }\n else {\n this.state = this.baseState;\n }\n this.index--;\n }\n };\n Tokenizer.prototype.stateInHexEntity = function (c) {\n if (c === CharCodes.Semi) {\n this.emitNumericEntity(true);\n }\n else if (isNumber(c)) {\n this.entityResult = this.entityResult * 16 + (c - CharCodes.Zero);\n this.entityExcess++;\n }\n else if (isHexDigit(c)) {\n this.entityResult =\n this.entityResult * 16 + ((c | 0x20) - CharCodes.LowerA + 10);\n this.entityExcess++;\n }\n else {\n if (this.allowLegacyEntity()) {\n this.emitNumericEntity(false);\n }\n else {\n this.state = this.baseState;\n }\n this.index--;\n }\n };\n Tokenizer.prototype.allowLegacyEntity = function () {\n return (!this.xmlMode &&\n (this.baseState === State.Text ||\n this.baseState === State.InSpecialTag));\n };\n /**\n * Remove data that has already been consumed from the buffer.\n */\n Tokenizer.prototype.cleanup = function () {\n // If we are inside of text or attributes, emit what we already have.\n if (this.running && this.sectionStart !== this.index) {\n if (this.state === State.Text ||\n (this.state === State.InSpecialTag && this.sequenceIndex === 0)) {\n this.cbs.ontext(this.sectionStart, this.index);\n this.sectionStart = this.index;\n }\n else if (this.state === State.InAttributeValueDq ||\n this.state === State.InAttributeValueSq ||\n this.state === State.InAttributeValueNq) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = this.index;\n }\n }\n };\n Tokenizer.prototype.shouldContinue = function () {\n return this.index < this.buffer.length + this.offset && this.running;\n };\n /**\n * Iterates through the buffer, calling the function corresponding to the current state.\n *\n * States that are more likely to be hit are higher up, as a performance improvement.\n */\n Tokenizer.prototype.parse = function () {\n while (this.shouldContinue()) {\n var c = this.buffer.charCodeAt(this.index - this.offset);\n switch (this.state) {\n case State.Text: {\n this.stateText(c);\n break;\n }\n case State.SpecialStartSequence: {\n this.stateSpecialStartSequence(c);\n break;\n }\n case State.InSpecialTag: {\n this.stateInSpecialTag(c);\n break;\n }\n case State.CDATASequence: {\n this.stateCDATASequence(c);\n break;\n }\n case State.InAttributeValueDq: {\n this.stateInAttributeValueDoubleQuotes(c);\n break;\n }\n case State.InAttributeName: {\n this.stateInAttributeName(c);\n break;\n }\n case State.InCommentLike: {\n this.stateInCommentLike(c);\n break;\n }\n case State.InSpecialComment: {\n this.stateInSpecialComment(c);\n break;\n }\n case State.BeforeAttributeName: {\n this.stateBeforeAttributeName(c);\n break;\n }\n case State.InTagName: {\n this.stateInTagName(c);\n break;\n }\n case State.InClosingTagName: {\n this.stateInClosingTagName(c);\n break;\n }\n case State.BeforeTagName: {\n this.stateBeforeTagName(c);\n break;\n }\n case State.AfterAttributeName: {\n this.stateAfterAttributeName(c);\n break;\n }\n case State.InAttributeValueSq: {\n this.stateInAttributeValueSingleQuotes(c);\n break;\n }\n case State.BeforeAttributeValue: {\n this.stateBeforeAttributeValue(c);\n break;\n }\n case State.BeforeClosingTagName: {\n this.stateBeforeClosingTagName(c);\n break;\n }\n case State.AfterClosingTagName: {\n this.stateAfterClosingTagName(c);\n break;\n }\n case State.BeforeSpecialS: {\n this.stateBeforeSpecialS(c);\n break;\n }\n case State.InAttributeValueNq: {\n this.stateInAttributeValueNoQuotes(c);\n break;\n }\n case State.InSelfClosingTag: {\n this.stateInSelfClosingTag(c);\n break;\n }\n case State.InDeclaration: {\n this.stateInDeclaration(c);\n break;\n }\n case State.BeforeDeclaration: {\n this.stateBeforeDeclaration(c);\n break;\n }\n case State.BeforeComment: {\n this.stateBeforeComment(c);\n break;\n }\n case State.InProcessingInstruction: {\n this.stateInProcessingInstruction(c);\n break;\n }\n case State.InNamedEntity: {\n this.stateInNamedEntity(c);\n break;\n }\n case State.BeforeEntity: {\n this.stateBeforeEntity(c);\n break;\n }\n case State.InHexEntity: {\n this.stateInHexEntity(c);\n break;\n }\n case State.InNumericEntity: {\n this.stateInNumericEntity(c);\n break;\n }\n default: {\n // `this._state === State.BeforeNumericEntity`\n this.stateBeforeNumericEntity(c);\n }\n }\n this.index++;\n }\n this.cleanup();\n };\n Tokenizer.prototype.finish = function () {\n if (this.state === State.InNamedEntity) {\n this.emitNamedEntity();\n }\n // If there is remaining data, emit it in a reasonable way\n if (this.sectionStart < this.index) {\n this.handleTrailingData();\n }\n this.cbs.onend();\n };\n /** Handle any trailing data. */\n Tokenizer.prototype.handleTrailingData = function () {\n var endIndex = this.buffer.length + this.offset;\n if (this.state === State.InCommentLike) {\n if (this.currentSequence === Sequences.CdataEnd) {\n this.cbs.oncdata(this.sectionStart, endIndex, 0);\n }\n else {\n this.cbs.oncomment(this.sectionStart, endIndex, 0);\n }\n }\n else if (this.state === State.InNumericEntity &&\n this.allowLegacyEntity()) {\n this.emitNumericEntity(false);\n // All trailing data will have been consumed\n }\n else if (this.state === State.InHexEntity &&\n this.allowLegacyEntity()) {\n this.emitNumericEntity(false);\n // All trailing data will have been consumed\n }\n else if (this.state === State.InTagName ||\n this.state === State.BeforeAttributeName ||\n this.state === State.BeforeAttributeValue ||\n this.state === State.AfterAttributeName ||\n this.state === State.InAttributeName ||\n this.state === State.InAttributeValueSq ||\n this.state === State.InAttributeValueDq ||\n this.state === State.InAttributeValueNq ||\n this.state === State.InClosingTagName) {\n /*\n * If we are currently in an opening or closing tag, us not calling the\n * respective callback signals that the tag should be ignored.\n */\n }\n else {\n this.cbs.ontext(this.sectionStart, endIndex);\n }\n };\n Tokenizer.prototype.emitPartial = function (start, endIndex) {\n if (this.baseState !== State.Text &&\n this.baseState !== State.InSpecialTag) {\n this.cbs.onattribdata(start, endIndex);\n }\n else {\n this.cbs.ontext(start, endIndex);\n }\n };\n Tokenizer.prototype.emitCodePoint = function (cp) {\n if (this.baseState !== State.Text &&\n this.baseState !== State.InSpecialTag) {\n this.cbs.onattribentity(cp);\n }\n else {\n this.cbs.ontextentity(cp);\n }\n };\n return Tokenizer;\n}());\nexports.default = Tokenizer;\n//# sourceMappingURL=Tokenizer.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DomUtils = exports.parseFeed = exports.getFeed = exports.ElementType = exports.Tokenizer = exports.createDomStream = exports.parseDOM = exports.parseDocument = exports.DefaultHandler = exports.DomHandler = exports.Parser = void 0;\nvar Parser_js_1 = require(\"./Parser.js\");\nvar Parser_js_2 = require(\"./Parser.js\");\nObject.defineProperty(exports, \"Parser\", { enumerable: true, get: function () { return Parser_js_2.Parser; } });\nvar domhandler_1 = require(\"domhandler\");\nvar domhandler_2 = require(\"domhandler\");\nObject.defineProperty(exports, \"DomHandler\", { enumerable: true, get: function () { return domhandler_2.DomHandler; } });\n// Old name for DomHandler\nObject.defineProperty(exports, \"DefaultHandler\", { enumerable: true, get: function () { return domhandler_2.DomHandler; } });\n// Helper methods\n/**\n * Parses the data, returns the resulting document.\n *\n * @param data The data that should be parsed.\n * @param options Optional options for the parser and DOM builder.\n */\nfunction parseDocument(data, options) {\n var handler = new domhandler_1.DomHandler(undefined, options);\n new Parser_js_1.Parser(handler, options).end(data);\n return handler.root;\n}\nexports.parseDocument = parseDocument;\n/**\n * Parses data, returns an array of the root nodes.\n *\n * Note that the root nodes still have a `Document` node as their parent.\n * Use `parseDocument` to get the `Document` node instead.\n *\n * @param data The data that should be parsed.\n * @param options Optional options for the parser and DOM builder.\n * @deprecated Use `parseDocument` instead.\n */\nfunction parseDOM(data, options) {\n return parseDocument(data, options).children;\n}\nexports.parseDOM = parseDOM;\n/**\n * Creates a parser instance, with an attached DOM handler.\n *\n * @param callback A callback that will be called once parsing has been completed.\n * @param options Optional options for the parser and DOM builder.\n * @param elementCallback An optional callback that will be called every time a tag has been completed inside of the DOM.\n */\nfunction createDomStream(callback, options, elementCallback) {\n var handler = new domhandler_1.DomHandler(callback, options, elementCallback);\n return new Parser_js_1.Parser(handler, options);\n}\nexports.createDomStream = createDomStream;\nvar Tokenizer_js_1 = require(\"./Tokenizer.js\");\nObject.defineProperty(exports, \"Tokenizer\", { enumerable: true, get: function () { return __importDefault(Tokenizer_js_1).default; } });\n/*\n * All of the following exports exist for backwards-compatibility.\n * They should probably be removed eventually.\n */\nexports.ElementType = __importStar(require(\"domelementtype\"));\nvar domutils_1 = require(\"domutils\");\nvar domutils_2 = require(\"domutils\");\nObject.defineProperty(exports, \"getFeed\", { enumerable: true, get: function () { return domutils_2.getFeed; } });\nvar parseFeedDefaultOptions = { xmlMode: true };\n/**\n * Parse a feed.\n *\n * @param feed The feed that should be parsed, as a string.\n * @param options Optionally, options for parsing. When using this, you should set `xmlMode` to `true`.\n */\nfunction parseFeed(feed, options) {\n if (options === void 0) { options = parseFeedDefaultOptions; }\n return (0, domutils_1.getFeed)(parseDOM(feed, options));\n}\nexports.parseFeed = parseFeed;\nexports.DomUtils = __importStar(require(\"domutils\"));\n//# sourceMappingURL=index.js.map","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n/*!\n * is-plain-object \n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o) {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nfunction isPlainObject(o) {\n var ctor,prot;\n\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n ctor = o.constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n\nexports.isPlainObject = isPlainObject;\n","/*!\n * jQuery JavaScript Library v3.7.1\n * https://jquery.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2023-08-28T13:37Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket trac-14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar version = \"3.7.1\",\n\n\trhtmlSuffix = /HTML$/i,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\n\t// Retrieve the text value of an array of DOM nodes\n\ttext: function( elem ) {\n\t\tvar node,\n\t\t\tret = \"\",\n\t\t\ti = 0,\n\t\t\tnodeType = elem.nodeType;\n\n\t\tif ( !nodeType ) {\n\n\t\t\t// If no nodeType, this is expected to be an array\n\t\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t\t// Do not traverse comment nodes\n\t\t\t\tret += jQuery.text( node );\n\t\t\t}\n\t\t}\n\t\tif ( nodeType === 1 || nodeType === 11 ) {\n\t\t\treturn elem.textContent;\n\t\t}\n\t\tif ( nodeType === 9 ) {\n\t\t\treturn elem.documentElement.textContent;\n\t\t}\n\t\tif ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\n\t\t// Do not include comment or processing instruction nodes\n\n\t\treturn ret;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tisXMLDoc: function( elem ) {\n\t\tvar namespace = elem && elem.namespaceURI,\n\t\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t\t// Assume HTML when documentElement doesn't yet exist, such as inside\n\t\t// document fragments.\n\t\treturn !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar pop = arr.pop;\n\n\nvar sort = arr.sort;\n\n\nvar splice = arr.splice;\n\n\nvar whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\";\n\n\nvar rtrimCSS = new RegExp(\n\t\"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\",\n\t\"g\"\n);\n\n\n\n\n// Note: an element does not contain itself\njQuery.contains = function( a, b ) {\n\tvar bup = b && b.parentNode;\n\n\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE doesn't have `contains` on SVG.\n\t\ta.contains ?\n\t\t\ta.contains( bup ) :\n\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t) );\n};\n\n\n\n\n// CSS string/identifier serialization\n// https://drafts.csswg.org/cssom/#common-serializing-idioms\nvar rcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;\n\nfunction fcssescape( ch, asCodePoint ) {\n\tif ( asCodePoint ) {\n\n\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\tif ( ch === \"\\0\" ) {\n\t\t\treturn \"\\uFFFD\";\n\t\t}\n\n\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t}\n\n\t// Other potentially-special ASCII characters get backslash-escaped\n\treturn \"\\\\\" + ch;\n}\n\njQuery.escapeSelector = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\n\n\n\nvar preferredDoc = document,\n\tpushNative = push;\n\n( function() {\n\nvar i,\n\tExpr,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\tpush = pushNative,\n\n\t// Local document vars\n\tdocument,\n\tdocumentElement,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\tmatches,\n\n\t// Instance-specific data\n\texpando = jQuery.expando,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|\" +\n\t\t\"loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trleadingCombinator = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" +\n\t\twhitespace + \"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\tID: new RegExp( \"^#(\" + identifier + \")\" ),\n\t\tCLASS: new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\tTAG: new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\tATTR: new RegExp( \"^\" + attributes ),\n\t\tPSEUDO: new RegExp( \"^\" + pseudos ),\n\t\tCHILD: new RegExp(\n\t\t\t\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\tbool: new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\tneedsContext: new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// https://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\tif ( nonHex ) {\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\treturn nonHex;\n\t\t}\n\n\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t// Support: IE <=11+\n\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t// surrogate pair\n\t\treturn high < 0 ?\n\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes; see `setDocument`.\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE/Edge.\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && nodeName( elem, \"fieldset\" );\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android <=4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = {\n\t\tapply: function( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t},\n\t\tcall: function( target ) {\n\t\t\tpushNative.apply( target, slice.call( arguments, 1 ) );\n\t\t}\n\t};\n}\n\nfunction find( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tfind.contains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( !nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when\n\t\t\t\t\t// strict-comparing two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( newContext != context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = jQuery.escapeSelector( nid );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrimCSS, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties\n\t\t// (see https://github.com/jquery/sizzle/issues/157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by jQuery selector module\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn nodeName( elem, \"input\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn ( nodeName( elem, \"input\" ) || nodeName( elem, \"button\" ) ) &&\n\t\t\telem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11+\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a jQuery selector context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [node] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nfunction setDocument( node ) {\n\tvar subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocumentElement = document.documentElement;\n\tdocumentIsHTML = !jQuery.isXMLDoc( document );\n\n\t// Support: iOS 7 only, IE 9 - 11+\n\t// Older browsers didn't support unprefixed `matches`.\n\tmatches = documentElement.matches ||\n\t\tdocumentElement.webkitMatchesSelector ||\n\t\tdocumentElement.msMatchesSelector;\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors\n\t// (see trac-13936).\n\t// Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,\n\t// all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.\n\tif ( documentElement.msMatchesSelector &&\n\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tpreferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t\tsubWindow.addEventListener( \"unload\", unloadHandler );\n\t}\n\n\t// Support: IE <10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocumentElement.appendChild( el ).id = jQuery.expando;\n\t\treturn !document.getElementsByName ||\n\t\t\t!document.getElementsByName( jQuery.expando ).length;\n\t} );\n\n\t// Support: IE 9 only\n\t// Check to see if it's possible to do matchesSelector\n\t// on a disconnected node.\n\tsupport.disconnectedMatch = assert( function( el ) {\n\t\treturn matches.call( el, \"*\" );\n\t} );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// IE/Edge don't support the :scope pseudo-class.\n\tsupport.scope = assert( function() {\n\t\treturn document.querySelectorAll( \":scope\" );\n\t} );\n\n\t// Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only\n\t// Make sure the `:has()` argument is parsed unforgivingly.\n\t// We include `*` in the test to detect buggy implementations that are\n\t// _selectively_ forgiving (specifically when the list includes at least\n\t// one valid selector).\n\t// Note that we treat complete lack of support for `:has()` as if it were\n\t// spec-compliant support, which is fine because use of `:has()` in such\n\t// environments will fail in the qSA path and fall back to jQuery traversal\n\t// anyway.\n\tsupport.cssHas = assert( function() {\n\t\ttry {\n\t\t\tdocument.querySelector( \":has(*,:jqfake)\" );\n\t\t\treturn false;\n\t\t} catch ( e ) {\n\t\t\treturn true;\n\t\t}\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter.ID = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter.ID = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find.TAG = function( tag, context ) {\n\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t// DocumentFragment nodes don't have gEBTN\n\t\t} else {\n\t\t\treturn context.querySelectorAll( tag );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find.CLASS = function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\trbuggyQSA = [];\n\n\t// Build QSA regex\n\t// Regex strategy adopted from Diego Perini\n\tassert( function( el ) {\n\n\t\tvar input;\n\n\t\tdocumentElement.appendChild( el ).innerHTML =\n\t\t\t\"\" +\n\t\t\t\"\";\n\n\t\t// Support: iOS <=7 - 8 only\n\t\t// Boolean attributes and \"value\" are not treated correctly in some XML documents\n\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t}\n\n\t\t// Support: iOS <=7 - 8 only\n\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\trbuggyQSA.push( \"~=\" );\n\t\t}\n\n\t\t// Support: iOS 8 only\n\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t}\n\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\trbuggyQSA.push( \":checked\" );\n\t\t}\n\n\t\t// Support: Windows 8 Native Apps\n\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tdocumentElement.appendChild( el ).disabled = true;\n\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t}\n\n\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t// Adding a temporary attribute to the document before the selection works\n\t\t// around the issue.\n\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"name\", \"\" );\n\t\tel.appendChild( input );\n\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t}\n\t} );\n\n\tif ( !support.cssHas ) {\n\n\t\t// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+\n\t\t// Our regular `try-catch` mechanism fails to detect natively-unsupported\n\t\t// pseudo-classes inside `:has()` (such as `:has(:contains(\"Foo\"))`)\n\t\t// in browsers that parse the `:has()` argument as a forgiving selector list.\n\t\t// https://drafts.csswg.org/selectors/#relational now requires the argument\n\t\t// to be parsed unforgivingly, but browsers have not yet fully adjusted.\n\t\trbuggyQSA.push( \":has\" );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = function( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a === document || a.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b === document || b.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t};\n\n\treturn document;\n}\n\nfind.matches = function( expr, elements ) {\n\treturn find( expr, null, null, elements );\n};\n\nfind.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn find( expr, document, null, [ elem ] ).length > 0;\n};\n\nfind.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn jQuery.contains( context, elem );\n};\n\n\nfind.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (see trac-13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\tif ( val !== undefined ) {\n\t\treturn val;\n\t}\n\n\treturn elem.getAttribute( name );\n};\n\nfind.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\njQuery.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\t//\n\t// Support: Android <=4.0+\n\t// Testing for detecting duplicates is unpredictable so instead assume we can't\n\t// depend on duplicate detection in all browsers without a stable sort.\n\thasDuplicate = !support.sortStable;\n\tsortInput = !support.sortStable && slice.call( results, 0 );\n\tsort.call( results, sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tsplice.call( results, duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\njQuery.fn.uniqueSort = function() {\n\treturn this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );\n};\n\nExpr = jQuery.expr = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\tATTR: function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || \"\" )\n\t\t\t\t.replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\tCHILD: function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" )\n\t\t\t\t);\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPSEUDO: function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr.CHILD.test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\tTAG: function( nodeNameSelector ) {\n\t\t\tvar expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn nodeName( elem, expectedNodeName );\n\t\t\t\t};\n\t\t},\n\n\t\tCLASS: function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace + \")\" + className +\n\t\t\t\t\t\"(\" + whitespace + \"|$)\" ) ) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\tATTR: function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = find.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\tif ( operator === \"=\" ) {\n\t\t\t\t\treturn result === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"!=\" ) {\n\t\t\t\t\treturn result !== check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"^=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) === 0;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"*=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"$=\" ) {\n\t\t\t\t\treturn check && result.slice( -check.length ) === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"~=\" ) {\n\t\t\t\t\treturn ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" )\n\t\t\t\t\t\t.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"|=\" ) {\n\t\t\t\t\treturn result === check || result.slice( 0, check.length + 1 ) === check + \"-\";\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t};\n\t\t},\n\n\t\tCHILD: function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || ( parent[ expando ] = {} );\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\t\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\t\t\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\tPSEUDO: function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// https://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tfind.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as jQuery does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\tnot: markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrimCSS, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element\n\t\t\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\thas: markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn find( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\tcontains: markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// https://www.w3.org/TR/selectors/#lang-pseudo\n\t\tlang: markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tfind.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\ttarget: function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\troot: function( elem ) {\n\t\t\treturn elem === documentElement;\n\t\t},\n\n\t\tfocus: function( elem ) {\n\t\t\treturn elem === safeActiveElement() &&\n\t\t\t\tdocument.hasFocus() &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\tenabled: createDisabledPseudo( false ),\n\t\tdisabled: createDisabledPseudo( true ),\n\n\t\tchecked: function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\treturn ( nodeName( elem, \"input\" ) && !!elem.checked ) ||\n\t\t\t\t( nodeName( elem, \"option\" ) && !!elem.selected );\n\t\t},\n\n\t\tselected: function( elem ) {\n\n\t\t\t// Support: IE <=11+\n\t\t\t// Accessing the selectedIndex property\n\t\t\t// forces the browser to treat the default option as\n\t\t\t// selected when in an optgroup.\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\tempty: function( elem ) {\n\n\t\t\t// https://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\tparent: function( elem ) {\n\t\t\treturn !Expr.pseudos.empty( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\theader: function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\tinput: function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\tbutton: function( elem ) {\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"button\" ||\n\t\t\t\tnodeName( elem, \"button\" );\n\t\t},\n\n\t\ttext: function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"text\" &&\n\n\t\t\t\t// Support: IE <10 only\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear\n\t\t\t\t// with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\tfirst: createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\tlast: createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\teq: createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\teven: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\todd: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tlt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i;\n\n\t\t\tif ( argument < 0 ) {\n\t\t\t\ti = argument + length;\n\t\t\t} else if ( argument > length ) {\n\t\t\t\ti = length;\n\t\t\t} else {\n\t\t\t\ti = argument;\n\t\t\t}\n\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tgt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos.nth = Expr.pseudos.eq;\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rleadingCombinator.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrimCSS, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\tif ( parseOnly ) {\n\t\treturn soFar.length;\n\t}\n\n\treturn soFar ?\n\t\tfind.error( selector ) :\n\n\t\t// Cache the tokens\n\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\tif ( skip && nodeName( elem, skip ) ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = outerCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tfind( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem, matcherOut,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed ||\n\t\t\t\tmultipleContexts( selector || \"*\",\n\t\t\t\t\tcontext.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems;\n\n\t\tif ( matcher ) {\n\n\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter\n\t\t\t// or preexisting results,\n\t\t\tmatcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t[] :\n\n\t\t\t\t// ...otherwise use results directly\n\t\t\t\tresults;\n\n\t\t\t// Find primary matches\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t} else {\n\t\t\tmatcherOut = matcherIn;\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tvar ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element\n\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 )\n\t\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrimCSS, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find.TAG( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: iOS <=7 - 9 only\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: ) matching\n\t\t\t// elements by id. (see trac-14142)\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tjQuery.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\nfunction compile( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n}\n\n/**\n * A low-level selection function that works with jQuery's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with jQuery selector compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find.ID(\n\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\tcontext\n\t\t\t) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) &&\n\t\t\t\t\t\ttestContext( context.parentNode ) || context\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Support: Android <=4.0 - 4.1+\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Android <=4.0 - 4.1+\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\njQuery.find = find;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.unique = jQuery.uniqueSort;\n\n// These have always been private, but they used to be documented as part of\n// Sizzle so let's maintain them for now for backwards compatibility purposes.\nfind.compile = compile;\nfind.select = select;\nfind.setDocument = setDocument;\nfind.tokenize = tokenize;\n\nfind.escape = jQuery.escapeSelector;\nfind.getText = jQuery.text;\nfind.isXML = jQuery.isXMLDoc;\nfind.selectors = jQuery.expr;\nfind.support = jQuery.support;\nfind.uniqueSort = jQuery.uniqueSort;\n\n\t/* eslint-enable */\n\n} )();\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over to avoid XSS via location.hash (trac-9521)\n\t// Strict HTML recognition (trac-11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to jQuery#find\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.error );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the error, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getErrorHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getErrorHook();\n\n\t\t\t\t\t\t\t\t// The deprecated alias of the above. While the name suggests\n\t\t\t\t\t\t\t\t// returning the stack, not an error instance, jQuery just passes\n\t\t\t\t\t\t\t\t// it directly to `console.warn` so both will work; an instance\n\t\t\t\t\t\t\t\t// just better cooperates with source maps.\n\t\t\t\t\t\t\t\t} else if ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\n// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error\n// captured before the async barrier to get the original error cause\n// which may otherwise be hidden.\njQuery.Deferred.exceptionHook = function( error, asyncError ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message,\n\t\t\terror.stack, asyncError );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See trac-6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (trac-9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see trac-8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (trac-14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (trac-11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (trac-14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces \";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (trac-13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting or other required elements.\n\tthead: [ 1, \"\", \"
\" ],\n\tcol: [ 2, \"\", \"
\" ],\n\ttr: [ 2, \"\", \"
\" ],\n\ttd: [ 3, \"\", \"
\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (trac-12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (trac-13208)\n\t\t\t\t// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (trac-13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", true );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, isSetup ) {\n\n\t// Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !isSetup ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\tif ( !saved ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tdataPriv.set( this, type, false );\n\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering\n\t\t\t\t// the native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, jQuery.event.trigger(\n\t\t\t\t\tsaved[ 0 ],\n\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\tthis\n\t\t\t\t) );\n\n\t\t\t\t// Abort handling of the native event by all jQuery handlers while allowing\n\t\t\t\t// native handlers on the same element to run. On target, this is achieved\n\t\t\t\t// by stopping immediate propagation just on the jQuery event. However,\n\t\t\t\t// the native event is re-wrapped by a jQuery one on each level of the\n\t\t\t\t// propagation so the only way to stop it for jQuery is to stop it for\n\t\t\t\t// everyone via native `stopPropagation()`. This is not a problem for\n\t\t\t\t// focus/blur which don't bubble, but it does also stop click on checkboxes\n\t\t\t\t// and radios. We accept this limitation.\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.isImmediatePropagationStopped = returnTrue;\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (trac-504, trac-13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\n\tfunction focusMappedHandler( nativeEvent ) {\n\t\tif ( document.documentMode ) {\n\n\t\t\t// Support: IE 11+\n\t\t\t// Attach a single focusin/focusout handler on the document while someone wants\n\t\t\t// focus/blur. This is because the former are synchronous in IE while the latter\n\t\t\t// are async. In other browsers, all those handlers are invoked synchronously.\n\n\t\t\t// `handle` from private data would already wrap the event, but we need\n\t\t\t// to change the `type` here.\n\t\t\tvar handle = dataPriv.get( this, \"handle\" ),\n\t\t\t\tevent = jQuery.event.fix( nativeEvent );\n\t\t\tevent.type = nativeEvent.type === \"focusin\" ? \"focus\" : \"blur\";\n\t\t\tevent.isSimulated = true;\n\n\t\t\t// First, handle focusin/focusout\n\t\t\thandle( nativeEvent );\n\n\t\t\t// ...then, handle focus/blur\n\t\t\t//\n\t\t\t// focus/blur don't bubble while focusin/focusout do; simulate the former by only\n\t\t\t// invoking the handler at the lower level.\n\t\t\tif ( event.target === event.currentTarget ) {\n\n\t\t\t\t// The setup part calls `leverageNative`, which, in turn, calls\n\t\t\t\t// `jQuery.event.add`, so event handle will already have been set\n\t\t\t\t// by this point.\n\t\t\t\thandle( event );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// For non-IE browsers, attach a single capturing handler on the document\n\t\t\t// while someone wants focusin/focusout.\n\t\t\tjQuery.event.simulate( delegateType, nativeEvent.target,\n\t\t\t\tjQuery.event.fix( nativeEvent ) );\n\t\t}\n\t}\n\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\tvar attaches;\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, true );\n\n\t\t\tif ( document.documentMode ) {\n\n\t\t\t\t// Support: IE 9 - 11+\n\t\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\t\tattaches = dataPriv.get( this, delegateType );\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t}\n\t\t\t\tdataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );\n\t\t\t} else {\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tvar attaches;\n\n\t\t\tif ( document.documentMode ) {\n\t\t\t\tattaches = dataPriv.get( this, delegateType ) - 1;\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t\tdataPriv.remove( this, delegateType );\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.set( this, delegateType, attaches );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Return false to indicate standard teardown should be applied\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t// Suppress native focus or blur if we're currently inside\n\t\t// a leveraged native-event stack\n\t\t_default: function( event ) {\n\t\t\treturn dataPriv.get( event.target, type );\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n\n\t// Support: Firefox <=44\n\t// Firefox doesn't have focus(in | out) events\n\t// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n\t//\n\t// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n\t// focus(in | out) events fire after focus & blur events,\n\t// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n\t// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\n\t//\n\t// Support: IE 9 - 11+\n\t// To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,\n\t// attach a single handler for both events in IE.\n\tjQuery.event.special[ delegateType ] = {\n\t\tsetup: function() {\n\n\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType );\n\n\t\t\t// Support: IE 9 - 11+\n\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.addEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t\tdataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );\n\t\t},\n\t\tteardown: function() {\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType ) - 1;\n\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.removeEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( dataHolder, delegateType );\n\t\t\t} else {\n\t\t\t\tdataPriv.set( dataHolder, delegateType, attaches );\n\t\t\t}\n\t\t}\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (trac-8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Re-enable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Unwrap a CDATA section containing script contents. This shouldn't be\n\t\t\t\t\t\t\t// needed as in XML documents they're already not visible when\n\t\t\t\t\t\t\t// inspecting element contents and in HTML documents they have no\n\t\t\t\t\t\t\t// meaning but we're preserving that logic for backwards compatibility.\n\t\t\t\t\t\t\t// This will be removed completely in 4.0. See gh-4904.\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew jQuery#find here for performance reasons:\n\t\t\t// https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar rcustomProp = /^--/;\n\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (trac-8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"box-sizing:content-box;border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is `display: block`\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tisCustomProp = rcustomProp.test( name ),\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, trac-12537)\n\t// .css('--customProperty) (gh-3144)\n\tif ( computed ) {\n\n\t\t// Support: IE <=9 - 11+\n\t\t// IE only supports `\"float\"` in `getPropertyValue`; in computed styles\n\t\t// it's only available as `\"cssFloat\"`. We no longer modify properties\n\t\t// sent to `.css()` apart from camelCasing, so we need to check both.\n\t\t// Normally, this would create difference in behavior: if\n\t\t// `getPropertyValue` returns an empty string, the value returned\n\t\t// by `.css()` would be `undefined`. This is usually the case for\n\t\t// disconnected elements. However, in IE even disconnected elements\n\t\t// with no styles return `\"none\"` for `getPropertyValue( \"float\" )`\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( isCustomProp && ret ) {\n\n\t\t\t// Support: Firefox 105+, Chrome <=105+\n\t\t\t// Spec requires trimming whitespace for custom properties (gh-4926).\n\t\t\t// Firefox only trims leading whitespace. Chrome just collapses\n\t\t\t// both leading & trailing whitespace to a single space.\n\t\t\t//\n\t\t\t// Fall back to `undefined` if empty string returned.\n\t\t\t// This collapses a missing definition with property defined\n\t\t\t// and set to an empty string but there's no standard API\n\t\t\t// allowing us to differentiate them without a performance penalty\n\t\t\t// and returning `undefined` aligns with older jQuery.\n\t\t\t//\n\t\t\t// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n\t\t\t// as whitespace while CSS does not, but this is not a problem\n\t\t\t// because CSS preprocessing replaces them with U+000A LINE FEED\n\t\t\t// (which *is* CSS whitespace)\n\t\t\t// https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n\t\t\tret = ret.replace( rtrimCSS, \"$1\" ) || undefined;\n\t\t}\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0,\n\t\tmarginDelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\t// Count margin delta separately to only add it after scroll gutter adjustment.\n\t\t// This is needed to make negative margins work with `outerHeight( true )` (gh-3982).\n\t\tif ( box === \"margin\" ) {\n\t\t\tmarginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta + marginDelta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\tanimationIterationCount: true,\n\t\taspectRatio: true,\n\t\tborderImageSlice: true,\n\t\tcolumnCount: true,\n\t\tflexGrow: true,\n\t\tflexShrink: true,\n\t\tfontWeight: true,\n\t\tgridArea: true,\n\t\tgridColumn: true,\n\t\tgridColumnEnd: true,\n\t\tgridColumnStart: true,\n\t\tgridRow: true,\n\t\tgridRowEnd: true,\n\t\tgridRowStart: true,\n\t\tlineHeight: true,\n\t\topacity: true,\n\t\torder: true,\n\t\torphans: true,\n\t\tscale: true,\n\t\twidows: true,\n\t\tzIndex: true,\n\t\tzoom: true,\n\n\t\t// SVG-related\n\t\tfillOpacity: true,\n\t\tfloodOpacity: true,\n\t\tstopOpacity: true,\n\t\tstrokeMiterlimit: true,\n\t\tstrokeOpacity: true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (trac-7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug trac-9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (trac-7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// Use proper attribute retrieval (trac-12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + className + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += className + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + className + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + className + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar classNames, className, i, self,\n\t\t\ttype = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\treturn this.each( function() {\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\tself = jQuery( this );\n\n\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (trac-14686, trac-14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (trac-2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (trac-9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (trac-6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// trac-7653, trac-8125, trac-8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes trac-9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (trac-10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket trac-12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// trac-9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (trac-11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// trac-1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see trac-8605, trac-14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// trac-14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"',\n '',\n '',\n '',\n '',\n '',\n ].join('\\n');\n var views = [];\n var cells = Jupyter.notebook.get_cells();\n Jupyter.notebook.get_cells().forEach(function (cell) {\n if (cell.output_area) {\n cell.output_area.outputs.forEach(function (output) {\n if (\n output.data &&\n output.data[VIEW_MIME_TYPE] &&\n state.state[output.data[VIEW_MIME_TYPE].model_id]\n ) {\n views.push(\n '\\n'\n );\n }\n });\n }\n });\n value += views.join('\\n');\n value += '\\n\\n\\n\\n';\n var content = document.createElement('textarea');\n content.setAttribute('readonly', 'true');\n content.style.width = '100%';\n content.style.minHeight = '250px';\n content.value = value;\n\n var mod = dialog.modal({\n show: true,\n title: 'Embed widgets',\n body: content,\n keyboard_manager: Jupyter.notebook.keyboard_manager,\n notebook: Jupyter.notebook,\n buttons: {\n 'Copy to Clipboard': {\n class: 'btn-primary',\n click: function (event) {\n content.select();\n return document.execCommand('copy');\n },\n },\n },\n });\n });\n }\n );\n });\n};\n\nvar action = {\n help: 'Embed interactive widgets',\n icon: 'fa-sliders',\n help_index: 'zz',\n handler: embed_widgets,\n};\n\nvar action_name = 'embed-interactive-widgets';\nvar prefix = 'widgets';\nrequirejs(['base/js/namespace'], function (Jupyter) {\n Jupyter.notebook.keyboard_manager.actions.register(\n action,\n action_name,\n prefix\n );\n});\n\nmodule.exports = {\n action: action,\n};\n","// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n'use strict';\n\nwindow['requirejs'].config({\n map: {\n '*': {\n '@jupyter-widgets/controls': 'nbextensions/jupyter-js-widgets/extension',\n '@jupyter-widgets/base': 'nbextensions/jupyter-js-widgets/extension',\n '@jupyter-widgets/output': 'nbextensions/jupyter-js-widgets/extension',\n },\n },\n});\n\nvar MIME_TYPE = 'application/vnd.jupyter.widget-view+json';\nvar CLASS_NAME = 'jupyter-widgets-view';\n\nvar mngr = require('./manager');\nrequire('./save_state');\nrequire('./embed_widgets');\nvar LuminoWidget = require('@lumino/widgets');\nvar LuminoMessaging = require('@lumino/messaging');\n\nvar NOTEBOOK_VERSION_INFO = Jupyter.version.split('.');\nvar NOTEBOOK_MAJOR = parseInt(NOTEBOOK_VERSION_INFO[0]);\nvar NOTEBOOK_MINOR = parseInt(NOTEBOOK_VERSION_INFO[1]);\nvar NOTEBOOK_PATCH = parseInt(NOTEBOOK_VERSION_INFO[2]);\n\nvar RENDER_SHOULD_THROW =\n NOTEBOOK_MAJOR > 6 ||\n (NOTEBOOK_MAJOR == 6 && NOTEBOOK_MINOR > 4) ||\n (NOTEBOOK_MAJOR == 6 && NOTEBOOK_MINOR == 4 && NOTEBOOK_PATCH > 4);\n\n/**\n * Create a widget manager for a kernel instance.\n */\nvar handle_kernel = function (Jupyter, kernel) {\n if (kernel.comm_manager && kernel.widget_manager === undefined) {\n // Clear any old widget manager\n if (Jupyter.WidgetManager) {\n Jupyter.WidgetManager._managers[0].clear_state();\n }\n\n // Create a new widget manager instance. Use the global\n // Jupyter.notebook handle.\n var manager = new mngr.WidgetManager(kernel.comm_manager, Jupyter.notebook);\n\n // For backwards compatibility and interactive use.\n Jupyter.WidgetManager = mngr.WidgetManager;\n\n // Store a handle to the manager so we know not to\n // another for this kernel. This also is a convenience\n // for the user.\n kernel.widget_manager = manager;\n }\n};\n\nfunction register_events(Jupyter, events, outputarea) {\n // If a kernel already exists, create a widget manager.\n if (Jupyter.notebook && Jupyter.notebook.kernel) {\n handle_kernel(Jupyter, Jupyter.notebook.kernel);\n }\n // When the kernel is created, create a widget manager.\n events.on(\n 'kernel_created.Kernel kernel_created.Session',\n function (event, data) {\n handle_kernel(Jupyter, data.kernel);\n }\n );\n\n // When a kernel dies, disconnect the widgets.\n events.on(\n 'kernel_killed.Session kernel_killed.Kernel kernel_restarting.Kernel',\n function (event, data) {\n var kernel = data.kernel;\n if (kernel && kernel.widget_manager) {\n kernel.widget_manager.disconnect();\n }\n }\n );\n\n /**\n * The views on this page. We keep this list so that we can call the view.remove()\n * method when a view is removed from the page.\n */\n var views = {};\n\n window.addEventListener('resize', () => {\n Object.keys(views).forEach((viewKey) => {\n LuminoMessaging.MessageLoop.postMessage(\n views[viewKey].luminoWidget,\n LuminoWidget.Widget.ResizeMessage.UnknownSize\n );\n });\n });\n\n var removeView = function (event, data) {\n var output = data.cell ? data.cell.output_area : data.output_area;\n var viewids = output ? output._jupyterWidgetViews : void 0;\n if (viewids) {\n viewids.forEach(function (id) {\n // this may be called after the widget is pulled off the page\n // so we temporarily put it back on the page as a kludge\n // so that Lumino can trigger the appropriate detach signals\n var view = views[id];\n view.el.style.display = 'none';\n document.body.appendChild(view.el);\n view.remove();\n delete views[id];\n });\n output._jupyterWidgetViews = [];\n }\n };\n\n // Deleting a cell does *not* clear the outputs first.\n events.on('delete.Cell', removeView);\n // add an event to the notebook element for *any* outputs that are cleared.\n Jupyter.notebook.container.on('clearing', '.output', removeView);\n\n // For before https://github.com/jupyter/notebook/pull/2411 is merged and\n // released. This does not handle the case where an empty cell is executed\n // to clear input.\n events.on('execute.CodeCell', removeView);\n events.on('clear_output.CodeCell', removeView);\n\n /**\n * Render data to the output area.\n */\n function render(output, data, node) {\n // data is a model id\n var manager =\n Jupyter.notebook &&\n Jupyter.notebook.kernel &&\n Jupyter.notebook.kernel.widget_manager;\n if (!manager) {\n var msg = 'Error rendering Jupyter widget: missing widget manager';\n if (RENDER_SHOULD_THROW) {\n throw new Error(msg);\n }\n node.textContent = msg;\n return;\n }\n\n // Missing model id means the view was removed. Hide this element.\n if (data.model_id === '') {\n if (RENDER_SHOULD_THROW) {\n throw new Error('Jupyter Widgets model not found');\n }\n node.style.display = 'none';\n return;\n }\n\n if (manager.has_model(data.model_id)) {\n manager\n .get_model(data.model_id)\n .then(function (model) {\n return manager.create_view(model, { output: output });\n })\n .then(function (view) {\n var id = view.cid;\n output._jupyterWidgetViews = output._jupyterWidgetViews || [];\n output._jupyterWidgetViews.push(id);\n views[id] = view;\n LuminoWidget.Widget.attach(view.luminoWidget, node);\n\n // Make the node completely disappear if the view is removed.\n view.once('remove', () => {\n // Since we have a mutable reference to the data, delete the\n // model id to indicate the view is removed.\n data.model_id = '';\n node.style.display = 'none';\n });\n });\n } else {\n var msg =\n 'A Jupyter widget could not be displayed because the widget state could not be found. This could happen if the kernel storing the widget is no longer available, or if the widget state was not saved in the notebook. You may be able to create the widget by running the appropriate cells.';\n if (RENDER_SHOULD_THROW) {\n throw new Error(msg);\n }\n node.textContent = msg;\n return;\n }\n }\n\n // `this` is the output area we are appending to\n var append_mime = function (json, md, element) {\n var toinsert = this.create_output_subarea(md, CLASS_NAME, MIME_TYPE);\n this.keyboard_manager.register_events(toinsert);\n render(this, json, toinsert[0]);\n element.append(toinsert);\n return toinsert;\n };\n\n // Register mime type with the output area\n outputarea.OutputArea.prototype.register_mime_type(MIME_TYPE, append_mime, {\n // An output widget could contain arbitrary user javascript\n safe: false,\n // Index of renderer in `output_area.display_order`\n index: 0,\n });\n}\n\nfunction load_ipython_extension() {\n return new Promise(function (resolve) {\n requirejs(\n ['base/js/namespace', 'base/js/events', 'notebook/js/outputarea'],\n function (Jupyter, events, outputarea) {\n require('@lumino/widgets/style/index.css');\n require('@jupyter-widgets/base/css/index.css');\n require('@jupyter-widgets/controls/css/widgets.css');\n register_events(Jupyter, events, outputarea);\n resolve();\n }\n );\n });\n}\n\nmodule.exports = {\n load_ipython_extension: load_ipython_extension,\n ...require('@jupyter-widgets/controls'),\n ...require('@jupyter-widgets/base'),\n ...require('./widget_output'),\n};\n","// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n'use strict';\n\nvar base = require('@jupyter-widgets/base');\nvar ManagerBase = require('@jupyter-widgets/base-manager').ManagerBase;\nvar widgets = require('@jupyter-widgets/controls');\nvar outputWidgets = require('./widget_output');\nvar saveState = require('./save_state');\nvar embedWidgets = require('./embed_widgets');\n\nvar MIME_TYPE = 'application/vnd.jupyter.widget-view+json';\n\nfunction polyfill_new_comm_buffers(\n manager,\n target_name,\n data,\n callbacks,\n metadata,\n comm_id,\n buffers\n) {\n /**\n * This polyfills services/kernel/comm/CommManager.new_comm to\n * accept the buffers argument.\n *\n * argument comm_id is optional\n */\n return new Promise(function (resolve) {\n requirejs(['services/kernels/comm'], function (comm) {\n var comm = new comm.Comm(target_name, comm_id);\n manager.register_comm(comm);\n // inline Comm.open(), but with buffers\n var content = {\n comm_id: comm_id,\n target_name: target_name,\n data: data || {},\n };\n comm.kernel.send_shell_message(\n 'comm_open',\n content,\n callbacks,\n metadata,\n buffers\n );\n resolve(comm);\n });\n });\n}\n\nfunction new_comm(\n manager,\n target_name,\n data,\n callbacks,\n metadata,\n comm_id,\n buffers\n) {\n // Checks whether new_comm needs a polyfill, and calls the correct version\n // Polyfill needed for notebook <5.1, in which the new_comm method does not support a buffers argument.\n // See https://github.com/jupyter-widgets/ipywidgets/pull/1817\n var need_polyfill = manager.new_comm.length < 6;\n if (need_polyfill) {\n return polyfill_new_comm_buffers.apply(null, arguments);\n }\n return manager.new_comm.apply(\n manager,\n Array.prototype.slice.call(arguments, 1)\n );\n}\n\n//--------------------------------------------------------------------\n// WidgetManager class\n//--------------------------------------------------------------------\n\nexport class WidgetManager extends ManagerBase {\n constructor(comm_manager, notebook) {\n super();\n // Managers are stored in *reverse* order, so that _managers[0] is the most recent.\n WidgetManager._managers.unshift(this);\n\n // Attach a comm manager\n this.notebook = notebook;\n this.keyboard_manager = notebook.keyboard_manager;\n this.comm_manager = comm_manager;\n\n var widget_md = notebook.metadata.widgets;\n\n // Steps that needs to be done:\n // 1. Register comm target\n // 2. Get any widget state from the kernel and open comms with existing state\n // 3. Check saved state for widgets, and restore any that would not overwrite\n // any live widgets.\n\n // Register with the comm manager. (1)\n this.comm_manager.register_target(\n this.comm_target_name,\n this.handle_comm_open.bind(this)\n );\n\n var that = this;\n\n this._loadFromKernel()\n .then(function () {\n // Now that we have mirrored any widgets from the kernel...\n // Restore any widgets from saved state that are not live (3)\n if (\n widget_md &&\n widget_md['application/vnd.jupyter.widget-state+json']\n ) {\n var state =\n notebook.metadata.widgets[\n 'application/vnd.jupyter.widget-state+json'\n ];\n state = that.filterExistingModelState(state);\n return that.set_state(state);\n }\n })\n .then(function () {\n // Rerender cells that have widget data\n that.notebook.get_cells().forEach(function (cell) {\n var rerender =\n cell.output_area &&\n cell.output_area.outputs.find(function (output) {\n return output.data && output.data[MIME_TYPE];\n });\n if (rerender) {\n that.notebook.render_cell_output(cell);\n }\n });\n });\n\n // Create the actions and menu\n this._init_actions();\n this._init_menu();\n }\n\n loadClass(className, moduleName, moduleVersion) {\n const failure = () => {\n throw new Error(\n 'Class ' + className + ' not found in module ' + moduleName\n );\n };\n if (moduleName === '@jupyter-widgets/controls') {\n return widgets[className]\n ? Promise.resolve(widgets[className])\n : failure();\n } else if (moduleName === '@jupyter-widgets/base') {\n return base[className] ? Promise.resolve(base[className]) : failure();\n } else if (moduleName == '@jupyter-widgets/output') {\n return outputWidgets[className]\n ? Promise.resolve(outputWidgets[className])\n : failure();\n } else {\n return new Promise(function (resolve, reject) {\n window.require([moduleName], resolve, reject);\n }).then(function (mod) {\n if (mod[className]) {\n return mod[className];\n } else {\n return failure();\n }\n });\n }\n }\n\n /**\n * Registers manager level actions with the notebook actions list\n */\n _init_actions() {\n var notifier = Jupyter.notification_area.widget('widgets');\n this.saveWidgetsAction = {\n handler: function () {\n this.get_state({\n drop_defaults: true,\n }).then(function (state) {\n Jupyter.notebook.metadata.widgets = {\n 'application/vnd.jupyter.widget-state+json': state,\n };\n Jupyter.menubar.actions\n .get('jupyter-notebook:save-notebook')\n .handler({\n notebook: Jupyter.notebook,\n });\n });\n }.bind(this),\n icon: 'fa-truck',\n help: 'Save the notebook with the widget state information for static rendering',\n };\n Jupyter.menubar.actions.register(\n this.saveWidgetsAction,\n 'save-with-widgets',\n 'widgets'\n );\n\n this.clearWidgetsAction = {\n handler: function () {\n delete Jupyter.notebook.metadata.widgets;\n Jupyter.menubar.actions.get('jupyter-notebook:save-notebook').handler({\n notebook: Jupyter.notebook,\n });\n },\n help: 'Clear the widget state information from the notebook',\n };\n Jupyter.menubar.actions.register(\n this.saveWidgetsAction,\n 'save-clear-widgets',\n 'widgets'\n );\n }\n\n /**\n * Initialize the widget menu\n */\n _init_menu() {\n // Add a widgets menubar item, before help.\n var widgetsMenu = document.createElement('li');\n widgetsMenu.classList.add('dropdown');\n var helpMenu = document.querySelector('#help_menu').parentElement;\n helpMenu.parentElement.insertBefore(widgetsMenu, helpMenu);\n\n var widgetsMenuLink = document.createElement('a');\n widgetsMenuLink.setAttribute('href', '#');\n widgetsMenuLink.setAttribute('data-toggle', 'dropdown');\n widgetsMenuLink.classList.add('dropdown-toggle');\n widgetsMenuLink.innerText = 'Widgets';\n widgetsMenu.appendChild(widgetsMenuLink);\n\n var widgetsSubmenu = document.createElement('ul');\n widgetsSubmenu.setAttribute('id', 'widget-submenu');\n widgetsSubmenu.classList.add('dropdown-menu');\n widgetsMenu.appendChild(widgetsSubmenu);\n\n var divider = document.createElement('ul');\n divider.classList.add('divider');\n\n widgetsSubmenu.appendChild(\n this._createMenuItem('Save Notebook Widget State', this.saveWidgetsAction)\n );\n widgetsSubmenu.appendChild(\n this._createMenuItem(\n 'Clear Notebook Widget State',\n this.clearWidgetsAction\n )\n );\n widgetsSubmenu.appendChild(divider);\n widgetsSubmenu.appendChild(\n this._createMenuItem('Download Widget State', saveState.action)\n );\n widgetsSubmenu.appendChild(\n this._createMenuItem('Embed Widgets', embedWidgets.action)\n );\n }\n\n /**\n * Creates a menu item for an action.\n * @param {string} title - display string for the menu item\n * @param {Action} action\n * @return {HTMLElement} menu item\n */\n _createMenuItem(title, action) {\n var item = document.createElement('li');\n item.setAttribute('title', action.help);\n\n var itemLink = document.createElement('a');\n itemLink.setAttribute('href', '#');\n itemLink.innerText = title;\n item.appendChild(itemLink);\n\n item.onclick = action.handler;\n return item;\n }\n\n _create_comm(comm_target_name, comm_id, data, metadata, buffers) {\n var that = this;\n return this._get_connected_kernel().then(function (kernel) {\n if (data || metadata) {\n return new_comm(\n kernel.comm_manager,\n comm_target_name,\n data,\n that.callbacks(),\n metadata,\n comm_id,\n buffers\n );\n } else {\n // Construct a comm that already is open on the kernel side. We\n // don't want to send an open message, which would supersede the\n // kernel comm object, so we instead do by hand the necessary parts\n // of the new_comm call above.\n return new Promise(function (resolve) {\n requirejs(['services/kernels/comm'], function (comm) {\n var new_comm = new comm.Comm(comm_target_name, comm_id);\n kernel.comm_manager.register_comm(new_comm);\n resolve(new_comm);\n });\n });\n }\n });\n }\n\n _get_comm_info() {\n /**\n * Gets a promise for the valid widget models.\n */\n var that = this;\n return this._get_connected_kernel().then(function (kernel) {\n return new Promise(function (resolve, reject) {\n kernel.comm_info('jupyter.widget', function (msg) {\n resolve(msg['content']['comms']);\n });\n });\n });\n }\n\n _get_connected_kernel() {\n /**\n * Gets a promise for a connected kernel\n */\n var that = this;\n return new Promise(function (resolve, reject) {\n if (\n that.comm_manager &&\n that.comm_manager.kernel &&\n that.comm_manager.kernel.is_connected()\n ) {\n resolve(that.comm_manager.kernel);\n } else {\n that.notebook.events.on(\n 'kernel_connected.Kernel',\n function (event, data) {\n resolve(data.kernel);\n }\n );\n }\n });\n }\n\n setViewOptions(options) {\n var options = options || {};\n if (!options.output && options.parent) {\n // use the parent output if we don't have one\n options.output = options.parent.options.output;\n }\n if (options.output) {\n options.iopub_callbacks = {\n output: options.output.handle_output.bind(options.output),\n clear_output: options.output.handle_clear_output.bind(options.output),\n };\n }\n return options;\n }\n\n /**\n * Callback handlers for a specific view\n */\n callbacks(view) {\n var callbacks = ManagerBase.prototype.callbacks.call(this, view);\n if (view && view.options.iopub_callbacks) {\n callbacks.iopub = view.options.iopub_callbacks;\n }\n return callbacks;\n }\n}\n\n/**\n * List of widget managers in *reverse* order\n * (_managers[0] is the most recent)\n */\nWidgetManager._managers = [];\n","// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n\n'use strict';\n\nvar save_state = function () {\n return new Promise(function (resolve, reject) {\n requirejs(['base/js/namespace'], function (Jupyter) {\n var wm = Jupyter.WidgetManager._managers[0];\n if (!wm) {\n reject('No widget manager');\n }\n return wm\n .get_state({\n drop_defaults: true,\n })\n .then(function (state) {\n var data =\n 'text/json;charset=utf-8,' +\n encodeURIComponent(JSON.stringify(state, null, ' '));\n var a = document.createElement('a');\n a.download = 'widget_state.json';\n a.href = 'data:' + data;\n a.click();\n resolve();\n });\n });\n });\n};\n\nvar action = {\n help: 'Download the widget state as a JSON file',\n icon: 'fa-sliders',\n help_index: 'zz',\n handler: save_state,\n};\n\nvar action_name = 'save-widget-state';\nvar prefix = 'widgets';\nrequirejs(['base/js/namespace'], function (Jupyter) {\n Jupyter.notebook.keyboard_manager.actions.register(\n action,\n action_name,\n prefix\n );\n});\n\nmodule.exports = { action: action };\n","// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n'use strict';\n\n// This widget is strongly coupled to the notebook because of the outputarea\n// dependency.\nvar outputBase = require('@jupyter-widgets/output');\nrequire('./widget_output.css');\n\nvar outputArea = new Promise(function (resolve, reject) {\n requirejs(['notebook/js/outputarea'], resolve, reject);\n});\n\nexport class OutputModel extends outputBase.OutputModel {\n defaults() {\n return {\n ...super.defaults(),\n msg_id: '',\n outputs: [],\n };\n }\n\n initialize(attributes, options) {\n super.initialize(attributes, options);\n this.listenTo(this, 'change:msg_id', this.reset_msg_id);\n\n if (this.comm && this.comm.kernel) {\n this.kernel = this.comm.kernel;\n this.kernel.set_callbacks_for_msg(this.model_id, this.callbacks(), false);\n }\n\n var that = this;\n // Create an output area to handle the data model part\n outputArea.then(function (outputArea) {\n that.output_area = new outputArea.OutputArea({\n selector: document.createElement('div'),\n config: { data: { OutputArea: {} } },\n prompt_area: false,\n events: that.widget_manager.notebook.events,\n keyboard_manager: that.widget_manager.keyboard_manager,\n });\n that.listenTo(\n that,\n 'new_message',\n function (msg) {\n that.output_area.handle_output(msg);\n that.set('outputs', that.output_area.toJSON(), { newMessage: true });\n that.save_changes();\n },\n that\n );\n that.listenTo(that, 'clear_output', function (msg) {\n that.output_area.handle_clear_output(msg);\n that.set('outputs', that.output_area.toJSON(), { newMessage: true });\n that.save_changes();\n });\n that.listenTo(that, 'change:outputs', that.setOutputs);\n that.setOutputs();\n });\n }\n\n // make callbacks\n callbacks() {\n // Merge our callbacks with the base class callbacks.\n var cb = super.callbacks();\n var iopub = cb.iopub || {};\n var iopubCallbacks = {\n ...iopub,\n output: function (msg) {\n this.trigger('new_message', msg);\n if (iopub.output) {\n iopub.output.apply(this, arguments);\n }\n }.bind(this),\n clear_output: function (msg) {\n this.trigger('clear_output', msg);\n if (iopub.clear_output) {\n iopub.clear_output.apply(this, arguments);\n }\n }.bind(this),\n };\n return { ...cb, iopub: iopubCallbacks };\n }\n\n reset_msg_id() {\n var kernel = this.kernel;\n // Pop previous message id\n var prev_msg_id = this.previous('msg_id');\n if (prev_msg_id && kernel) {\n var previous_callback = kernel.output_callback_overrides_pop(prev_msg_id);\n if (previous_callback !== this.model_id) {\n console.error(\n 'Popped wrong message (' +\n previous_callback +\n ' instead of ' +\n this.model_id +\n ') - likely the stack was not maintained in kernel.'\n );\n }\n }\n var msg_id = this.get('msg_id');\n if (msg_id && kernel) {\n kernel.output_callback_overrides_push(msg_id, this.model_id);\n }\n }\n\n setOutputs(model, value, options) {\n if (!(options && options.newMessage)) {\n // fromJSON does not clear the existing output\n this.output_area.clear_output();\n // fromJSON does not copy the message, so we make a deep copy\n this.output_area.fromJSON(\n JSON.parse(JSON.stringify(this.get('outputs')))\n );\n }\n }\n}\n\nexport class OutputView extends outputBase.OutputView {\n render() {\n var that = this;\n this.el.classList.add('jupyter-widgets-output-area');\n outputArea.then(function (outputArea) {\n that.output_area = new outputArea.OutputArea({\n selector: that.el,\n // use default values for the output area config\n config: { data: { OutputArea: {} } },\n prompt_area: false,\n events: that.model.widget_manager.notebook.events,\n keyboard_manager: that.model.widget_manager.keyboard_manager,\n });\n that.listenTo(\n that.model,\n 'new_message',\n function (msg) {\n that.output_area.handle_output(msg);\n },\n that\n );\n that.listenTo(that.model, 'clear_output', function (msg) {\n that.output_area.handle_clear_output(msg);\n // fake the event on the output area element. This can be\n // deleted when we can rely on\n // https://github.com/jupyter/notebook/pull/2411 being\n // available.\n that.output_area.element.trigger('clearing', { output_area: this });\n });\n // Render initial contents from the current model\n that.listenTo(that.model, 'change:outputs', that.setOutputs);\n that.setOutputs();\n });\n super.render();\n }\n\n setOutputs(model, value, options) {\n if (!(options && options.newMessage)) {\n // fromJSON does not clear the existing output\n this.output_area.clear_output();\n // fromJSON does not copy the message, so we make a deep copy\n this.output_area.fromJSON(\n JSON.parse(JSON.stringify(this.model.get('outputs')))\n );\n }\n }\n}\n","module.exports = __WEBPACK_EXTERNAL_MODULE__1308__;","let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\nlet customAlphabet = (alphabet, defaultSize = 21) => {\n return (size = defaultSize) => {\n let id = ''\n let i = size\n while (i--) {\n id += alphabet[(Math.random() * alphabet.length) | 0]\n }\n return id\n }\n}\nlet nanoid = (size = 21) => {\n let id = ''\n let i = size\n while (i--) {\n id += urlAlphabet[(Math.random() * 64) | 0]\n }\n return id\n}\nmodule.exports = { nanoid, customAlphabet }\n","// Current version.\nexport var VERSION = '1.13.7';\n\n// Establish the root object, `window` (`self`) in the browser, `global`\n// on the server, or `this` in some virtual machines. We use `self`\n// instead of `window` for `WebWorker` support.\nexport var root = (typeof self == 'object' && self.self === self && self) ||\n (typeof global == 'object' && global.global === global && global) ||\n Function('return this')() ||\n {};\n\n// Save bytes in the minified (but not gzipped) version:\nexport var ArrayProto = Array.prototype, ObjProto = Object.prototype;\nexport var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;\n\n// Create quick reference variables for speed access to core prototypes.\nexport var push = ArrayProto.push,\n slice = ArrayProto.slice,\n toString = ObjProto.toString,\n hasOwnProperty = ObjProto.hasOwnProperty;\n\n// Modern feature detection.\nexport var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',\n supportsDataView = typeof DataView !== 'undefined';\n\n// All **ECMAScript 5+** native function implementations that we hope to use\n// are declared here.\nexport var nativeIsArray = Array.isArray,\n nativeKeys = Object.keys,\n nativeCreate = Object.create,\n nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;\n\n// Create references to these builtin functions because we override them.\nexport var _isNaN = isNaN,\n _isFinite = isFinite;\n\n// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\nexport var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\nexport var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n// The largest integer that can be represented exactly.\nexport var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n","// Some functions take a variable number of arguments, or a few expected\n// arguments at the beginning and then a variable number of values to operate\n// on. This helper accumulates all remaining arguments past the function’s\n// argument length (or an explicit `startIndex`), into an array that becomes\n// the last argument. Similar to ES6’s \"rest parameter\".\nexport default function restArguments(func, startIndex) {\n startIndex = startIndex == null ? func.length - 1 : +startIndex;\n return function() {\n var length = Math.max(arguments.length - startIndex, 0),\n rest = Array(length),\n index = 0;\n for (; index < length; index++) {\n rest[index] = arguments[index + startIndex];\n }\n switch (startIndex) {\n case 0: return func.call(this, rest);\n case 1: return func.call(this, arguments[0], rest);\n case 2: return func.call(this, arguments[0], arguments[1], rest);\n }\n var args = Array(startIndex + 1);\n for (index = 0; index < startIndex; index++) {\n args[index] = arguments[index];\n }\n args[startIndex] = rest;\n return func.apply(this, args);\n };\n}\n","// Is a given variable an object?\nexport default function isObject(obj) {\n var type = typeof obj;\n return type === 'function' || (type === 'object' && !!obj);\n}\n","// Is a given value equal to null?\nexport default function isNull(obj) {\n return obj === null;\n}\n","// Is a given variable undefined?\nexport default function isUndefined(obj) {\n return obj === void 0;\n}\n","import { toString } from './_setup.js';\n\n// Is a given value a boolean?\nexport default function isBoolean(obj) {\n return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n}\n","// Is a given value a DOM element?\nexport default function isElement(obj) {\n return !!(obj && obj.nodeType === 1);\n}\n","import { toString } from './_setup.js';\n\n// Internal function for creating a `toString`-based type tester.\nexport default function tagTester(name) {\n var tag = '[object ' + name + ']';\n return function(obj) {\n return toString.call(obj) === tag;\n };\n}\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('String');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Number');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Date');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('RegExp');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Error');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Symbol');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('ArrayBuffer');\n","import tagTester from './_tagTester.js';\nimport { root } from './_setup.js';\n\nvar isFunction = tagTester('Function');\n\n// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old\n// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).\nvar nodelist = root.document && root.document.childNodes;\nif (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {\n isFunction = function(obj) {\n return typeof obj == 'function' || false;\n };\n}\n\nexport default isFunction;\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Object');\n","import { supportsDataView } from './_setup.js';\nimport hasObjectTag from './_hasObjectTag.js';\n\n// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.\n// In IE 11, the most common among them, this problem also applies to\n// `Map`, `WeakMap` and `Set`.\n// Also, there are cases where an application can override the native\n// `DataView` object, in cases like that we can't use the constructor\n// safely and should just rely on alternate `DataView` checks\nexport var hasDataViewBug = (\n supportsDataView && (!/\\[native code\\]/.test(String(DataView)) || hasObjectTag(new DataView(new ArrayBuffer(8))))\n ),\n isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));\n","import tagTester from './_tagTester.js';\nimport isFunction from './isFunction.js';\nimport isArrayBuffer from './isArrayBuffer.js';\nimport { hasDataViewBug } from './_stringTagBug.js';\n\nvar isDataView = tagTester('DataView');\n\n// In IE 10 - Edge 13, we need a different heuristic\n// to determine whether an object is a `DataView`.\n// Also, in cases where the native `DataView` is\n// overridden we can't rely on the tag itself.\nfunction alternateIsDataView(obj) {\n return obj != null && isFunction(obj.getInt8) && isArrayBuffer(obj.buffer);\n}\n\nexport default (hasDataViewBug ? alternateIsDataView : isDataView);\n","import { nativeIsArray } from './_setup.js';\nimport tagTester from './_tagTester.js';\n\n// Is a given value an array?\n// Delegates to ECMA5's native `Array.isArray`.\nexport default nativeIsArray || tagTester('Array');\n","import { hasOwnProperty } from './_setup.js';\n\n// Internal function to check whether `key` is an own property name of `obj`.\nexport default function has(obj, key) {\n return obj != null && hasOwnProperty.call(obj, key);\n}\n","import tagTester from './_tagTester.js';\nimport has from './_has.js';\n\nvar isArguments = tagTester('Arguments');\n\n// Define a fallback version of the method in browsers (ahem, IE < 9), where\n// there isn't any inspectable \"Arguments\" type.\n(function() {\n if (!isArguments(arguments)) {\n isArguments = function(obj) {\n return has(obj, 'callee');\n };\n }\n}());\n\nexport default isArguments;\n","import { _isFinite } from './_setup.js';\nimport isSymbol from './isSymbol.js';\n\n// Is a given object a finite number?\nexport default function isFinite(obj) {\n return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));\n}\n","import { _isNaN } from './_setup.js';\nimport isNumber from './isNumber.js';\n\n// Is the given value `NaN`?\nexport default function isNaN(obj) {\n return isNumber(obj) && _isNaN(obj);\n}\n","// Predicate-generating function. Often useful outside of Underscore.\nexport default function constant(value) {\n return function() {\n return value;\n };\n}\n","import { MAX_ARRAY_INDEX } from './_setup.js';\n\n// Common internal logic for `isArrayLike` and `isBufferLike`.\nexport default function createSizePropertyCheck(getSizeProperty) {\n return function(collection) {\n var sizeProperty = getSizeProperty(collection);\n return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;\n }\n}\n","// Internal helper to generate a function to obtain property `key` from `obj`.\nexport default function shallowProperty(key) {\n return function(obj) {\n return obj == null ? void 0 : obj[key];\n };\n}\n","import shallowProperty from './_shallowProperty.js';\n\n// Internal helper to obtain the `byteLength` property of an object.\nexport default shallowProperty('byteLength');\n","import createSizePropertyCheck from './_createSizePropertyCheck.js';\nimport getByteLength from './_getByteLength.js';\n\n// Internal helper to determine whether we should spend extensive checks against\n// `ArrayBuffer` et al.\nexport default createSizePropertyCheck(getByteLength);\n","import { supportsArrayBuffer, nativeIsView, toString } from './_setup.js';\nimport isDataView from './isDataView.js';\nimport constant from './constant.js';\nimport isBufferLike from './_isBufferLike.js';\n\n// Is a given value a typed array?\nvar typedArrayPattern = /\\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\\]/;\nfunction isTypedArray(obj) {\n // `ArrayBuffer.isView` is the most future-proof, so use it when available.\n // Otherwise, fall back on the above regular expression.\n return nativeIsView ? (nativeIsView(obj) && !isDataView(obj)) :\n isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));\n}\n\nexport default supportsArrayBuffer ? isTypedArray : constant(false);\n","import shallowProperty from './_shallowProperty.js';\n\n// Internal helper to obtain the `length` property of an object.\nexport default shallowProperty('length');\n","import { nonEnumerableProps, ObjProto } from './_setup.js';\nimport isFunction from './isFunction.js';\nimport has from './_has.js';\n\n// Internal helper to create a simple lookup structure.\n// `collectNonEnumProps` used to depend on `_.contains`, but this led to\n// circular imports. `emulatedSet` is a one-off solution that only works for\n// arrays of strings.\nfunction emulatedSet(keys) {\n var hash = {};\n for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;\n return {\n contains: function(key) { return hash[key] === true; },\n push: function(key) {\n hash[key] = true;\n return keys.push(key);\n }\n };\n}\n\n// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't\n// be iterated by `for key in ...` and thus missed. Extends `keys` in place if\n// needed.\nexport default function collectNonEnumProps(obj, keys) {\n keys = emulatedSet(keys);\n var nonEnumIdx = nonEnumerableProps.length;\n var constructor = obj.constructor;\n var proto = (isFunction(constructor) && constructor.prototype) || ObjProto;\n\n // Constructor is a special case.\n var prop = 'constructor';\n if (has(obj, prop) && !keys.contains(prop)) keys.push(prop);\n\n while (nonEnumIdx--) {\n prop = nonEnumerableProps[nonEnumIdx];\n if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {\n keys.push(prop);\n }\n }\n}\n","import isObject from './isObject.js';\nimport { nativeKeys, hasEnumBug } from './_setup.js';\nimport has from './_has.js';\nimport collectNonEnumProps from './_collectNonEnumProps.js';\n\n// Retrieve the names of an object's own properties.\n// Delegates to **ECMAScript 5**'s native `Object.keys`.\nexport default function keys(obj) {\n if (!isObject(obj)) return [];\n if (nativeKeys) return nativeKeys(obj);\n var keys = [];\n for (var key in obj) if (has(obj, key)) keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, keys);\n return keys;\n}\n","import getLength from './_getLength.js';\nimport isArray from './isArray.js';\nimport isString from './isString.js';\nimport isArguments from './isArguments.js';\nimport keys from './keys.js';\n\n// Is a given array, string, or object empty?\n// An \"empty\" object has no enumerable own-properties.\nexport default function isEmpty(obj) {\n if (obj == null) return true;\n // Skip the more expensive `toString`-based type checks if `obj` has no\n // `.length`.\n var length = getLength(obj);\n if (typeof length == 'number' && (\n isArray(obj) || isString(obj) || isArguments(obj)\n )) return length === 0;\n return getLength(keys(obj)) === 0;\n}\n","import keys from './keys.js';\n\n// Returns whether an object has a given set of `key:value` pairs.\nexport default function isMatch(object, attrs) {\n var _keys = keys(attrs), length = _keys.length;\n if (object == null) return !length;\n var obj = Object(object);\n for (var i = 0; i < length; i++) {\n var key = _keys[i];\n if (attrs[key] !== obj[key] || !(key in obj)) return false;\n }\n return true;\n}\n","import { VERSION } from './_setup.js';\n\n// If Underscore is called as a function, it returns a wrapped object that can\n// be used OO-style. This wrapper holds altered versions of all functions added\n// through `_.mixin`. Wrapped objects may be chained.\nexport default function _(obj) {\n if (obj instanceof _) return obj;\n if (!(this instanceof _)) return new _(obj);\n this._wrapped = obj;\n}\n\n_.VERSION = VERSION;\n\n// Extracts the result from a wrapped and chained object.\n_.prototype.value = function() {\n return this._wrapped;\n};\n\n// Provide unwrapping proxies for some methods used in engine operations\n// such as arithmetic and JSON stringification.\n_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n_.prototype.toString = function() {\n return String(this._wrapped);\n};\n","import getByteLength from './_getByteLength.js';\n\n// Internal function to wrap or shallow-copy an ArrayBuffer,\n// typed array or DataView to a new view, reusing the buffer.\nexport default function toBufferView(bufferSource) {\n return new Uint8Array(\n bufferSource.buffer || bufferSource,\n bufferSource.byteOffset || 0,\n getByteLength(bufferSource)\n );\n}\n","import _ from './underscore.js';\nimport { toString, SymbolProto } from './_setup.js';\nimport getByteLength from './_getByteLength.js';\nimport isTypedArray from './isTypedArray.js';\nimport isFunction from './isFunction.js';\nimport { hasDataViewBug } from './_stringTagBug.js';\nimport isDataView from './isDataView.js';\nimport keys from './keys.js';\nimport has from './_has.js';\nimport toBufferView from './_toBufferView.js';\n\n// We use this string twice, so give it a name for minification.\nvar tagDataView = '[object DataView]';\n\n// Internal recursive comparison function for `_.isEqual`.\nfunction eq(a, b, aStack, bStack) {\n // Identical objects are equal. `0 === -0`, but they aren't identical.\n // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n if (a === b) return a !== 0 || 1 / a === 1 / b;\n // `null` or `undefined` only equal to itself (strict comparison).\n if (a == null || b == null) return false;\n // `NaN`s are equivalent, but non-reflexive.\n if (a !== a) return b !== b;\n // Exhaust primitive checks\n var type = typeof a;\n if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;\n return deepEq(a, b, aStack, bStack);\n}\n\n// Internal recursive comparison function for `_.isEqual`.\nfunction deepEq(a, b, aStack, bStack) {\n // Unwrap any wrapped objects.\n if (a instanceof _) a = a._wrapped;\n if (b instanceof _) b = b._wrapped;\n // Compare `[[Class]]` names.\n var className = toString.call(a);\n if (className !== toString.call(b)) return false;\n // Work around a bug in IE 10 - Edge 13.\n if (hasDataViewBug && className == '[object Object]' && isDataView(a)) {\n if (!isDataView(b)) return false;\n className = tagDataView;\n }\n switch (className) {\n // These types are compared by value.\n case '[object RegExp]':\n // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n case '[object String]':\n // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n // equivalent to `new String(\"5\")`.\n return '' + a === '' + b;\n case '[object Number]':\n // `NaN`s are equivalent, but non-reflexive.\n // Object(NaN) is equivalent to NaN.\n if (+a !== +a) return +b !== +b;\n // An `egal` comparison is performed for other numeric values.\n return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n case '[object Date]':\n case '[object Boolean]':\n // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n // millisecond representations. Note that invalid dates with millisecond representations\n // of `NaN` are not equivalent.\n return +a === +b;\n case '[object Symbol]':\n return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);\n case '[object ArrayBuffer]':\n case tagDataView:\n // Coerce to typed array so we can fall through.\n return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);\n }\n\n var areArrays = className === '[object Array]';\n if (!areArrays && isTypedArray(a)) {\n var byteLength = getByteLength(a);\n if (byteLength !== getByteLength(b)) return false;\n if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;\n areArrays = true;\n }\n if (!areArrays) {\n if (typeof a != 'object' || typeof b != 'object') return false;\n\n // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n // from different frames are.\n var aCtor = a.constructor, bCtor = b.constructor;\n if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&\n isFunction(bCtor) && bCtor instanceof bCtor)\n && ('constructor' in a && 'constructor' in b)) {\n return false;\n }\n }\n // Assume equality for cyclic structures. The algorithm for detecting cyclic\n // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n // Initializing stack of traversed objects.\n // It's done here since we only need them for objects and arrays comparison.\n aStack = aStack || [];\n bStack = bStack || [];\n var length = aStack.length;\n while (length--) {\n // Linear search. Performance is inversely proportional to the number of\n // unique nested structures.\n if (aStack[length] === a) return bStack[length] === b;\n }\n\n // Add the first object to the stack of traversed objects.\n aStack.push(a);\n bStack.push(b);\n\n // Recursively compare objects and arrays.\n if (areArrays) {\n // Compare array lengths to determine if a deep comparison is necessary.\n length = a.length;\n if (length !== b.length) return false;\n // Deep compare the contents, ignoring non-numeric properties.\n while (length--) {\n if (!eq(a[length], b[length], aStack, bStack)) return false;\n }\n } else {\n // Deep compare objects.\n var _keys = keys(a), key;\n length = _keys.length;\n // Ensure that both objects contain the same number of properties before comparing deep equality.\n if (keys(b).length !== length) return false;\n while (length--) {\n // Deep compare each member\n key = _keys[length];\n if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n }\n }\n // Remove the first object from the stack of traversed objects.\n aStack.pop();\n bStack.pop();\n return true;\n}\n\n// Perform a deep comparison to check if two objects are equal.\nexport default function isEqual(a, b) {\n return eq(a, b);\n}\n","import isObject from './isObject.js';\nimport { hasEnumBug } from './_setup.js';\nimport collectNonEnumProps from './_collectNonEnumProps.js';\n\n// Retrieve all the enumerable property names of an object.\nexport default function allKeys(obj) {\n if (!isObject(obj)) return [];\n var keys = [];\n for (var key in obj) keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, keys);\n return keys;\n}\n","import getLength from './_getLength.js';\nimport isFunction from './isFunction.js';\nimport allKeys from './allKeys.js';\n\n// Since the regular `Object.prototype.toString` type tests don't work for\n// some types in IE 11, we use a fingerprinting heuristic instead, based\n// on the methods. It's not great, but it's the best we got.\n// The fingerprint method lists are defined below.\nexport function ie11fingerprint(methods) {\n var length = getLength(methods);\n return function(obj) {\n if (obj == null) return false;\n // `Map`, `WeakMap` and `Set` have no enumerable keys.\n var keys = allKeys(obj);\n if (getLength(keys)) return false;\n for (var i = 0; i < length; i++) {\n if (!isFunction(obj[methods[i]])) return false;\n }\n // If we are testing against `WeakMap`, we need to ensure that\n // `obj` doesn't have a `forEach` method in order to distinguish\n // it from a regular `Map`.\n return methods !== weakMapMethods || !isFunction(obj[forEachName]);\n };\n}\n\n// In the interest of compact minification, we write\n// each string in the fingerprints only once.\nvar forEachName = 'forEach',\n hasName = 'has',\n commonInit = ['clear', 'delete'],\n mapTail = ['get', hasName, 'set'];\n\n// `Map`, `WeakMap` and `Set` each have slightly different\n// combinations of the above sublists.\nexport var mapMethods = commonInit.concat(forEachName, mapTail),\n weakMapMethods = commonInit.concat(mapTail),\n setMethods = ['add'].concat(commonInit, forEachName, hasName);\n","import tagTester from './_tagTester.js';\nimport { isIE11 } from './_stringTagBug.js';\nimport { ie11fingerprint, mapMethods } from './_methodFingerprint.js';\n\nexport default isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');\n","import tagTester from './_tagTester.js';\nimport { isIE11 } from './_stringTagBug.js';\nimport { ie11fingerprint, weakMapMethods } from './_methodFingerprint.js';\n\nexport default isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');\n","import tagTester from './_tagTester.js';\nimport { isIE11 } from './_stringTagBug.js';\nimport { ie11fingerprint, setMethods } from './_methodFingerprint.js';\n\nexport default isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('WeakSet');\n","import keys from './keys.js';\n\n// Retrieve the values of an object's properties.\nexport default function values(obj) {\n var _keys = keys(obj);\n var length = _keys.length;\n var values = Array(length);\n for (var i = 0; i < length; i++) {\n values[i] = obj[_keys[i]];\n }\n return values;\n}\n","import keys from './keys.js';\n\n// Convert an object into a list of `[key, value]` pairs.\n// The opposite of `_.object` with one argument.\nexport default function pairs(obj) {\n var _keys = keys(obj);\n var length = _keys.length;\n var pairs = Array(length);\n for (var i = 0; i < length; i++) {\n pairs[i] = [_keys[i], obj[_keys[i]]];\n }\n return pairs;\n}\n","import keys from './keys.js';\n\n// Invert the keys and values of an object. The values must be serializable.\nexport default function invert(obj) {\n var result = {};\n var _keys = keys(obj);\n for (var i = 0, length = _keys.length; i < length; i++) {\n result[obj[_keys[i]]] = _keys[i];\n }\n return result;\n}\n","import isFunction from './isFunction.js';\n\n// Return a sorted list of the function names available on the object.\nexport default function functions(obj) {\n var names = [];\n for (var key in obj) {\n if (isFunction(obj[key])) names.push(key);\n }\n return names.sort();\n}\n","// An internal function for creating assigner functions.\nexport default function createAssigner(keysFunc, defaults) {\n return function(obj) {\n var length = arguments.length;\n if (defaults) obj = Object(obj);\n if (length < 2 || obj == null) return obj;\n for (var index = 1; index < length; index++) {\n var source = arguments[index],\n keys = keysFunc(source),\n l = keys.length;\n for (var i = 0; i < l; i++) {\n var key = keys[i];\n if (!defaults || obj[key] === void 0) obj[key] = source[key];\n }\n }\n return obj;\n };\n}\n","import createAssigner from './_createAssigner.js';\nimport allKeys from './allKeys.js';\n\n// Extend a given object with all the properties in passed-in object(s).\nexport default createAssigner(allKeys);\n","import createAssigner from './_createAssigner.js';\nimport keys from './keys.js';\n\n// Assigns a given object with all the own properties in the passed-in\n// object(s).\n// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\nexport default createAssigner(keys);\n","import createAssigner from './_createAssigner.js';\nimport allKeys from './allKeys.js';\n\n// Fill in a given object with default properties.\nexport default createAssigner(allKeys, true);\n","import isObject from './isObject.js';\nimport { nativeCreate } from './_setup.js';\n\n// Create a naked function reference for surrogate-prototype-swapping.\nfunction ctor() {\n return function(){};\n}\n\n// An internal function for creating a new object that inherits from another.\nexport default function baseCreate(prototype) {\n if (!isObject(prototype)) return {};\n if (nativeCreate) return nativeCreate(prototype);\n var Ctor = ctor();\n Ctor.prototype = prototype;\n var result = new Ctor;\n Ctor.prototype = null;\n return result;\n}\n","import baseCreate from './_baseCreate.js';\nimport extendOwn from './extendOwn.js';\n\n// Creates an object that inherits from the given prototype object.\n// If additional properties are provided then they will be added to the\n// created object.\nexport default function create(prototype, props) {\n var result = baseCreate(prototype);\n if (props) extendOwn(result, props);\n return result;\n}\n","import isObject from './isObject.js';\nimport isArray from './isArray.js';\nimport extend from './extend.js';\n\n// Create a (shallow-cloned) duplicate of an object.\nexport default function clone(obj) {\n if (!isObject(obj)) return obj;\n return isArray(obj) ? obj.slice() : extend({}, obj);\n}\n","// Invokes `interceptor` with the `obj` and then returns `obj`.\n// The primary purpose of this method is to \"tap into\" a method chain, in\n// order to perform operations on intermediate results within the chain.\nexport default function tap(obj, interceptor) {\n interceptor(obj);\n return obj;\n}\n","import _ from './underscore.js';\nimport isArray from './isArray.js';\n\n// Normalize a (deep) property `path` to array.\n// Like `_.iteratee`, this function can be customized.\nexport default function toPath(path) {\n return isArray(path) ? path : [path];\n}\n_.toPath = toPath;\n","import _ from './underscore.js';\nimport './toPath.js';\n\n// Internal wrapper for `_.toPath` to enable minification.\n// Similar to `cb` for `_.iteratee`.\nexport default function toPath(path) {\n return _.toPath(path);\n}\n","// Internal function to obtain a nested property in `obj` along `path`.\nexport default function deepGet(obj, path) {\n var length = path.length;\n for (var i = 0; i < length; i++) {\n if (obj == null) return void 0;\n obj = obj[path[i]];\n }\n return length ? obj : void 0;\n}\n","import toPath from './_toPath.js';\nimport deepGet from './_deepGet.js';\nimport isUndefined from './isUndefined.js';\n\n// Get the value of the (deep) property on `path` from `object`.\n// If any property in `path` does not exist or if the value is\n// `undefined`, return `defaultValue` instead.\n// The `path` is normalized through `_.toPath`.\nexport default function get(object, path, defaultValue) {\n var value = deepGet(object, toPath(path));\n return isUndefined(value) ? defaultValue : value;\n}\n","import _has from './_has.js';\nimport toPath from './_toPath.js';\n\n// Shortcut function for checking if an object has a given property directly on\n// itself (in other words, not on a prototype). Unlike the internal `has`\n// function, this public version can also traverse nested properties.\nexport default function has(obj, path) {\n path = toPath(path);\n var length = path.length;\n for (var i = 0; i < length; i++) {\n var key = path[i];\n if (!_has(obj, key)) return false;\n obj = obj[key];\n }\n return !!length;\n}\n","// Keep the identity function around for default iteratees.\nexport default function identity(value) {\n return value;\n}\n","import extendOwn from './extendOwn.js';\nimport isMatch from './isMatch.js';\n\n// Returns a predicate for checking whether an object has a given set of\n// `key:value` pairs.\nexport default function matcher(attrs) {\n attrs = extendOwn({}, attrs);\n return function(obj) {\n return isMatch(obj, attrs);\n };\n}\n","import deepGet from './_deepGet.js';\nimport toPath from './_toPath.js';\n\n// Creates a function that, when passed an object, will traverse that object’s\n// properties down the given `path`, specified as an array of keys or indices.\nexport default function property(path) {\n path = toPath(path);\n return function(obj) {\n return deepGet(obj, path);\n };\n}\n","// Internal function that returns an efficient (for current engines) version\n// of the passed-in callback, to be repeatedly applied in other Underscore\n// functions.\nexport default function optimizeCb(func, context, argCount) {\n if (context === void 0) return func;\n switch (argCount == null ? 3 : argCount) {\n case 1: return function(value) {\n return func.call(context, value);\n };\n // The 2-argument case is omitted because we’re not using it.\n case 3: return function(value, index, collection) {\n return func.call(context, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(context, accumulator, value, index, collection);\n };\n }\n return function() {\n return func.apply(context, arguments);\n };\n}\n","import identity from './identity.js';\nimport isFunction from './isFunction.js';\nimport isObject from './isObject.js';\nimport isArray from './isArray.js';\nimport matcher from './matcher.js';\nimport property from './property.js';\nimport optimizeCb from './_optimizeCb.js';\n\n// An internal function to generate callbacks that can be applied to each\n// element in a collection, returning the desired result — either `_.identity`,\n// an arbitrary callback, a property matcher, or a property accessor.\nexport default function baseIteratee(value, context, argCount) {\n if (value == null) return identity;\n if (isFunction(value)) return optimizeCb(value, context, argCount);\n if (isObject(value) && !isArray(value)) return matcher(value);\n return property(value);\n}\n","import _ from './underscore.js';\nimport baseIteratee from './_baseIteratee.js';\n\n// External wrapper for our callback generator. Users may customize\n// `_.iteratee` if they want additional predicate/iteratee shorthand styles.\n// This abstraction hides the internal-only `argCount` argument.\nexport default function iteratee(value, context) {\n return baseIteratee(value, context, Infinity);\n}\n_.iteratee = iteratee;\n","import _ from './underscore.js';\nimport baseIteratee from './_baseIteratee.js';\nimport iteratee from './iteratee.js';\n\n// The function we call internally to generate a callback. It invokes\n// `_.iteratee` if overridden, otherwise `baseIteratee`.\nexport default function cb(value, context, argCount) {\n if (_.iteratee !== iteratee) return _.iteratee(value, context);\n return baseIteratee(value, context, argCount);\n}\n","import cb from './_cb.js';\nimport keys from './keys.js';\n\n// Returns the results of applying the `iteratee` to each element of `obj`.\n// In contrast to `_.map` it returns an object.\nexport default function mapObject(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var _keys = keys(obj),\n length = _keys.length,\n results = {};\n for (var index = 0; index < length; index++) {\n var currentKey = _keys[index];\n results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n}\n","// Predicate-generating function. Often useful outside of Underscore.\nexport default function noop(){}\n","import noop from './noop.js';\nimport get from './get.js';\n\n// Generates a function for a given object that returns a given property.\nexport default function propertyOf(obj) {\n if (obj == null) return noop;\n return function(path) {\n return get(obj, path);\n };\n}\n","import optimizeCb from './_optimizeCb.js';\n\n// Run a function **n** times.\nexport default function times(n, iteratee, context) {\n var accum = Array(Math.max(0, n));\n iteratee = optimizeCb(iteratee, context, 1);\n for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n return accum;\n}\n","// Return a random integer between `min` and `max` (inclusive).\nexport default function random(min, max) {\n if (max == null) {\n max = min;\n min = 0;\n }\n return min + Math.floor(Math.random() * (max - min + 1));\n}\n","// A (possibly faster) way to get the current timestamp as an integer.\nexport default Date.now || function() {\n return new Date().getTime();\n};\n","import keys from './keys.js';\n\n// Internal helper to generate functions for escaping and unescaping strings\n// to/from HTML interpolation.\nexport default function createEscaper(map) {\n var escaper = function(match) {\n return map[match];\n };\n // Regexes for identifying a key that needs to be escaped.\n var source = '(?:' + keys(map).join('|') + ')';\n var testRegexp = RegExp(source);\n var replaceRegexp = RegExp(source, 'g');\n return function(string) {\n string = string == null ? '' : '' + string;\n return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n };\n}\n","// Internal list of HTML entities for escaping.\nexport default {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n};\n","import createEscaper from './_createEscaper.js';\nimport escapeMap from './_escapeMap.js';\n\n// Function for escaping strings to HTML interpolation.\nexport default createEscaper(escapeMap);\n","import createEscaper from './_createEscaper.js';\nimport unescapeMap from './_unescapeMap.js';\n\n// Function for unescaping strings from HTML interpolation.\nexport default createEscaper(unescapeMap);\n","import invert from './invert.js';\nimport escapeMap from './_escapeMap.js';\n\n// Internal list of HTML entities for unescaping.\nexport default invert(escapeMap);\n","import _ from './underscore.js';\n\n// By default, Underscore uses ERB-style template delimiters. Change the\n// following template settings to use alternative delimiters.\nexport default _.templateSettings = {\n evaluate: /<%([\\s\\S]+?)%>/g,\n interpolate: /<%=([\\s\\S]+?)%>/g,\n escape: /<%-([\\s\\S]+?)%>/g\n};\n","import defaults from './defaults.js';\nimport _ from './underscore.js';\nimport './templateSettings.js';\n\n// When customizing `_.templateSettings`, if you don't want to define an\n// interpolation, evaluation or escaping regex, we need one that is\n// guaranteed not to match.\nvar noMatch = /(.)^/;\n\n// Certain characters need to be escaped so that they can be put into a\n// string literal.\nvar escapes = {\n \"'\": \"'\",\n '\\\\': '\\\\',\n '\\r': 'r',\n '\\n': 'n',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n};\n\nvar escapeRegExp = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\nfunction escapeChar(match) {\n return '\\\\' + escapes[match];\n}\n\n// In order to prevent third-party code injection through\n// `_.templateSettings.variable`, we test it against the following regular\n// expression. It is intentionally a bit more liberal than just matching valid\n// identifiers, but still prevents possible loopholes through defaults or\n// destructuring assignment.\nvar bareIdentifier = /^\\s*(\\w|\\$)+\\s*$/;\n\n// JavaScript micro-templating, similar to John Resig's implementation.\n// Underscore templating handles arbitrary delimiters, preserves whitespace,\n// and correctly escapes quotes within interpolated code.\n// NB: `oldSettings` only exists for backwards compatibility.\nexport default function template(text, settings, oldSettings) {\n if (!settings && oldSettings) settings = oldSettings;\n settings = defaults({}, settings, _.templateSettings);\n\n // Combine delimiters into one regular expression via alternation.\n var matcher = RegExp([\n (settings.escape || noMatch).source,\n (settings.interpolate || noMatch).source,\n (settings.evaluate || noMatch).source\n ].join('|') + '|$', 'g');\n\n // Compile the template source, escaping string literals appropriately.\n var index = 0;\n var source = \"__p+='\";\n text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n source += text.slice(index, offset).replace(escapeRegExp, escapeChar);\n index = offset + match.length;\n\n if (escape) {\n source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n } else if (interpolate) {\n source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n } else if (evaluate) {\n source += \"';\\n\" + evaluate + \"\\n__p+='\";\n }\n\n // Adobe VMs need the match returned to produce the correct offset.\n return match;\n });\n source += \"';\\n\";\n\n var argument = settings.variable;\n if (argument) {\n // Insure against third-party code injection. (CVE-2021-23358)\n if (!bareIdentifier.test(argument)) throw new Error(\n 'variable is not a bare identifier: ' + argument\n );\n } else {\n // If a variable is not specified, place data values in local scope.\n source = 'with(obj||{}){\\n' + source + '}\\n';\n argument = 'obj';\n }\n\n source = \"var __t,__p='',__j=Array.prototype.join,\" +\n \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n source + 'return __p;\\n';\n\n var render;\n try {\n render = new Function(argument, '_', source);\n } catch (e) {\n e.source = source;\n throw e;\n }\n\n var template = function(data) {\n return render.call(this, data, _);\n };\n\n // Provide the compiled source as a convenience for precompilation.\n template.source = 'function(' + argument + '){\\n' + source + '}';\n\n return template;\n}\n","import isFunction from './isFunction.js';\nimport toPath from './_toPath.js';\n\n// Traverses the children of `obj` along `path`. If a child is a function, it\n// is invoked with its parent as context. Returns the value of the final\n// child, or `fallback` if any child is undefined.\nexport default function result(obj, path, fallback) {\n path = toPath(path);\n var length = path.length;\n if (!length) {\n return isFunction(fallback) ? fallback.call(obj) : fallback;\n }\n for (var i = 0; i < length; i++) {\n var prop = obj == null ? void 0 : obj[path[i]];\n if (prop === void 0) {\n prop = fallback;\n i = length; // Ensure we don't continue iterating.\n }\n obj = isFunction(prop) ? prop.call(obj) : prop;\n }\n return obj;\n}\n","// Generate a unique integer id (unique within the entire client session).\n// Useful for temporary DOM ids.\nvar idCounter = 0;\nexport default function uniqueId(prefix) {\n var id = ++idCounter + '';\n return prefix ? prefix + id : id;\n}\n","import _ from './underscore.js';\n\n// Start chaining a wrapped Underscore object.\nexport default function chain(obj) {\n var instance = _(obj);\n instance._chain = true;\n return instance;\n}\n","import baseCreate from './_baseCreate.js';\nimport isObject from './isObject.js';\n\n// Internal function to execute `sourceFunc` bound to `context` with optional\n// `args`. Determines whether to execute a function as a constructor or as a\n// normal function.\nexport default function executeBound(sourceFunc, boundFunc, context, callingContext, args) {\n if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n var self = baseCreate(sourceFunc.prototype);\n var result = sourceFunc.apply(self, args);\n if (isObject(result)) return result;\n return self;\n}\n","import restArguments from './restArguments.js';\nimport executeBound from './_executeBound.js';\nimport _ from './underscore.js';\n\n// Partially apply a function by creating a version that has had some of its\n// arguments pre-filled, without changing its dynamic `this` context. `_` acts\n// as a placeholder by default, allowing any combination of arguments to be\n// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.\nvar partial = restArguments(function(func, boundArgs) {\n var placeholder = partial.placeholder;\n var bound = function() {\n var position = 0, length = boundArgs.length;\n var args = Array(length);\n for (var i = 0; i < length; i++) {\n args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];\n }\n while (position < arguments.length) args.push(arguments[position++]);\n return executeBound(func, bound, this, this, args);\n };\n return bound;\n});\n\npartial.placeholder = _;\nexport default partial;\n","import restArguments from './restArguments.js';\nimport isFunction from './isFunction.js';\nimport executeBound from './_executeBound.js';\n\n// Create a function bound to a given object (assigning `this`, and arguments,\n// optionally).\nexport default restArguments(function(func, context, args) {\n if (!isFunction(func)) throw new TypeError('Bind must be called on a function');\n var bound = restArguments(function(callArgs) {\n return executeBound(func, bound, context, this, args.concat(callArgs));\n });\n return bound;\n});\n","import createSizePropertyCheck from './_createSizePropertyCheck.js';\nimport getLength from './_getLength.js';\n\n// Internal helper for collection methods to determine whether a collection\n// should be iterated as an array or as an object.\n// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\nexport default createSizePropertyCheck(getLength);\n","import getLength from './_getLength.js';\nimport isArrayLike from './_isArrayLike.js';\nimport isArray from './isArray.js';\nimport isArguments from './isArguments.js';\n\n// Internal implementation of a recursive `flatten` function.\nexport default function flatten(input, depth, strict, output) {\n output = output || [];\n if (!depth && depth !== 0) {\n depth = Infinity;\n } else if (depth <= 0) {\n return output.concat(input);\n }\n var idx = output.length;\n for (var i = 0, length = getLength(input); i < length; i++) {\n var value = input[i];\n if (isArrayLike(value) && (isArray(value) || isArguments(value))) {\n // Flatten current level of array or arguments object.\n if (depth > 1) {\n flatten(value, depth - 1, strict, output);\n idx = output.length;\n } else {\n var j = 0, len = value.length;\n while (j < len) output[idx++] = value[j++];\n }\n } else if (!strict) {\n output[idx++] = value;\n }\n }\n return output;\n}\n","import restArguments from './restArguments.js';\nimport flatten from './_flatten.js';\nimport bind from './bind.js';\n\n// Bind a number of an object's methods to that object. Remaining arguments\n// are the method names to be bound. Useful for ensuring that all callbacks\n// defined on an object belong to it.\nexport default restArguments(function(obj, keys) {\n keys = flatten(keys, false, false);\n var index = keys.length;\n if (index < 1) throw new Error('bindAll must be passed function names');\n while (index--) {\n var key = keys[index];\n obj[key] = bind(obj[key], obj);\n }\n return obj;\n});\n","import has from './_has.js';\n\n// Memoize an expensive function by storing its results.\nexport default function memoize(func, hasher) {\n var memoize = function(key) {\n var cache = memoize.cache;\n var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n if (!has(cache, address)) cache[address] = func.apply(this, arguments);\n return cache[address];\n };\n memoize.cache = {};\n return memoize;\n}\n","import restArguments from './restArguments.js';\n\n// Delays a function for the given number of milliseconds, and then calls\n// it with the arguments supplied.\nexport default restArguments(function(func, wait, args) {\n return setTimeout(function() {\n return func.apply(null, args);\n }, wait);\n});\n","import partial from './partial.js';\nimport delay from './delay.js';\nimport _ from './underscore.js';\n\n// Defers a function, scheduling it to run after the current call stack has\n// cleared.\nexport default partial(delay, _, 1);\n","import now from './now.js';\n\n// Returns a function, that, when invoked, will only be triggered at most once\n// during a given window of time. Normally, the throttled function will run\n// as much as it can, without ever going more than once per `wait` duration;\n// but if you'd like to disable the execution on the leading edge, pass\n// `{leading: false}`. To disable execution on the trailing edge, ditto.\nexport default function throttle(func, wait, options) {\n var timeout, context, args, result;\n var previous = 0;\n if (!options) options = {};\n\n var later = function() {\n previous = options.leading === false ? 0 : now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n\n var throttled = function() {\n var _now = now();\n if (!previous && options.leading === false) previous = _now;\n var remaining = wait - (_now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = _now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n\n throttled.cancel = function() {\n clearTimeout(timeout);\n previous = 0;\n timeout = context = args = null;\n };\n\n return throttled;\n}\n","import restArguments from './restArguments.js';\nimport now from './now.js';\n\n// When a sequence of calls of the returned function ends, the argument\n// function is triggered. The end of a sequence is defined by the `wait`\n// parameter. If `immediate` is passed, the argument function will be\n// triggered at the beginning of the sequence instead of at the end.\nexport default function debounce(func, wait, immediate) {\n var timeout, previous, args, result, context;\n\n var later = function() {\n var passed = now() - previous;\n if (wait > passed) {\n timeout = setTimeout(later, wait - passed);\n } else {\n timeout = null;\n if (!immediate) result = func.apply(context, args);\n // This check is needed because `func` can recursively invoke `debounced`.\n if (!timeout) args = context = null;\n }\n };\n\n var debounced = restArguments(function(_args) {\n context = this;\n args = _args;\n previous = now();\n if (!timeout) {\n timeout = setTimeout(later, wait);\n if (immediate) result = func.apply(context, args);\n }\n return result;\n });\n\n debounced.cancel = function() {\n clearTimeout(timeout);\n timeout = args = context = null;\n };\n\n return debounced;\n}\n","import partial from './partial.js';\n\n// Returns the first function passed as an argument to the second,\n// allowing you to adjust arguments, run code before and after, and\n// conditionally execute the original function.\nexport default function wrap(func, wrapper) {\n return partial(wrapper, func);\n}\n","// Returns a negated version of the passed-in predicate.\nexport default function negate(predicate) {\n return function() {\n return !predicate.apply(this, arguments);\n };\n}\n","// Returns a function that is the composition of a list of functions, each\n// consuming the return value of the function that follows.\nexport default function compose() {\n var args = arguments;\n var start = args.length - 1;\n return function() {\n var i = start;\n var result = args[start].apply(this, arguments);\n while (i--) result = args[i].call(this, result);\n return result;\n };\n}\n","// Returns a function that will only be executed on and after the Nth call.\nexport default function after(times, func) {\n return function() {\n if (--times < 1) {\n return func.apply(this, arguments);\n }\n };\n}\n","// Returns a function that will only be executed up to (but not including) the\n// Nth call.\nexport default function before(times, func) {\n var memo;\n return function() {\n if (--times > 0) {\n memo = func.apply(this, arguments);\n }\n if (times <= 1) func = null;\n return memo;\n };\n}\n","import partial from './partial.js';\nimport before from './before.js';\n\n// Returns a function that will be executed at most one time, no matter how\n// often you call it. Useful for lazy initialization.\nexport default partial(before, 2);\n","import cb from './_cb.js';\nimport keys from './keys.js';\n\n// Returns the first key on an object that passes a truth test.\nexport default function findKey(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = keys(obj), key;\n for (var i = 0, length = _keys.length; i < length; i++) {\n key = _keys[i];\n if (predicate(obj[key], key, obj)) return key;\n }\n}\n","import cb from './_cb.js';\nimport getLength from './_getLength.js';\n\n// Internal function to generate `_.findIndex` and `_.findLastIndex`.\nexport default function createPredicateIndexFinder(dir) {\n return function(array, predicate, context) {\n predicate = cb(predicate, context);\n var length = getLength(array);\n var index = dir > 0 ? 0 : length - 1;\n for (; index >= 0 && index < length; index += dir) {\n if (predicate(array[index], index, array)) return index;\n }\n return -1;\n };\n}\n","import createPredicateIndexFinder from './_createPredicateIndexFinder.js';\n\n// Returns the first index on an array-like that passes a truth test.\nexport default createPredicateIndexFinder(1);\n","import createPredicateIndexFinder from './_createPredicateIndexFinder.js';\n\n// Returns the last index on an array-like that passes a truth test.\nexport default createPredicateIndexFinder(-1);\n","import cb from './_cb.js';\nimport getLength from './_getLength.js';\n\n// Use a comparator function to figure out the smallest index at which\n// an object should be inserted so as to maintain order. Uses binary search.\nexport default function sortedIndex(array, obj, iteratee, context) {\n iteratee = cb(iteratee, context, 1);\n var value = iteratee(obj);\n var low = 0, high = getLength(array);\n while (low < high) {\n var mid = Math.floor((low + high) / 2);\n if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n }\n return low;\n}\n","import getLength from './_getLength.js';\nimport { slice } from './_setup.js';\nimport isNaN from './isNaN.js';\n\n// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.\nexport default function createIndexFinder(dir, predicateFind, sortedIndex) {\n return function(array, item, idx) {\n var i = 0, length = getLength(array);\n if (typeof idx == 'number') {\n if (dir > 0) {\n i = idx >= 0 ? idx : Math.max(idx + length, i);\n } else {\n length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n }\n } else if (sortedIndex && idx && length) {\n idx = sortedIndex(array, item);\n return array[idx] === item ? idx : -1;\n }\n if (item !== item) {\n idx = predicateFind(slice.call(array, i, length), isNaN);\n return idx >= 0 ? idx + i : -1;\n }\n for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n if (array[idx] === item) return idx;\n }\n return -1;\n };\n}\n","import sortedIndex from './sortedIndex.js';\nimport findIndex from './findIndex.js';\nimport createIndexFinder from './_createIndexFinder.js';\n\n// Return the position of the first occurrence of an item in an array,\n// or -1 if the item is not included in the array.\n// If the array is large and already in sort order, pass `true`\n// for **isSorted** to use binary search.\nexport default createIndexFinder(1, findIndex, sortedIndex);\n","import findLastIndex from './findLastIndex.js';\nimport createIndexFinder from './_createIndexFinder.js';\n\n// Return the position of the last occurrence of an item in an array,\n// or -1 if the item is not included in the array.\nexport default createIndexFinder(-1, findLastIndex);\n","import isArrayLike from './_isArrayLike.js';\nimport findIndex from './findIndex.js';\nimport findKey from './findKey.js';\n\n// Return the first value which passes a truth test.\nexport default function find(obj, predicate, context) {\n var keyFinder = isArrayLike(obj) ? findIndex : findKey;\n var key = keyFinder(obj, predicate, context);\n if (key !== void 0 && key !== -1) return obj[key];\n}\n","import find from './find.js';\nimport matcher from './matcher.js';\n\n// Convenience version of a common use case of `_.find`: getting the first\n// object containing specific `key:value` pairs.\nexport default function findWhere(obj, attrs) {\n return find(obj, matcher(attrs));\n}\n","import optimizeCb from './_optimizeCb.js';\nimport isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// The cornerstone for collection functions, an `each`\n// implementation, aka `forEach`.\n// Handles raw objects in addition to array-likes. Treats all\n// sparse array-likes as if they were dense.\nexport default function each(obj, iteratee, context) {\n iteratee = optimizeCb(iteratee, context);\n var i, length;\n if (isArrayLike(obj)) {\n for (i = 0, length = obj.length; i < length; i++) {\n iteratee(obj[i], i, obj);\n }\n } else {\n var _keys = keys(obj);\n for (i = 0, length = _keys.length; i < length; i++) {\n iteratee(obj[_keys[i]], _keys[i], obj);\n }\n }\n return obj;\n}\n","import cb from './_cb.js';\nimport isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// Return the results of applying the iteratee to each element.\nexport default function map(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length,\n results = Array(length);\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n results[index] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n}\n","import isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\nimport optimizeCb from './_optimizeCb.js';\n\n// Internal helper to create a reducing function, iterating left or right.\nexport default function createReduce(dir) {\n // Wrap code that reassigns argument variables in a separate function than\n // the one that accesses `arguments.length` to avoid a perf hit. (#1991)\n var reducer = function(obj, iteratee, memo, initial) {\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length,\n index = dir > 0 ? 0 : length - 1;\n if (!initial) {\n memo = obj[_keys ? _keys[index] : index];\n index += dir;\n }\n for (; index >= 0 && index < length; index += dir) {\n var currentKey = _keys ? _keys[index] : index;\n memo = iteratee(memo, obj[currentKey], currentKey, obj);\n }\n return memo;\n };\n\n return function(obj, iteratee, memo, context) {\n var initial = arguments.length >= 3;\n return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);\n };\n}\n","import createReduce from './_createReduce.js';\n\n// **Reduce** builds up a single result from a list of values, aka `inject`,\n// or `foldl`.\nexport default createReduce(1);\n","import createReduce from './_createReduce.js';\n\n// The right-associative version of reduce, also known as `foldr`.\nexport default createReduce(-1);\n","import cb from './_cb.js';\nimport each from './each.js';\n\n// Return all the elements that pass a truth test.\nexport default function filter(obj, predicate, context) {\n var results = [];\n predicate = cb(predicate, context);\n each(obj, function(value, index, list) {\n if (predicate(value, index, list)) results.push(value);\n });\n return results;\n}\n","import filter from './filter.js';\nimport negate from './negate.js';\nimport cb from './_cb.js';\n\n// Return all the elements for which a truth test fails.\nexport default function reject(obj, predicate, context) {\n return filter(obj, negate(cb(predicate)), context);\n}\n","import cb from './_cb.js';\nimport isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// Determine whether all of the elements pass a truth test.\nexport default function every(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n if (!predicate(obj[currentKey], currentKey, obj)) return false;\n }\n return true;\n}\n","import cb from './_cb.js';\nimport isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// Determine if at least one element in the object passes a truth test.\nexport default function some(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n if (predicate(obj[currentKey], currentKey, obj)) return true;\n }\n return false;\n}\n","import isArrayLike from './_isArrayLike.js';\nimport values from './values.js';\nimport indexOf from './indexOf.js';\n\n// Determine if the array or object contains a given item (using `===`).\nexport default function contains(obj, item, fromIndex, guard) {\n if (!isArrayLike(obj)) obj = values(obj);\n if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n return indexOf(obj, item, fromIndex) >= 0;\n}\n","import restArguments from './restArguments.js';\nimport isFunction from './isFunction.js';\nimport map from './map.js';\nimport deepGet from './_deepGet.js';\nimport toPath from './_toPath.js';\n\n// Invoke a method (with arguments) on every item in a collection.\nexport default restArguments(function(obj, path, args) {\n var contextPath, func;\n if (isFunction(path)) {\n func = path;\n } else {\n path = toPath(path);\n contextPath = path.slice(0, -1);\n path = path[path.length - 1];\n }\n return map(obj, function(context) {\n var method = func;\n if (!method) {\n if (contextPath && contextPath.length) {\n context = deepGet(context, contextPath);\n }\n if (context == null) return void 0;\n method = context[path];\n }\n return method == null ? method : method.apply(context, args);\n });\n});\n","import map from './map.js';\nimport property from './property.js';\n\n// Convenience version of a common use case of `_.map`: fetching a property.\nexport default function pluck(obj, key) {\n return map(obj, property(key));\n}\n","import filter from './filter.js';\nimport matcher from './matcher.js';\n\n// Convenience version of a common use case of `_.filter`: selecting only\n// objects containing specific `key:value` pairs.\nexport default function where(obj, attrs) {\n return filter(obj, matcher(attrs));\n}\n","import isArrayLike from './_isArrayLike.js';\nimport values from './values.js';\nimport cb from './_cb.js';\nimport each from './each.js';\n\n// Return the maximum element (or element-based computation).\nexport default function max(obj, iteratee, context) {\n var result = -Infinity, lastComputed = -Infinity,\n value, computed;\n if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {\n obj = isArrayLike(obj) ? obj : values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value != null && value > result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n each(obj, function(v, index, list) {\n computed = iteratee(v, index, list);\n if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) {\n result = v;\n lastComputed = computed;\n }\n });\n }\n return result;\n}\n","import isArrayLike from './_isArrayLike.js';\nimport values from './values.js';\nimport cb from './_cb.js';\nimport each from './each.js';\n\n// Return the minimum element (or element-based computation).\nexport default function min(obj, iteratee, context) {\n var result = Infinity, lastComputed = Infinity,\n value, computed;\n if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {\n obj = isArrayLike(obj) ? obj : values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value != null && value < result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n each(obj, function(v, index, list) {\n computed = iteratee(v, index, list);\n if (computed < lastComputed || (computed === Infinity && result === Infinity)) {\n result = v;\n lastComputed = computed;\n }\n });\n }\n return result;\n}\n","import isArray from './isArray.js';\nimport { slice } from './_setup.js';\nimport isString from './isString.js';\nimport isArrayLike from './_isArrayLike.js';\nimport map from './map.js';\nimport identity from './identity.js';\nimport values from './values.js';\n\n// Safely create a real, live array from anything iterable.\nvar reStrSymbol = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\nexport default function toArray(obj) {\n if (!obj) return [];\n if (isArray(obj)) return slice.call(obj);\n if (isString(obj)) {\n // Keep surrogate pair characters together.\n return obj.match(reStrSymbol);\n }\n if (isArrayLike(obj)) return map(obj, identity);\n return values(obj);\n}\n","import isArrayLike from './_isArrayLike.js';\nimport values from './values.js';\nimport getLength from './_getLength.js';\nimport random from './random.js';\nimport toArray from './toArray.js';\n\n// Sample **n** random values from a collection using the modern version of the\n// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n// If **n** is not specified, returns a single random element.\n// The internal `guard` argument allows it to work with `_.map`.\nexport default function sample(obj, n, guard) {\n if (n == null || guard) {\n if (!isArrayLike(obj)) obj = values(obj);\n return obj[random(obj.length - 1)];\n }\n var sample = toArray(obj);\n var length = getLength(sample);\n n = Math.max(Math.min(n, length), 0);\n var last = length - 1;\n for (var index = 0; index < n; index++) {\n var rand = random(index, last);\n var temp = sample[index];\n sample[index] = sample[rand];\n sample[rand] = temp;\n }\n return sample.slice(0, n);\n}\n","import sample from './sample.js';\n\n// Shuffle a collection.\nexport default function shuffle(obj) {\n return sample(obj, Infinity);\n}\n","import cb from './_cb.js';\nimport pluck from './pluck.js';\nimport map from './map.js';\n\n// Sort the object's values by a criterion produced by an iteratee.\nexport default function sortBy(obj, iteratee, context) {\n var index = 0;\n iteratee = cb(iteratee, context);\n return pluck(map(obj, function(value, key, list) {\n return {\n value: value,\n index: index++,\n criteria: iteratee(value, key, list)\n };\n }).sort(function(left, right) {\n var a = left.criteria;\n var b = right.criteria;\n if (a !== b) {\n if (a > b || a === void 0) return 1;\n if (a < b || b === void 0) return -1;\n }\n return left.index - right.index;\n }), 'value');\n}\n","import cb from './_cb.js';\nimport each from './each.js';\n\n// An internal function used for aggregate \"group by\" operations.\nexport default function group(behavior, partition) {\n return function(obj, iteratee, context) {\n var result = partition ? [[], []] : {};\n iteratee = cb(iteratee, context);\n each(obj, function(value, index) {\n var key = iteratee(value, index, obj);\n behavior(result, value, key);\n });\n return result;\n };\n}\n","import group from './_group.js';\nimport has from './_has.js';\n\n// Groups the object's values by a criterion. Pass either a string attribute\n// to group by, or a function that returns the criterion.\nexport default group(function(result, value, key) {\n if (has(result, key)) result[key].push(value); else result[key] = [value];\n});\n","import group from './_group.js';\n\n// Indexes the object's values by a criterion, similar to `_.groupBy`, but for\n// when you know that your index values will be unique.\nexport default group(function(result, value, key) {\n result[key] = value;\n});\n","import group from './_group.js';\nimport has from './_has.js';\n\n// Counts instances of an object that group by a certain criterion. Pass\n// either a string attribute to count by, or a function that returns the\n// criterion.\nexport default group(function(result, value, key) {\n if (has(result, key)) result[key]++; else result[key] = 1;\n});\n","import group from './_group.js';\n\n// Split a collection into two arrays: one whose elements all pass the given\n// truth test, and one whose elements all do not pass the truth test.\nexport default group(function(result, value, pass) {\n result[pass ? 0 : 1].push(value);\n}, true);\n","import isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// Return the number of elements in a collection.\nexport default function size(obj) {\n if (obj == null) return 0;\n return isArrayLike(obj) ? obj.length : keys(obj).length;\n}\n","// Internal `_.pick` helper function to determine whether `key` is an enumerable\n// property name of `obj`.\nexport default function keyInObj(value, key, obj) {\n return key in obj;\n}\n","import restArguments from './restArguments.js';\nimport isFunction from './isFunction.js';\nimport optimizeCb from './_optimizeCb.js';\nimport allKeys from './allKeys.js';\nimport keyInObj from './_keyInObj.js';\nimport flatten from './_flatten.js';\n\n// Return a copy of the object only containing the allowed properties.\nexport default restArguments(function(obj, keys) {\n var result = {}, iteratee = keys[0];\n if (obj == null) return result;\n if (isFunction(iteratee)) {\n if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);\n keys = allKeys(obj);\n } else {\n iteratee = keyInObj;\n keys = flatten(keys, false, false);\n obj = Object(obj);\n }\n for (var i = 0, length = keys.length; i < length; i++) {\n var key = keys[i];\n var value = obj[key];\n if (iteratee(value, key, obj)) result[key] = value;\n }\n return result;\n});\n","import restArguments from './restArguments.js';\nimport isFunction from './isFunction.js';\nimport negate from './negate.js';\nimport map from './map.js';\nimport flatten from './_flatten.js';\nimport contains from './contains.js';\nimport pick from './pick.js';\n\n// Return a copy of the object without the disallowed properties.\nexport default restArguments(function(obj, keys) {\n var iteratee = keys[0], context;\n if (isFunction(iteratee)) {\n iteratee = negate(iteratee);\n if (keys.length > 1) context = keys[1];\n } else {\n keys = map(flatten(keys, false, false), String);\n iteratee = function(value, key) {\n return !contains(keys, key);\n };\n }\n return pick(obj, iteratee, context);\n});\n","import { slice } from './_setup.js';\n\n// Returns everything but the last entry of the array. Especially useful on\n// the arguments object. Passing **n** will return all the values in\n// the array, excluding the last N.\nexport default function initial(array, n, guard) {\n return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n}\n","import initial from './initial.js';\n\n// Get the first element of an array. Passing **n** will return the first N\n// values in the array. The **guard** check allows it to work with `_.map`.\nexport default function first(array, n, guard) {\n if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n if (n == null || guard) return array[0];\n return initial(array, array.length - n);\n}\n","import { slice } from './_setup.js';\n\n// Returns everything but the first entry of the `array`. Especially useful on\n// the `arguments` object. Passing an **n** will return the rest N values in the\n// `array`.\nexport default function rest(array, n, guard) {\n return slice.call(array, n == null || guard ? 1 : n);\n}\n","import rest from './rest.js';\n\n// Get the last element of an array. Passing **n** will return the last N\n// values in the array.\nexport default function last(array, n, guard) {\n if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n if (n == null || guard) return array[array.length - 1];\n return rest(array, Math.max(0, array.length - n));\n}\n","import filter from './filter.js';\n\n// Trim out all falsy values from an array.\nexport default function compact(array) {\n return filter(array, Boolean);\n}\n","import _flatten from './_flatten.js';\n\n// Flatten out an array, either recursively (by default), or up to `depth`.\n// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.\nexport default function flatten(array, depth) {\n return _flatten(array, depth, false);\n}\n","import restArguments from './restArguments.js';\nimport flatten from './_flatten.js';\nimport filter from './filter.js';\nimport contains from './contains.js';\n\n// Take the difference between one array and a number of other arrays.\n// Only the elements present in just the first array will remain.\nexport default restArguments(function(array, rest) {\n rest = flatten(rest, true, true);\n return filter(array, function(value){\n return !contains(rest, value);\n });\n});\n","import restArguments from './restArguments.js';\nimport difference from './difference.js';\n\n// Return a version of the array that does not contain the specified value(s).\nexport default restArguments(function(array, otherArrays) {\n return difference(array, otherArrays);\n});\n","import isBoolean from './isBoolean.js';\nimport cb from './_cb.js';\nimport getLength from './_getLength.js';\nimport contains from './contains.js';\n\n// Produce a duplicate-free version of the array. If the array has already\n// been sorted, you have the option of using a faster algorithm.\n// The faster algorithm will not work with an iteratee if the iteratee\n// is not a one-to-one function, so providing an iteratee will disable\n// the faster algorithm.\nexport default function uniq(array, isSorted, iteratee, context) {\n if (!isBoolean(isSorted)) {\n context = iteratee;\n iteratee = isSorted;\n isSorted = false;\n }\n if (iteratee != null) iteratee = cb(iteratee, context);\n var result = [];\n var seen = [];\n for (var i = 0, length = getLength(array); i < length; i++) {\n var value = array[i],\n computed = iteratee ? iteratee(value, i, array) : value;\n if (isSorted && !iteratee) {\n if (!i || seen !== computed) result.push(value);\n seen = computed;\n } else if (iteratee) {\n if (!contains(seen, computed)) {\n seen.push(computed);\n result.push(value);\n }\n } else if (!contains(result, value)) {\n result.push(value);\n }\n }\n return result;\n}\n","import restArguments from './restArguments.js';\nimport uniq from './uniq.js';\nimport flatten from './_flatten.js';\n\n// Produce an array that contains the union: each distinct element from all of\n// the passed-in arrays.\nexport default restArguments(function(arrays) {\n return uniq(flatten(arrays, true, true));\n});\n","import getLength from './_getLength.js';\nimport contains from './contains.js';\n\n// Produce an array that contains every item shared between all the\n// passed-in arrays.\nexport default function intersection(array) {\n var result = [];\n var argsLength = arguments.length;\n for (var i = 0, length = getLength(array); i < length; i++) {\n var item = array[i];\n if (contains(result, item)) continue;\n var j;\n for (j = 1; j < argsLength; j++) {\n if (!contains(arguments[j], item)) break;\n }\n if (j === argsLength) result.push(item);\n }\n return result;\n}\n","import max from './max.js';\nimport getLength from './_getLength.js';\nimport pluck from './pluck.js';\n\n// Complement of zip. Unzip accepts an array of arrays and groups\n// each array's elements on shared indices.\nexport default function unzip(array) {\n var length = (array && max(array, getLength).length) || 0;\n var result = Array(length);\n\n for (var index = 0; index < length; index++) {\n result[index] = pluck(array, index);\n }\n return result;\n}\n","import restArguments from './restArguments.js';\nimport unzip from './unzip.js';\n\n// Zip together multiple lists into a single array -- elements that share\n// an index go together.\nexport default restArguments(unzip);\n","import getLength from './_getLength.js';\n\n// Converts lists into objects. Pass either a single array of `[key, value]`\n// pairs, or two parallel arrays of the same length -- one of keys, and one of\n// the corresponding values. Passing by pairs is the reverse of `_.pairs`.\nexport default function object(list, values) {\n var result = {};\n for (var i = 0, length = getLength(list); i < length; i++) {\n if (values) {\n result[list[i]] = values[i];\n } else {\n result[list[i][0]] = list[i][1];\n }\n }\n return result;\n}\n","// Generate an integer Array containing an arithmetic progression. A port of\n// the native Python `range()` function. See\n// [the Python documentation](https://docs.python.org/library/functions.html#range).\nexport default function range(start, stop, step) {\n if (stop == null) {\n stop = start || 0;\n start = 0;\n }\n if (!step) {\n step = stop < start ? -1 : 1;\n }\n\n var length = Math.max(Math.ceil((stop - start) / step), 0);\n var range = Array(length);\n\n for (var idx = 0; idx < length; idx++, start += step) {\n range[idx] = start;\n }\n\n return range;\n}\n","import { slice } from './_setup.js';\n\n// Chunk a single array into multiple arrays, each containing `count` or fewer\n// items.\nexport default function chunk(array, count) {\n if (count == null || count < 1) return [];\n var result = [];\n var i = 0, length = array.length;\n while (i < length) {\n result.push(slice.call(array, i, i += count));\n }\n return result;\n}\n","import _ from './underscore.js';\n\n// Helper function to continue chaining intermediate results.\nexport default function chainResult(instance, obj) {\n return instance._chain ? _(obj).chain() : obj;\n}\n","import _ from './underscore.js';\nimport each from './each.js';\nimport functions from './functions.js';\nimport { push } from './_setup.js';\nimport chainResult from './_chainResult.js';\n\n// Add your own custom functions to the Underscore object.\nexport default function mixin(obj) {\n each(functions(obj), function(name) {\n var func = _[name] = obj[name];\n _.prototype[name] = function() {\n var args = [this._wrapped];\n push.apply(args, arguments);\n return chainResult(this, func.apply(_, args));\n };\n });\n return _;\n}\n","import _ from './underscore.js';\nimport each from './each.js';\nimport { ArrayProto } from './_setup.js';\nimport chainResult from './_chainResult.js';\n\n// Add all mutator `Array` functions to the wrapper.\neach(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n var method = ArrayProto[name];\n _.prototype[name] = function() {\n var obj = this._wrapped;\n if (obj != null) {\n method.apply(obj, arguments);\n if ((name === 'shift' || name === 'splice') && obj.length === 0) {\n delete obj[0];\n }\n }\n return chainResult(this, obj);\n };\n});\n\n// Add all accessor `Array` functions to the wrapper.\neach(['concat', 'join', 'slice'], function(name) {\n var method = ArrayProto[name];\n _.prototype[name] = function() {\n var obj = this._wrapped;\n if (obj != null) obj = method.apply(obj, arguments);\n return chainResult(this, obj);\n };\n});\n\nexport default _;\n","// Default Export\n// ==============\n// In this module, we mix our bundled exports into the `_` object and export\n// the result. This is analogous to setting `module.exports = _` in CommonJS.\n// Hence, this module is also the entry point of our UMD bundle and the package\n// entry point for CommonJS and AMD users. In other words, this is (the source\n// of) the module you are interfacing with when you do any of the following:\n//\n// ```js\n// // CommonJS\n// var _ = require('underscore');\n//\n// // AMD\n// define(['underscore'], function(_) {...});\n//\n// // UMD in the browser\n// // _ is available as a global variable\n// ```\nimport * as allExports from './index.js';\nimport { mixin } from './index.js';\n\n// Add all of the Underscore functions to the wrapper object.\nvar _ = mixin(allExports);\n// Legacy Node.js API.\n_._ = _;\n// Export the Underscore API.\nexport default _;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"\";","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// no jsonp function","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n__webpack_require__(5925);\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(3497);\n"],"names":["ArrayExt","Private","StringExt","chain","objects","object","empty","enumerate","start","value","filter","fn","index","find","findIndex","min","result","undefined","max","minmax","vmin","vmax","toArray","Array","from","toObject","key","each","every","some","map","range","stop","step","length","rangeLength","reduce","initial","it","Symbol","iterator","first","next","done","TypeError","accumulator","second","repeat","count","once","retro","topologicSort","edges","sorted","visited","Set","graph","Map","edge","addEdge","k","visit","fromNode","toNode","children","get","push","set","node","has","add","child","stride","take","item","zip","iters","obj","tuple","firstIndexOf","array","span","n","Math","i","j","lastIndexOf","findFirstIndex","findLastIndex","d","reverse","a","b","removeAt","findFirstValue","findLastValue","lowerBound","begin","half","middle","upperBound","shallowEqual","slice","options","Error","floor","move","fromIndex","toIndex","rotate","delta","pivot","fill","insert","removeFirstOf","removeLastOf","removeAllOf","removeFirstWhere","removeLastWhere","removeAllWhere","Infinity","ceil","findIndices","source","query","indices","indexOf","matchSumOfSquares","score","matchSumOfDeltas","last","highlight","cmp","exports","algorithm","JSONExt","isPrimitive","isArray","deepEqual","a1","a2","deepArrayEqual","firstValue","secondValue","deepObjectEqual","deepCopy","deepArrayCopy","subvalue","deepObjectCopy","emptyObject","Object","freeze","emptyArray","isObject","PluginData","constructor","plugin","_a","_b","_c","_d","this","_activated","_promise","_service","id","description","activate","deactivate","provides","autoStart","requires","optional","activated","service","s","promise","p","createPluginData","ensureNoCycle","plugins","services","dependencies","token","trace","pop","ReferenceError","join","findDependents","acc","dep","keys","newEdges","oldSize","previousSize","packagesOfInterest","poi","forEach","includes","candidate","collectStartupPlugins","collection","startPlugins","ignorePlugins","delete","fallbackRandomValues","buffer","random","Random","getRandomValues","crypto","window","msCrypto","UUID","uuid4","bytes","Uint8Array","lut","toString","uuid4Factory","MimeData","_types","_values","types","hasData","mime","getData","setData","data","clearData","splice","clear","PluginRegistry","_application","_validatePlugin","_plugins","_services","validatePlugin","console","info","application","v","deferredPlugins","getPluginDescription","hasPlugin","isPluginActivated","listPlugins","registerPlugin","registerPlugins","deregisterPlugin","force","activatePlugin","required","t","resolveRequiredService","resolveOptionalService","Promise","all","then","apply","catch","error","activatePlugins","kind","promises","pluginId","async","deactivatePlugin","manifest","downstream","name","reason","PromiseDelegate","resolve","reject","_resolve","_reject","Token","_tokenStructuralPropertyT","factory","ClipboardExt","ElementExt","Platform","Selector","copyText","text","body","document","handler","event","preventDefault","stopPropagation","clipboardData","removeEventListener","addEventListener","execCommand","boxSizing","element","style","getComputedStyle","bt","parseFloat","borderTopWidth","bl","borderLeftWidth","br","borderRightWidth","bb","borderBottomWidth","pt","paddingTop","pl","paddingLeft","pr","paddingRight","pb","paddingBottom","borderTop","borderLeft","borderRight","borderBottom","horizontalSum","verticalSum","sizeLimits","minWidth","minHeight","maxWidth","maxHeight","hitTest","clientX","clientY","rect","getBoundingClientRect","left","right","top","bottom","scrollIntoViewIfNeeded","area","ar","er","height","scrollTop","IS_MAC","navigator","platform","match","IS_WIN","IS_IE","test","userAgent","IS_EDGE","accelKey","metaKey","ctrlKey","calculateSpecificity","selector","specificityCache","calculateSingle","isValid","validityCache","testElem","querySelector","err","matches","protoMatchFunc","call","create","createElement","proto","Element","prototype","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","elem","ownerDocument","querySelectorAll","c","re","split","replace","NEGATION_RE","ID_RE","CLASS_RE","ATTR_RE","PSEUDO_ELEM_RE","PSEDUO_CLASS_RE","TYPE_RE","IGNORE_RE","MessageLoop","LinkedList","_first","_last","_size","isEmpty","size","firstNode","lastNode","prev","nodes","retroNodes","assign","values","addLast","removeLast","shift","addFirst","unshift","removeFirst","LinkedListNode","insertBefore","ref","list","_ref","insertAfter","removeNode","_node","Message","type","isConflatable","conflate","other","ConflatableMessage","pending","schedule","resolved","rejected","sendMessage","msg","hooks","messageHooks","invokeHandler","passed","hook","messageHook","exceptionHandler","invokeHook","postMessage","messageQueue","posted","enqueueMessage","installMessageHook","removeMessageHook","scheduleCleanup","flush","flushGuard","runMessageLoop","getExceptionHandler","setExceptionHandler","old","WeakMap","dirtySet","processMessage","sentinel","cleanupDirtySet","cleanupHooks","isNull","Signal","sender","connect","slot","thisArg","disconnect","emit","args","disconnectBetween","receiver","disconnectSender","disconnectReceiver","disconnectAll","asyncIterator","receivers","receiversForSender","connection","signal","sendersForReceiver","senders","findConnection","invokeSlot","requestAnimationFrame","setImmediate","connections","cleanupConnections","isDeadConnection","AttachedProperty","_pid","nextPID","_create","_coerce","coerce","_compare","compare","_changed","changed","owner","ensureMap","_createValue","oldValue","newValue","_coerceValue","_maybeNotify","_compareValue","ownerData","DisposableDelegate","_fn","isDisposed","dispose","DisposableSet","_isDisposed","_items","contains","remove","items","ObservableDisposableSet","super","arguments","_disposed","disposed","Drag","_onScrollFrame","_scrollTarget","distance","SCROLL_EDGE_SIZE","f","pow","round","scrollLeft","_dropAction","_override","_currentTarget","_currentElement","mimeData","dragImage","proposedAction","supportedActions","PointerEvent","bubbles","cancelable","dispatchDragLeave","_finalize","_addListeners","_attachDragImage","dispatchEvent","handleEvent","_evtPointerMove","_evtPointerUp","_evtKeyDown","moveDragImage","transform","_updateCurrentTarget","_updateDragScroll","button","action","dispatchDrop","keyCode","_removeListeners","target","findScrollTarget","setTimeout","prevTarget","currTarget","prevElem","currElem","findElementBehindBackdrop","dispatchDragExit","dispatchDragEnter","dispatchDragOver","_setDropAction","classList","pointerEvents","position","Document","firstElementChild","appendChild","_detachDragImage","parent","parentNode","removeChild","validateAction","overrideCursor","getKeyboardLayout","keyboardLayout","Event","DragEvent","altKey","detail","relatedTarget","related","screenX","screenY","shiftKey","view","drag","dropAction","cursor","doc","root","lastElementEventSearch","cursorBackdrop","zIndex","elementFromPoint","lastElementSearch","bbox","width","supported","actionTable","supportedTable","x","y","parentElement","hasAttribute","offsetX","offsetY","pageXOffset","pageYOffset","r","dl","dt","dr","db","shouldScroll","dsw","scrollWidth","clientWidth","dsh","scrollHeight","clientHeight","dragEvent","none","copy","link","alignBackdrop","propagateBackdropScroll","_event","scrollTarget","closest","backdropScrollOrigin","resetBackdropScroll","overrideCursorID","isConnected","capture","passive","backdrop","createCursorBackdrop","KeycodeLayout","codes","modifierKeys","_codes","_keys","extractKeys","_modifierKeys","convertToKeySet","isValidKey","isModifierKey","keyForKeydownEvent","keySet","EN_US","VirtualDOM","BoxEngine","Private$j","Private$i","Utils","CommandRegistry","_timerID","_timerModifierID","_replaying","_keystrokes","_keydownEvents","_keyBindings","_exactKeyMatch","_commands","_commandChanged","_commandExecuted","_keyBindingChanged","_holdKeyBindingPromises","commandChanged","commandExecuted","keyBindingChanged","keyBindings","listCommands","hasCommand","addCommand","createCommand","notifyCommandChanged","describedBy","cmd","label","mnemonic","icon","iconClass","iconLabel","caption","usage","className","dataset","isEnabled","isToggled","isToggleable","isVisible","execute","addKeyBinding","binding","createKeyBinding","processKeydownEvent","defaultPrevented","keystroke","keystrokeForKeydownEvent","_replayKeydownEvents","_clearPendingState","isModifierKeyPressed","exact","matchKeyBinding","_startModifierTimer","_clearModifierTimer","partial","hasPartial","_executeKeyBinding","_startTimer","holdKeyBindingExecution","permission","processKeyupEvent","modifierkeyTimeOut","clearTimeout","_clearTimer","_onPendingTimeout","CHORD_TIMEOUT","replayKeyEvent","keydownEvents","executionAllowed","race","KEYBINDING_HOLD_TIMEOUT","Boolean","command","newArgs","_luminoEvent","word","msg1","msg2","warn","parseKeystroke","alt","ctrl","normalizeKeystroke","mods","parts","trim","normalizeKeys","winKeys","macKeys","linuxKeys","formatKeystroke","formatSingleKey","separator","formatKey","layout","asFunc","emptyStringFunc","negativeOneFunc","undefinedFunc","emptyDatasetFunc","trueFunc","falseFunc","validateSelector","bindings","specificity","sqm","matchSequence","targetDistance","td","sp","clone","createEvent","initEvent","which","cloneKeyboardEvent","MAC_DISPLAY","hasOwnProperty","WIN_DISPLAY","Backspace","Tab","Enter","Shift","Ctrl","Alt","Escape","PageUp","PageDown","End","Home","ArrowLeft","ArrowUp","ArrowRight","ArrowDown","Delete","Cmd","dfault","bindKeys","userKeys","targ","curr","currentTarget","dist","VirtualText","content","VirtualElement","tag","attrs","renderer","h","arg","extend","bind","abbr","address","article","aside","audio","bdi","bdo","blockquote","canvas","cite","code","col","colgroup","datalist","dd","del","dfn","div","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hr","iframe","img","input","ins","kbd","legend","li","main","mark","meter","nav","noscript","ol","optgroup","option","output","param","pre","progress","q","rp","rt","ruby","samp","section","select","small","strong","sub","summary","sup","table","tbody","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var_","video","wbr","realize","createDOMNode","render","host","oldContent","hostMap","newContent","asContentArray","updateContent","before","createTextNode","specialAttrs","substr","setAttribute","htmlFor","addDataset","elemStyle","addStyle","addAttrs","removeContent","newCount","_sentinel","oldNode","lastChild","childNodes","unrender","oldKeyed","firstChild","keyMap","vNode","nextSibling","collectKeys","oldCopy","oldVNode","newVNode","textContent","newKey","pair","oldKey","updateAttrs","oldAttrs","newAttrs","removeAttribute","oldDataset","newDataset","updateDataset","oldStyle","newStyle","updateStyle","BoxSizer","sizeHint","minSize","maxSize","stretch","calc","sizers","space","totalMin","totalMax","totalSize","totalStretch","stretchCount","sizer","hint","nearZero","notDoneCount","freeSpace","distSpace","distStretch","amt","adjust","growLimit","shrinkLimit","grow","limit","shrink","growSizer","shrinkSizer","Title","_label","_caption","_mnemonic","_icon","_iconClass","_iconLabel","_className","_closable","closable","_dataset","Widget","_flags","_layout","_parent","_hiddenMode","HiddenMode","Display","createNode","addClass","setFlag","Flag","IsDisposed","isAttached","detach","testFlag","IsAttached","isHidden","IsHidden","IsVisible","titleProperty","hiddenMode","_toggleHidden","Scale","willChange","ChildMessage","Msg","ParentChanged","DisallowLayout","widget","hasClass","removeClass","toggleClass","toggle","update","UpdateRequest","fit","FitRequest","ActivateRequest","close","CloseRequest","show","BeforeShow","clearFlag","AfterShow","hide","BeforeHide","AfterHide","setHidden","hidden","flag","notifyLayout","onResize","onUpdateRequest","onFitRequest","onBeforeShow","onAfterShow","onBeforeHide","onAfterHide","onBeforeAttach","onAfterAttach","onBeforeDetach","onAfterDetach","onActivateRequest","onCloseRequest","onChildAdded","onChildRemoved","processParentMessage","ContentVisibility","contentVisibility","BeforeAttach","AfterAttach","BeforeDetach","AfterDetach","ResizeMessage","UnknownSize","attach","Layout","_fitPolicy","fitPolicy","init","onChildShown","onChildHidden","removeWidget","getHorizontalAlignment","horizontalAlignmentProperty","setHorizontalAlignment","getVerticalAlignment","verticalAlignmentProperty","setVerticalAlignment","LayoutItem","_top","NaN","_left","_width","_height","_minWidth","_minHeight","_maxWidth","_maxHeight","contain","limits","clampW","clampH","resized","onAlignmentChanged","PanelLayout","_widgets","widgets","addWidget","insertWidget","attachWidget","moveWidget","removeWidgetAt","detachWidget","clampDimension","Private$h","Private$g","Private$f","Private$e","Private$d","Private$c","Private$b","Private$a","Private$9","Private$8","Utils$1","SplitLayout","widgetOffset","_fixed","_spacing","_dirty","_hasNormedSizes","_sizers","_handles","_box","_alignment","_orientation","orientation","alignment","spacing","handles","absoluteSizes","relativeSizes","normalize","setRelativeSizes","sizes","temp","normed","moveHandle","handle","offsetLeft","offsetTop","createHandle","average","averageSize","createSizer","_update","_fit","updateItemPosition","isHorizontal","handleStyle","nVisible","lastHandleIndex","horz","minW","minH","getStretch","box","offsetWidth","offsetHeight","extra","offset","fullOffset","stretchProperty","setStretch","sum","abs","AccordionLayout","_titles","titleSpace","titles","updateTitle","oldTitle","expanded","newTitle","createTitle","replaceChild","titleStyle","createSectionTitle","Panel","createLayout","SplitPanel","_handleMoved","_pressData","_releaseMouse","handleMoved","_evtPointerDown","override","pos","Renderer","defaultRenderer","AccordionPanel","_widgetSizesCache","_expansionToggled","expansionToggled","_onTitleChanged","collapse","_toggleExpansion","expand","_evtClick","_eventKeyDown","_computeWidgetSize","widgetSizes","newSize","widgetToCollapse","sz","_","idx","currentSize","handled","click","direction","newIndex","focus","titleClassName","_titleID","_titleKeys","_uuid","_nInstance","createCollapseIcon","createTitleKey","aData","BoxLayout","_direction","getSizeBasis","sizeBasisProperty","setSizeBasis","onChildSizingChanged","dir","clampSpacing","BoxPanel","CommandPalette","_activeIndex","_results","commands","_onGenericChange","searchNode","getElementsByClassName","inputNode","contentNode","addItem","createItem","refresh","addItems","newItems","removeItem","removeItemAt","clearItems","display","_toggleFocused","results","search","canActivate","renderEmptyMessage","activeIndex","category","renderHeader","active","renderItem","_execute","_activatePreviousItem","_activateNextItem","ai","part","toLowerCase","focused","activeElement","formatHeader","createItemClass","createItemDataset","role","renderItemIcon","renderItemContent","renderItemShortcut","formatEmptyMessage","createIconClass","renderItemLabel","renderItemCaption","formatItemLabel","formatItemCaption","formatItemShortcut","kb","keyBinding","fuzzySearch","rgx","rgxMatch","exec","categoryIndices","labelIndices","matchType","scoreCmp","m1","d1","i1","i2","d2","localeCompare","r1","rank","r2","wrapper","spellcheck","CommandItem","scores","matchItems","sort","createResults","Menu","_childIndex","_openTimerID","_closeTimerID","_childMenu","_parentMenu","_aboutToClose","_menuRequested","aboutToClose","menuRequested","parentMenu","childMenu","rootMenu","menu","leafMenu","activeItem","activateNextItem","activatePreviousItem","triggerActiveItem","_cancelOpenTimer","_cancelCloseTimer","_openChildMenu","log","insertItem","open","forceX","forceY","openRootMenu","_evtMouseUp","_evtMouseMove","_evtMouseEnter","_evtMouseLeave","_evtMouseDown","collapsedFlags","computeCollapsed","collapsed","onfocus","kc","findMnemonic","multiple","auto","_startCloseTimer","submenu","_startOpenTimer","hitTestMenus","activateFirst","_closeChildMenu","saveWindowData","itemNode","openSubmenu","TIMER_DELAY","aria","createItemARIA","tabindex","renderIcon","renderLabel","renderShortcut","renderSubmenu","formatLabel","formatShortcut","prefix","suffix","char","SUBMENU_OVERLAP","transientWindowDataCache","transientCacheCounter","getWindowData","_getWindowData","documentElement","tabIndex","MenuItem","k1","k2","windowData","px","py","cw","ch","opacity","itemRect","upperKey","toUpperCase","mn","ContextMenu","_groupByTarget","_idTick","_sortBySelector","groupByTarget","sortBySelector","others","itemCmpRank","itemCmp","s1","s2","availableItems","ARROW_KEYS","TabBar","Private$7","_currentIndex","_titlesEditable","_previousTitle","_dragData","_addButtonEnabled","_tabMoved","_currentChanged","_addRequested","_tabCloseRequested","_tabDetachRequested","_tabActivateRequested","_document","tabsMovable","titlesEditable","allowDeselect","addButtonEnabled","insertBehavior","removeBehavior","currentChanged","tabMoved","tabActivateRequested","addRequested","tabCloseRequested","tabDetachRequested","currentTitle","currentIndex","pi","ci","ct","previousIndex","previousTitle","_name","addButtonNode","addTab","insertTab","asTitle","_adjustCurrentForInsert","_adjustCurrentForMove","removeTab","removeTabAt","_adjustCurrentForRemove","clearTabs","releaseMouse","_evtDblClick","eventPhase","CAPTURING_PHASE","_evtKeyDownCapturing","tabHandlingTabindex","_getCurrentTabindex","current","renderTab","elemTabindex","getAttribute","tabs","tab","innerHTML","onblur","focusedElement","focusable","nextFocused","focusedIndex","addButtonClicked","pressX","pressY","tabPos","tabSize","tabPressPos","targetIndex","tabLayout","contentRect","dragActive","dragAborted","detachRequested","closeIconSelector","dragExceeded","tabRect","tabPressOffset","snapTabLayout","detachExceeded","layoutTabs","finalizeTabPosition","duration","parseTransitionDuration","resetTabPositions","bh","Private$6","Private$5","Private$4","Private$3","Private$2","Private$1","_tabID","_tabKeys","createTabKey","createTabStyle","createTabClass","createTabDataset","createTabARIA","renderCloseIcon","addButtonSelector","DRAG_THRESHOLD","DETACH_THRESHOLD","transitionDuration","margin","marginLeft","marginTop","dx","dy","pressPos","localPos","clientPos","clientSize","targetPos","targetEnd","pxPos","threshold","ideal","tgt","final","DockLayout","_root","bar","tabBars","iterAllWidgets","iterUserWidgets","selectedWidgets","iterSelectedWidgets","iterTabBars","iterHandles","findSplitNode","holdSizes","saveLayout","holdAllSizes","createConfig","restoreLayout","config","mainConfig","widgetSet","normalizeAreaConfig","oldWidgets","oldTabBars","oldHandles","tabBar","realizeAreaConfig","createTabBar","_createTabBar","_createHandle","mode","refNode","findTabNode","_insertTab","_insertSplit","_removeWidget","hitTestTabAreas","tabNode","hitTestTabNodes","borderWidth","borderHeight","removeAria","splitNode","syncHandles","maybeParent","childNode","childHandle","TabLayoutNode","splitHandle","gChild","gHandle","gSizer","_createTabNode","addAria","after","findFirstTabNode","merge","_splitRoot","normalizeSizes","GOLDEN_RATIO","sibling","SplitLayoutNode","normalized","oldRoot","newRoot","normalizeTabAreaConfig","normalizeSplitAreaConfig","realizeTabAreaConfig","realizeSplitAreaConfig","tabSizer","widgetSizer","tabBarItem","widgetItem","tabBarSizer","createNormalizedSizes","horizontal","fixed","tabId","DockPanel","_drag","_tabsMovable","_tabsConstrained","_layoutModified","_mode","_renderer","_edges","DEFAULT_EDGES","tabsConstrained","overlay","Overlay","layoutModified","createSingleDocumentConfig","LayoutModified","selectWidget","activateWidget","_evtDragEnter","_evtDragLeave","_evtDragOver","_evtDrop","isGeneratedTabBarProperty","_showOverlay","zone","findDropTarget","getDropRef","deltaX","deltaY","xPos","yPos","tabHeight","_onTabMoved","_onCurrentChanged","_onTabCloseRequested","_onTabDetachRequested","_onTabActivateRequested","_onTabAddRequested","cloneNode","_timer","_hidden","geo","delay","panel","selected","panelRect","al","at","ab","rx","ry","FocusTracker","_counter","_activeWidget","_currentWidget","_numbers","_nodes","_activeChanged","activeChanged","currentWidget","activeWidget","focusNumber","_onWidgetDisposed","_setWidgets","valid","w","previous","_evtFocus","_evtBlur","oldCurrent","oldActive","focusTarget","GridLayout","_rowSpacing","_columnSpacing","_rowStarts","_columnStarts","_rowSizers","_columnSizers","rowCount","reallocSizers","columnCount","rowSpacing","clampValue","columnSpacing","rowStretch","setRowStretch","columnStretch","setColumnStretch","maxRow","maxCol","rowSpanCmp","getCellConfig","row","rowSpan","distributeMin","columnSpanCmp","c1","column","c2","columnSpan","fixedRowSpace","fixedColSpace","cellConfigProperty","setCellConfig","normalizeConfig","portion","MenuBar","_tabFocusIndex","_menus","_overflowMenu","_menuItemSizes","_overflowIndex","_forceItemsPosition","forceItemsPosition","_overflowMenuOptions","overflowMenuOptions","overflowIndex","overflowMenu","activeMenu","menus","openActiveMenu","addMenu","insertMenu","_onMenuAboutToClose","_onMenuMenuRequested","removeMenu","removeMenuAt","clearMenus","_evtFocusOut","_focusItemAt","tabFocusIndex","totalMenuSize","tabbable","disabled","overflowMenuTitle","overflowMenuItems","screenSize","_updateOverflowIndex","itemMenus","stopImmediatePropagation","_positionForMenu","newMenu","oldMenu","ScrollBar","_onRepeat","_repeatTimer","mouseX","mouseY","trackNode","thumbNode","thumbRect","_pageRequested","incrementNode","_stepRequested","decrementNode","_value","_page","_maximum","_thumbMoved","maximum","page","thumbMoved","stepRequested","pageRequested","thumbStyle","_moveThumb","findPart","trackPos","trackSpan","trackRect","decrement","increment","thumb","scrollBar","SingletonLayout","_widget","StackedLayout","StackedPanel","_widgetRemoved","widgetRemoved","TabPanel","stackedPanel","_onWidgetRemoved","_tabPlacement","tabPlacement","directionFromPlacement","orientationFromPlacement","previousWidget","plc","placementToOrientationMap","placementToDirectionMap","self","g","global","$","Backbone","previousBackbone","VERSION","noConflict","emulateHTTP","emulateJSON","_listening","Events","eventSplitter","eventsApi","iteratee","events","callback","opts","names","context","on","_events","onApi","ctx","listening","_listeners","interop","listenTo","_listenId","uniqueId","listeningTo","_listeningTo","Listening","tryCatchOn","handlers","e","off","offApi","listeners","stopListening","ids","remaining","_callback","cleanup","onceMap","listenToOnce","offer","trigger","triggerApi","objEvents","allEvents","triggerEvents","concat","ev","l","a3","listener","unbind","Model","attributes","preinitialize","cid","cidPrefix","parse","defaults","initialize","validationError","idAttribute","toJSON","sync","attr","escape","val","_validate","unset","silent","changes","changing","_changing","_previousAttributes","isEqual","_pending","hasChanged","changedAttributes","diff","previousAttributes","fetch","model","success","resp","serverAttrs","wrapError","save","wait","validate","method","isNew","patch","xhr","destroy","defer","url","base","urlError","encodeURIComponent","Collection","models","comparator","_reset","reset","setOptions","addOptions","tail","singular","removed","_removeModels","added","merged","_isModel","toAdd","toMerge","toRemove","modelMap","sortable","sortAttr","isString","existing","_prepareModel","_addReference","orderChanged","m","_removeReference","previousModels","_byId","modelId","where","findWhere","isFunction","sortBy","pluck","callbackOpts","CollectionIterator","ITERATOR_VALUES","ITERATOR_KEYS","entries","ITERATOR_KEYSVALUES","_onModelEvent","prevId","$$iterator","_collection","_kind","_index","View","pick","viewOptions","_ensureElement","delegateEventSplitter","tagName","$el","_removeElement","setElement","undelegateEvents","_setElement","delegateEvents","el","delegate","eventName","undelegate","_createElement","_setAttributes","addUnderscoreMethods","Class","methods","attribute","cb","defaultVal","addMethod","instance","modelMatcher","matcher","collect","foldl","inject","reduceRight","foldr","detect","any","include","invoke","head","rest","drop","without","difference","shuffle","sample","partition","groupBy","countBy","indexBy","pairs","invert","omit","Base","mixin","mappings","functions","memo","methodMap","params","dataType","contentType","JSON","stringify","_method","beforeSend","setRequestHeader","processData","textStatus","errorThrown","ajax","read","Router","routes","_bindRoutes","optionalParam","namedParam","splatParam","escapeRegExp","route","isRegExp","_routeToRegExp","router","history","fragment","_extractParameters","navigate","RegExp","decodeURIComponent","History","checkUrl","location","routeStripper","rootStripper","pathStripper","started","interval","atRoot","pathname","getSearch","matchRoot","decodeFragment","decodeURI","href","getHash","getPath","path","charAt","getFragment","_usePushState","_wantsHashChange","hashChange","_hasHashChange","documentMode","_useHashChange","_wantsPushState","pushState","_hasPushState","rootPath","src","iWindow","contentWindow","hash","attachEvent","_checkUrlInterval","setInterval","loadUrl","detachEvent","clearInterval","decodedFragment","_updateHash","protoProps","staticProps","__super__","b64","tmp","lens","len","validLen","getLens","placeHoldersLen","arr","Arr","_byteLength","curByte","revLookup","charCodeAt","uint8","extraBytes","maxChunkLength","len2","encodeChunk","lookup","end","num","___CSS_LOADER_EXPORT___","module","___CSS_LOADER_URL_IMPORT_0___","URL","___CSS_LOADER_URL_REPLACEMENT_0___","cssWithMappingToString","needLayer","modules","media","dedupe","supports","layer","alreadyImportedModules","_k","String","__esModule","default","needQuotes","cssMapping","btoa","base64","unescape","sourceMapping","isMergeableObject","isNonNullObject","stringValue","$$typeof","REACT_ELEMENT_TYPE","isReactElement","isSpecial","for","cloneUnlessOtherwiseSpecified","deepmerge","defaultArrayMerge","getKeys","getOwnPropertySymbols","symbol","propertyIsEnumerable","getEnumerableOwnPropertySymbols","propertyIsOnObject","property","arrayMerge","sourceIsArray","destination","propertyIsUnsafe","customMerge","getMergeFunction","mergeObject","deepmerge_1","defineProperty","attributeNames","elementNames","__assign","__createBinding","o","desc","getOwnPropertyDescriptor","writable","configurable","enumerable","__setModuleDefault","__importStar","mod","ElementType","entities_1","foreignNames_js_1","unencodedElements","replaceQuotes","singleTag","renderNode","Root","Doctype","Directive","Comment","CDATA","renderCdata","Script","Style","Tag","xmlMode","foreignModeIntegrationPoints","foreignElements","attribs","encode","encodeEntities","decodeEntities","encodeXML","escapeAttribute","emptyAttrs","formatAttributes","selfClosingTags","renderTag","Text","escapeText","renderText","isTag","__exportStar","DomHandler","domelementtype_1","node_js_1","defaultOpts","withStartIndices","withEndIndices","elementCB","dom","tagStack","parser","onparserinit","onreset","onend","handleCallback","onerror","onclosetag","endIndex","onopentag","addNode","ontext","oncomment","oncommentend","oncdatastart","oncdataend","onprocessinginstruction","ProcessingInstruction","previousSibling","startIndex","extendStatics","__extends","setPrototypeOf","__proto__","__","hasChildren","isDocument","isDirective","isComment","isText","isCDATA","NodeWithChildren","DataNode","Node","recursive","_super","_this","namespace","cloneChildren","clone_1","clone_2","clone_3","instruction","sourceCodeLocation","childs","getFeed","stringify_js_1","legacy_js_1","feedRoot","getOneElement","isValidFeed","feed","getElementsByTagName","entry","getMediaElements","addConditionally","pubDate","Date","updated","getAtomFeed","getRssFeed","MEDIA_KEYS_STRING","MEDIA_KEYS_INT","medium","isDefault","_i","MEDIA_KEYS_STRING_1","attrib","MEDIA_KEYS_INT_1","parseInt","expression","recurse","prop","uniqueSort","compareDocumentPosition","DocumentPosition","removeSubsets","domhandler_1","nodeA","nodeB","aParents","bParents","maxIdx","DISCONNECTED","sharedParent","siblings","aSibling","bSibling","FOLLOWING","CONTAINED_BY","PRECEDING","CONTAINS","ancestor","relative","getElementsByTagType","getElementById","getElements","testElement","querying_js_1","Checks","tag_name","tag_type","tag_contains","getAttribCheck","combineFuncs","compileTest","funcs","findOne","removeElement","childsIndex","prepend","prependChild","append","replaceElement","replacement","currNext","findAll","existsOne","findOneChild","nodeStack","indexStack","checked","__importDefault","innerText","getText","getInnerHTML","getOuterHTML","dom_serializer_1","prevElementSibling","nextElementSibling","getName","hasAttrib","getAttributeValue","getSiblings","getParent","getChildren","decodeXML","decodeHTMLStrict","decodeHTMLAttribute","decodeHTML","determineBranch","EntityDecoder","DecodingMode","BinTrieFlags","fromCodePoint","replaceCodePoint","decodeCodePoint","xmlDecodeTree","htmlDecodeTree","decode_data_html_js_1","decode_data_xml_js_1","decode_codepoint_js_1","CharCodes","EntityDecoderState","decode_codepoint_js_2","isNumber","ZERO","NINE","decodeTree","emitCodePoint","errors","state","EntityStart","consumed","treeIndex","excess","decodeMode","Strict","startEntity","write","str","NUM","NumericStart","stateNumericStart","NamedEntity","stateNamedEntity","NumericDecimal","stateNumericDecimal","NumericHex","stateNumericHex","LOWER_X","addToNumericResult","digitCount","startIdx","UPPER_A","UPPER_F","LOWER_A","LOWER_F","emitNumericEntity","lastCp","expectedLength","absenceOfDigitsInNumericCharacterReference","SEMI","missingSemicolonAfterCharacterReference","validateNumericCharacterReference","valueLength","VALUE_LENGTH","Attribute","EQUALS","UPPER_Z","LOWER_Z","isAsciiAlphaNumeric","emitNotTerminatedNamedEntity","emitNamedEntityData","getDecoder","ret","decoder","lastIndex","nodeIdx","branchCount","BRANCH_LENGTH","jumpOffset","JUMP_TABLE","lo","hi","mid","midVal","htmlDecoder","xmlDecoder","Legacy","decodeMap","codePoint","fromCharCode","encodeNonAsciiHTML","encodeHTML","encode_html_js_1","escape_js_1","htmlReplacer","encodeHTMLTrieRe","regExp","lastIdx","substring","nextChar","cp","getCodePoint","Number","xmlReplacer","escapeUTF8","xmlCodeMap","getEscaper","regex","codePointAt","Uint16Array","restoreDiff","decodeXMLStrict","decodeHTML5Strict","decodeHTML4Strict","decodeHTML5","decodeHTML4","encodeHTML5","encodeHTML4","decodeStrict","decode","EncodingMode","EntityLevel","decode_js_1","encode_js_1","XML","level","HTML","UTF8","ASCII","escape_js_2","encode_js_2","decode_js_2","string","Parser","Tokenizer_js_1","formTags","pTag","tableSectionTags","ddtTags","rtpTags","openImpliesClose","voidElements","foreignContextElements","htmlIntegrationElements","reNameEnd","cbs","_e","openTagStart","tagname","attribname","attribvalue","stack","foreignContext","buffers","bufferOffset","writeIndex","ended","lowerCaseTagNames","lowerCaseTags","lowerCaseAttributeNames","tokenizer","Tokenizer","getSlice","ontextentity","getSectionStart","isVoidElement","onopentagname","emitOpenTag","impliesClose","endOpenTag","isImplied","onopentagend","_f","closeCurrentTag","onselfclosingtag","recognizeSelfClosing","isOpenImplied","onattribname","onattribdata","onattribentity","onattribend","quote","onattribute","QuoteType","Double","Single","NoValue","getInstructionName","ondeclaration","oncdata","_g","_h","_j","recognizeCDATA","parseComplete","shiftBuffer","chunk","running","pause","resume","parseChunk","State","isWhitespace","Space","NewLine","FormFeed","CarriageReturn","isEndOfTagSection","Slash","Gt","Zero","Nine","Sequences","Cdata","CdataEnd","CommentEnd","ScriptEnd","StyleEnd","TitleEnd","sectionStart","baseState","currentSequence","sequenceIndex","trieIndex","trieCurrent","entityResult","entityExcess","entityTrie","finish","getIndex","stateText","Lt","fastForwardTo","BeforeTagName","Amp","BeforeEntity","stateSpecialStartSequence","isEnd","InTagName","stateInTagName","stateInSpecialTag","endOfText","actualIndex","stateInClosingTagName","stateCDATASequence","InCommentLike","InDeclaration","stateInDeclaration","stateInCommentLike","isTagStartChar","LowerA","LowerZ","UpperA","UpperZ","isASCIIAlpha","startSpecial","sequence","SpecialStartSequence","stateBeforeTagName","ExclamationMark","BeforeDeclaration","Questionmark","InProcessingInstruction","lower","BeforeSpecialS","BeforeClosingTagName","BeforeAttributeName","stateBeforeAttributeName","stateBeforeClosingTagName","InClosingTagName","InSpecialComment","AfterClosingTagName","stateAfterClosingTagName","InSpecialTag","InSelfClosingTag","InAttributeName","stateInSelfClosingTag","stateInAttributeName","Eq","AfterAttributeName","stateAfterAttributeName","BeforeAttributeValue","stateBeforeAttributeValue","DoubleQuote","InAttributeValueDq","SingleQuote","InAttributeValueSq","InAttributeValueNq","stateInAttributeValueNoQuotes","handleInAttributeValue","stateInAttributeValueDoubleQuotes","stateInAttributeValueSingleQuotes","Unquoted","stateBeforeDeclaration","OpeningSquareBracket","CDATASequence","Dash","BeforeComment","stateInProcessingInstruction","stateBeforeComment","stateInSpecialComment","stateBeforeSpecialS","stateBeforeEntity","BeforeNumericEntity","InNamedEntity","stateInNamedEntity","emitNamedEntity","masked","allowLegacyEntity","Semi","entityStart","emitPartial","stateBeforeNumericEntity","LowerX","InHexEntity","InNumericEntity","stateInNumericEntity","strict","stateInHexEntity","UpperF","LowerF","isHexDigit","shouldContinue","handleTrailingData","DomUtils","parseFeed","createDomStream","parseDOM","parseDocument","DefaultHandler","Parser_js_1","Parser_js_2","domhandler_2","elementCallback","domutils_1","domutils_2","parseFeedDefaultOptions","isPlainObject","ctor","prot","noGlobal","getProto","getPrototypeOf","flat","class2type","hasOwn","fnToString","ObjectFunctionString","support","nodeType","isWindow","preservedScriptAttributes","nonce","noModule","DOMEval","script","toType","version","rhtmlSuffix","jQuery","isArrayLike","nodeName","jquery","pushStack","elems","prevObject","eq","even","grep","_elem","odd","copyIsArray","deep","expando","isReady","noop","Ctor","isEmptyObject","globalEval","nodeValue","makeArray","inArray","isXMLDoc","namespaceURI","docElem","callbackExpect","guid","whitespace","rtrimCSS","bup","rcssescape","fcssescape","asCodePoint","escapeSelector","sel","preferredDoc","pushNative","Expr","outermostContext","sortInput","hasDuplicate","documentIsHTML","rbuggyQSA","dirruns","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","booleans","identifier","pseudos","rwhitespace","rcomma","rleadingCombinator","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rquickExpr","rsibling","runescape","funescape","nonHex","high","unloadHandler","setDocument","inDisabledFieldset","addCombinator","els","seed","nid","groups","newSelector","newContext","testContext","scope","tokenize","toSelector","qsaError","cache","cacheLength","markFunction","assert","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","subWindow","defaultView","getById","getElementsByName","disconnectedMatch","cssHas","attrId","getAttributeNode","sortDetached","expr","elements","attrHandle","duplicates","sortStable","createPseudo","preFilter","unquoted","nodeNameSelector","expectedNodeName","pattern","operator","check","what","_argument","simple","forward","ofType","_context","xml","outerCache","nodeIndex","useCache","pseudo","setFilters","matched","not","compile","unmatched","lang","elemLang","safeActiveElement","hasFocus","enabled","selectedIndex","_matchIndexes","lt","gt","nth","radio","checkbox","file","password","image","submit","parseOnly","tokens","soFar","preFilters","cached","combinator","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","matcherOut","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","setMatchers","elementMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","matcherFromGroupMatchers","compiled","filters","unique","isXML","selectors","until","truncate","is","rneedsContext","rsingleTag","winnow","qualifier","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","contents","cur","targets","prevAll","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","rnothtmlwhite","Identity","Thrower","ex","adoptValue","noValue","fail","Callbacks","createOptions","firing","memory","fired","locked","queue","firingIndex","fire","stopOnFalse","disable","lock","fireWith","Deferred","func","tuples","always","deferred","pipe","fns","newDefer","returned","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","notifyWith","resolveWith","process","exceptionHook","rejectWith","getErrorHook","getStackHook","stateString","when","singleValue","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","asyncError","message","readyException","readyList","completed","readyWait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","camelCase","acceptData","Data","uid","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","removeData","_data","_removeData","dequeue","startLength","_queueHooks","setter","clearQueue","pnum","rcssNum","cssExpand","composed","getRootNode","isHiddenWithinTree","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","unit","cssNumber","initialInUnit","defaultDisplayMap","getDefaultDisplay","showHide","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","noCloneChecked","defaultValue","wrapMap","_default","getAll","setGlobalEval","refElements","rhtml","buildFragment","scripts","selection","ignored","wrap","attached","htmlPrefilter","rtypenamespace","returnTrue","returnFalse","one","origFn","leverageNative","isSetup","saved","isTrigger","delegateType","isImmediatePropagationStopped","handleObjIn","eventHandle","handleObj","namespaces","origType","elemData","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","originalEvent","load","noBubble","beforeunload","returnValue","props","isDefaultPrevented","timeStamp","now","isSimulated","changedTouches","pageX","pageY","charCode","buttons","pointerId","pointerType","targetTouches","toElement","touches","blur","focusMappedHandler","simulate","attaches","dataHolder","mouseenter","mouseleave","pointerenter","pointerleave","orig","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","fixInput","domManip","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","replaceWith","appendTo","prependTo","replaceAll","original","rnumnonpx","rcustomProp","getStyles","opener","swap","rboxStyle","curCSS","computed","isCustomProp","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","pixelBoxStylesVal","boxSizingReliableVal","scrollboxSizeVal","measure","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","trChild","trStyle","cssPrefixes","emptyStyle","vendorProps","finalPropName","cssProps","capName","vendorPropName","rdisplayswap","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","boxModelAdjustment","dimension","isBorderBox","styles","computedVal","marginDelta","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","animationIterationCount","aspectRatio","borderImageSlice","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zoom","fillOpacity","floodOpacity","stopOpacity","strokeMiterlimit","strokeOpacity","origName","setProperty","isFinite","scrollboxSizeBuggy","padding","border","propHooks","run","percent","eased","fx","linear","swing","cos","PI","fxNow","inProgress","rfxtypes","rrun","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","complete","timer","anim","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","timeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","classNames","curValue","finalValue","stateVal","isValidValue","rreturn","valHooks","optionSet","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","triggerHandler","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","valueOrFunction","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","lastModified","etag","isLocal","protocol","accepts","json","responseFields","converters","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","hasContent","ifModified","headers","send","nativeStatusText","responses","isSuccess","response","modified","finalDataType","firstDataType","ajaxHandleResponses","conv2","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","wrapAll","wrapInner","htmlIsFunction","unwrap","visible","XMLHttpRequest","xhrSuccessStatus","xhrSupported","cors","errorCallback","username","xhrFields","onload","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","animated","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","win","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","hover","fnOver","fnOut","rtrim","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","_jQuery","_$","DataView","getNative","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","setCacheAdd","setCacheHas","SetCache","__data__","stackClear","stackDelete","stackGet","stackHas","stackSet","Stack","predicate","resIndex","baseTimes","isArguments","isBuffer","isIndex","isTypedArray","inherited","isArr","isArg","isBuff","isType","skipIndexes","arrayPush","keysFunc","symbolsFunc","getRawTag","objectToString","symToStringTag","toStringTag","baseGetTag","isObjectLike","baseIsEqualDeep","baseIsEqual","bitmask","customizer","equalArrays","equalByTag","equalObjects","getTag","argsTag","arrayTag","objectTag","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","isMasked","toSource","reIsHostCtor","funcProto","Function","objectProto","funcToString","reIsNative","isLength","typedArrayTags","isPrototype","nativeKeys","coreJsData","arraySome","cacheHas","isPartial","arrLength","othLength","arrStacked","othStacked","seen","arrValue","othValue","compared","othIndex","mapToArray","setToArray","symbolProto","symbolValueOf","valueOf","byteLength","byteOffset","convert","stacked","getAllKeys","objProps","objLength","objStacked","skipCtor","objValue","objCtor","othCtor","freeGlobal","baseGetAllKeys","getSymbols","isKeyable","baseIsNative","getValue","nativeObjectToString","isOwn","unmasked","arrayFilter","stubArray","nativeGetSymbols","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","ctorString","nativeCreate","reIsUint","maskSrcKey","IE_PROTO","assocIndexOf","getMapData","overArg","freeExports","freeModule","freeProcess","nodeUtil","require","freeSelf","LARGE_ARRAY_SIZE","baseIsArguments","stubFalse","Buffer","baseIsTypedArray","baseUnary","nodeIsTypedArray","arrayLikeKeys","baseKeys","isValidPartialFormatter","isSet","addClassFor","asArray","countDecimals","numStr","pieces","getPageOffset","supportPageOffset","isCSS1Compat","compatMode","subRangeRatio","pa","fromPercentage","startRange","getJ","toStepping","xVal","xPct","va","vb","toPercentage","getStep","xSteps","snap","PipsType","PipsMode","Spectrum","singleStep","xNumSteps","xHighestCompleteStep","ordered","handleEntryPoint","handleStepPoint","getDistance","distances","getAbsoluteDistance","start_factor","xPct_index","rest_factor","rest_rel_distance","range_pct","rel_range_distance","abs_distance_counter","range_counter","fromStepping","isPercentage","getDefaultStep","isDown","getNearbySteps","stepBefore","startValue","highestStep","thisStep","stepAfter","countStepDecimals","stepDecimals","hasNoSize","percentage","value1","totalSteps","toFixed","defaultFormatter","cssClasses","origin","handleLower","handleUpper","touchArea","vertical","background","connects","ltr","rtl","textDirectionLtr","textDirectionRtl","draggable","tap","tooltip","pips","pipsHorizontal","pipsVertical","marker","markerHorizontal","markerVertical","markerNormal","markerLarge","markerSub","valueHorizontal","valueVertical","valueNormal","valueLarge","valueSub","INTERNAL_EVENT_NS","testStep","testKeyboardPageMultiplier","keyboardPageMultiplier","testKeyboardMultiplier","keyboardMultiplier","testKeyboardDefaultStep","keyboardDefaultStep","testRange","spectrum","testStart","testSnap","testAnimate","testAnimationDuration","animationDuration","testConnect","testOrientation","ort","testMargin","testLimit","testPadding","totalPadding","testDirection","testBehaviour","unconstrained","dragAll","testTooltips","tooltips","formatter","testHandleAttributes","handleAttributes","testAriaFormat","ariaFormat","testFormat","isValidFormatter","format","testKeyboardSupport","keyboardSupport","testDocumentElement","testCssPrefix","cssPrefix","testCssClasses","testOptions","tests","behaviour","msPrefix","msTransform","noPrefix","transformRule","scope_Base","scope_Handles","scope_Connects","scope_Pips","scope_Tooltips","addTarget","actions","pointerEnabled","msPointerEnabled","supportsPassive","CSS","getSupportsPassive","scope_Target","scope_Spectrum","scope_Values","scope_Locations","scope_HandleNumbers","scope_ActiveHandlesCount","scope_Events","scope_Document","scope_DocumentElement","scope_Body","scope_DirOffset","addNodeTo","addOrigin","handleNumber","isSliderDisabled","isHandleDisabled","horizontalKeys","verticalKeys","largeStepKeys","edgeKeys","isLargeDown","isLargeUp","isUp","isMin","isMax","getNextStepsForHandle","setHandle","fireEvent","eventKeydown","attributes_1","addConnect","addTooltip","removeTooltips","bindEvent","unencoded","formattedValue","mapToRange","stepped","generateSpread","group","Range","Steps","Count","spread","Positions","Values","getGroup","indexes","firstInRange","lastInRange","ignoreFirst","ignoreLast","prevPct","newPct","pctDifference","pctPos","steps","realSteps","stepSize","low","isSteps","density","LargeValue","SmallValue","addMarking","filterFunc","valueSizeClasses","None","markerSizeClasses","valueOrientationClasses","markerOrientationClasses","getClasses","sizeClasses","addSpread","removePips","baseSize","pageOffset","eventTarget","touch","mouse","pointer","isTouchOnTarget","checkTouch","composedPath","targetTouch","points","fixEvent","doNotReject","calcPoint","calcPointToPercentage","proposal","clientTop","clientLeft","documentLeave","eventEnd","eventMove","appVersion","buttonsProperty","movement","startCalcPoint","moveHandles","locations","handleNumbers","setZindex","eventStart","moveEvent","endEvent","outEvent","eventTap","clickedPosition","smallestDifference","handlePosition","differenceWithThisHandle","getClosestHandle","eventHover","targetEvent","scope_Self","namespacedEvent","tEvent","tNamespace","isInternalNamespace","eventType","checkHandlePosition","reference","lookBackward","lookForward","inRuleOrder","upward","proposals","firstHandle","transformDirection","exactInput","translateRule","updateConnect","updateHandlePosition","connectWidth","scaleRule","resolveToValue","valueSet","fireSetEvent","isInit","space_1","valueGet","nearbySteps","connectOptions","connectBase","addElements","handleBefore","handleAfter","eventHolders","handlesToDrag","handleNumbersToDrag","eventHolder","positions","noUiSlider","__moveHandles","updateOptions","optionsToUpdate","updateAble","newOptions","getPositions","getTooltips","getOrigins","api","nouislider","__spectrum","isSpace","collectCharacters","regEx","chars","descriptors","currentDescriptor","inputLength","regexLeadingSpaces","regexLeadingCommasOrSpaces","regexLeadingNotSpaces","regexTrailingCommas","regexNonNegativeInteger","regexFloatingPoint","candidates","parseDescriptors","lastChar","intVal","floatVal","pError","isColorSupported","bold","dim","italic","underline","inverse","strikethrough","black","red","green","yellow","blue","magenta","cyan","white","gray","bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite","blackBright","redBright","greenBright","yellowBright","blueBright","magentaBright","cyanBright","whiteBright","bgBlackBright","bgRedBright","bgGreenBright","bgYellowBright","bgBlueBright","bgMagentaBright","bgCyanBright","bgWhiteBright","createColors","Container","AtRule","proxyOf","registerAtRule","Rule","Declaration","isClean","my","cleanSource","markTreeDirty","markDirty","cleanRaws","keepBetween","getIterator","condition","lastEach","getProxyProcessor","startsWith","toProxy","exist","existIndex","rebuild","raws","removeAll","replaceValues","walkDecls","decl","walk","addToError","walkAtRules","walkComments","walkRules","registerParse","dependant","registerRule","registerRoot","pico","terminalHighlight","CssSyntaxError","line","endLine","endColumn","setMessage","captureStackTrace","showSourceCode","color","lines","number","gutter","subLineStart","subLineEnd","subLine","variable","LazyResult","Processor","toResult","registerLazyResult","registerProcessor","Input","PreviousMap","fromJSON","inputs","ownInputs","inputHydrated","inputId","nanoid","isAbsolute","SourceMapConsumer","SourceMapGenerator","fileURLToPath","pathToFileURL","fromOffsetCache","sourceMapAvailable","pathAvailable","hasBOM","consumer","mapResolve","fromOffset","lastLine","lineToIndex","prevIndex","sourceRoot","fromUrl","originalPositionFor","mapFile","sourceContentFor","consumerCache","registerInput","MapGenerator","Result","TYPE_TO_CLASS_NAME","atrule","comment","rule","PLUGIN_PROPS","AtRuleExit","CommentExit","DeclarationExit","DocumentExit","Once","OnceExit","postcssPlugin","prepare","RootExit","RuleExit","NOT_VISITORS","isPromise","getEvents","toStack","eventIndex","visitorIndex","visitors","cleanMarks","postcss","processor","stringified","processed","inline","syntax","helpers","processing","runAsync","onFinally","getAsyncError","handleError","lastPlugin","postcssVersion","prepareVisitors","hasListener","runOnRoot","visitTick","visitor","roots","subRoot","stringifier","generate","walkSync","visitSync","warnings","messages","registerPostcss","comma","separators","inQuote","prevQuote","dirname","sep","cssString","mapOpts","originalCSS","usesFileUrls","absolute","memoizedFileURLs","memoizedPaths","memoizedURLs","addAnnotation","isInline","toBase64","annotation","outputFile","eol","applyPrevMaps","toUrl","sourcesContent","applySourceMap","clearAnnotation","isMap","generateMap","generateString","fromSourceMap","ignoreInvalidMapping","addMapping","generated","isSourcesContent","setSourcesContent","isAnnotation","noSource","mapping","sourcePath","semicolon","withContent","previousMaps","already","toFileUrl","setSourceContent","fileURL","encodeURI","NoWorkResult","_processor","_css","_opts","_map","generatedCSS","generatedMap","Stringifier","cloned","postcssNode","overrides","between","cloneAfter","cloneBefore","rangeBy","markClean","positionBy","stringRepresentation","positionInside","defaultType","bookmark","foundSelf","emitInputs","inputsNextIndex","proxyCache","Proxy","SAFE_COMMENT_NEIGHBOR","spaces","createTokenizer","unnamedAtrule","brackets","endOfFile","nextToken","getPosition","spacesAndCommentsFromEnd","afterName","spacesAndCommentsFromStart","checkMissedSemicolon","colon","founded","doubleColon","customProperty","findLastWithPosition","unknownWord","firstSpaces","precheckMissedSemicolon","important","stringFrom","spacesFromEnd","emptyRule","unexpectedClose","endFile","unclosedBlock","freeSemicolon","ownSemicolon","bracket","back","unclosedBracket","clean","lastTokenType","Warning","initializer","warningPrinted","creator","env","LANG","transformer","processOpts","pluginOpts","atRule","existsSync","readFileSync","loadAnnotation","startWith","loadMap","decodeInline","uriMatch","baseUriMatch","atob","encoding","getAnnotationURL","sourceMapString","_mappings","sections","comments","loadFile","prevPath","use","warning","ignore","DEFAULT_RAW","beforeClose","beforeComment","beforeDecl","beforeOpen","beforeRule","commentLeft","commentRight","emptyBody","indent","builder","rawValue","block","beforeAfter","buf","own","rawCache","rawBeforeClose","rawBeforeComment","rawBeforeDecl","rawBeforeOpen","rawBeforeRule","rawColon","rawEmptyBody","rawIndent","rawSemicolon","SINGLE_QUOTE","DOUBLE_QUOTE","BACKSLASH","SLASH","NEWLINE","SPACE","FEED","TAB","CR","OPEN_SQUARE","CLOSE_SQUARE","OPEN_PARENTHESES","CLOSE_PARENTHESES","OPEN_CURLY","CLOSE_CURLY","SEMICOLON","ASTERISK","COLON","AT","RE_AT_END","RE_WORD_END","RE_BAD_BRACKET","RE_HEX_ESCAPE","currentToken","escaped","escapePos","ignoreErrors","unclosed","ignoreUnclosed","controlChar","printed","htmlparser","escapeStringRegexp","parseSrcset","postcssParse","mediaTags","vulnerableTags","sanitizeHtml","VALID_HTML_ATTRIBUTE_NAME","_recursing","tempResult","Frame","tagPosition","mediaChildren","updateParentNodeText","updateParentNodeMediaChildren","htmlParserDefaults","tagAllowed","allowedTags","allowVulnerableTags","nonTextTagsArray","nonTextTags","allowedAttributesMap","allowedAttributesGlobMap","allowedAttributes","globRegex","allowedClassesMap","allowedClassesGlobMap","allowedClassesRegexMap","allowedClasses","classes","transformTagsMap","transformTagsAll","skipMap","transformMap","skipText","skipTextDepth","transformTags","transFun","simpleTransform","addedText","initializeState","enforceHtmlBoundary","frame","hasText","transformedTag","disallowedTagsMode","nestingLimit","allowedScriptHostnames","allowedScriptDomains","allowedEmptyAttributes","nonBooleanAttributes","passedAllowedAttributesMapCheck","splitStrArray","allowedSchemesAppliedToAttributes","naughtyHref","allowed","parseUrl","allowedHostname","hostname","allowedDomain","domain","endsWith","isRelativeUrl","allowIframeRelativeUrls","allowedIframeHostnames","allowedIframeDomains","evil","allowedSpecificClasses","allowedWildcardClasses","allowedSpecificClassesGlob","allowedSpecificClassesRegex","allowedWildcardClassesRegex","allowedClassesGlobs","allowedGlobs","clss","glob","parseStyleAttributes","filteredAST","extractedAttributes","attrObject","stringifyStyleAttributes","abstractSyntaxTree","allowedStyles","astRules","selectedRule","allowedDeclarationsList","attributeObject","regularExpression","filterDeclarations","filterCss","escapeHtml","selfClosing","textFilter","lastFrame","exclusiveFilter","firstIndex","allowProtocolRelative","scheme","allowedSchemesByTag","allowedSchemes","newTagName","newAttribs","styleTagTransform","setAttributes","domAPI","insertStyleElement","locals","stylesInDOM","getIndexByIdentifier","modulesToDom","idCountMap","identifiers","indexByIdentifier","sourceMap","references","updater","addElementStyle","byIndex","newObj","lastIdentifiers","newList","newLastIdentifiers","styleTarget","HTMLIFrameElement","getTarget","styleElement","removeStyleElement","styleSheet","hexToBuffer","hex","bufferToBase64","base64ToBuffer","MATHSPLIT","processMath","preProcess","math","blocks","appName","PROTOCOL_MAJOR_VERSION","PROTOCOL_VERSION","ManagerBase","comm_target_name","_models","setViewOptions","create_view","uuid","viewPromise","state_change","_view_name","_view_module","loadViewClass","views","model_id","errorModel","callbacks","get_model","modelPromise","has_model","handle_comm_open","comm","protocolVersion","metadata","buffer_paths","put_buffers","new_model","model_name","model_module","model_module_version","new_widget","serialized_state","commPromise","view_name","view_module","view_module_version","_create_comm","_model_module","_model_module_version","_model_name","_view_module_version","options_clone","register_model","comm_id","_make_model","_loadFromKernel","initComm","on_msg","on_close","_loadFromKernelModels","states","bufferPaths","bufferGroups","widget_id","widget_comms","deserializedState","_deserialize_state","set_state","comm_ids","_get_comm_info","widgets_info","msg_id","parent_header","msg_type","widget_info","model_promise","loadModelClass","ModelType","makeErrorModel","widget_model","widget_manager","clear_state","resolvePromisesDict","get_state","modelPromises","remove_buffers","drop_defaults","version_major","version_minor","serialize_state","live_comms","modelState","modelCreate","comm_live","resolveUrl","inline_sanitize","deTilde","braces","wholematch","character","removeMath","moduleName","moduleVersion","loadClass","filterExistingModelState","res","buffer_path","isSerializable","is_cloned","isView","new_value","BROKEN_FILE_SVG_ICON","ElementProto","NativeView","_domEvents","srcElement","JUPYTER_WIDGETS_VERSION","IPY_MODEL_","unpack_models","manager","unpacked","sub_value","pack_models","model_ids","WidgetModel","packed","_view_count","_expectedEchoMsgIds","_attrsToUpdate","_closed","_state_lock","_msg_buffer","_msg_buffer_callbacks","_pending_msgs","_buffered_state_diff","_handle_comm_closed","_handle_comm_msg","_comm_live","comm_closed","msgId","attrName","fullState","_handle_status","execution_state","send_sync_message","rememberLastUpdateFor","return_value","_buffered_state_diff_synced","msgState","serializers","statuscb","shell","iopub","save_changes","on_some_change","deserialized","deserialize","DOMWidgetModel","_dom_classes","WidgetView","parameters","displayed","handle_message","do","create_child_view","child_model","JupyterLuminoWidget","_view","processLuminoMessage","JupyterPhosphorWidget","JupyterLuminoPanelWidget","JupyterPhosphorPanelWidget","DOMWidgetView","new_classes","old_classes","update_classes","layoutPromise","setLayout","stylePromise","setStyle","_comm_live_update","updateTooltip","oldLayout","oldLayoutView","unlayout","luminoWidget","oldStyleView","unstyle","update_mapped_classes","class_map","trait_name","set_mapped_classes","processPhosphorMessage","updateTabindex","pWidget","css_properties","align_content","align_items","align_self","border_top","border_right","border_bottom","border_left","flex","flex_flow","justify_content","justify_items","max_height","max_width","min_height","min_width","object_fit","object_position","grid_auto_columns","grid_auto_flow","grid_auto_rows","grid_gap","grid_template_rows","grid_template_columns","grid_template_areas","grid_row","grid_column","grid_area","LayoutModel","LayoutView","_traitNames","registerTrait","trait","handleChange","css_name","removeProperty","StyleModel","Derived","styleProperties","StyleView","shims","CommManager","jsServicesKernel","comms","init_kernel","kernel","new_comm","target_name","createComm","Comm","register_comm","register_target","registerCommTarget","jsServicesComm","unregister_target","commId","targetName","future","_hookupCallbacks","onMsg","onClose","onReply","reply","onStdin","onIOPub","clear_output","ViewList","remove_view","_handler_context","_create_view","_remove_view","new_models","first_removed","IJupyterWidgetRegistry","createErrorWidgetModel","ErrorWidgetView","generateErrorMessage","textAlign","onclick","ondblclick","createErrorWidgetView","typeset","MathJax","Hub","Queue","escape_html","esc","JUPYTER_CONTROLS_VERSION","DescriptionStyleModel","description_width","DescriptionModel","description_allow_html","DescriptionView","updateDescription","latexTypesetter","_rendermime","LabeledDOMWidgetModel","LabeledDOMWidgetView","CoreWidgetModel","CoreDOMWidgetModel","CoreDescriptionModel","DirectionalLinkModel","updateBindings","updateValue","sourceModel","sourceAttr","targetModel","targetAttr","_updating","LinkModel","CheckboxStyleModel","ToggleButtonStyleModel","font_family","font_size","font_style","font_variant","font_weight","text_color","text_decoration","BoolModel","CheckboxModel","CheckboxView","checkboxLabel","descriptionSpan","updateIndent","_handle_click","updated_view","ToggleButtonModel","button_style","ToggleButtonView","update_button_style","set_button_style","danger","ValidModel","readout","ValidView","ButtonStyleModel","button_color","ButtonModel","ButtonView","BoxModel","box_style","HBoxModel","VBoxModel","BoxView","children_views","add_child_model","update_children","update_box_style","set_box_style","dummy","HBoxView","VBoxView","GridBoxView","GridBoxModel","ImageModel","ImageView","blob","Blob","createObjectURL","TextDecoder","oldurl","revokeObjectURL","VideoModel","autoplay","loop","controls","VideoView","AudioModel","AudioView","named_colors","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","grey","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgreen","lightgray","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellowgreen","ColorPickerModel","concise","ColorPickerView","_color_container","_textbox","_colorpicker","_update_value","_update_concise","_picker_change","_text_change","rgb","_validate_color","fallback","serialize_date","year","getUTCFullYear","month","getUTCMonth","date","getUTCDate","deserialize_date","setUTCFullYear","setUTCHours","DatePickerModel","DatePickerView","_datepicker","_picker_focusout","valueAsDate","validity","badInput","PARSER","serialize_time","hours","minutes","seconds","milliseconds","deserialize_time","padStart","time_serializers","TimeModel","TimeView","_timepicker","update2","serialize_datetime","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","deserialize_datetime","datetime_serializers","DatetimeModel","DatetimeView","_datetimepicker","dt_as_dt_string","dt_as_date_string","dt_as_time_string","setHours","serialize_naive","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","deserialize_naive","setFullYear","naive_serializers","NaiveDatetimeModel","formatDecimalParts","toExponential","coefficient","prefixExponent","formatSpecifier","specifier","FormatSpecifier","align","sign","zero","precision","exponent","toLocaleString","toPrecision","formatRounded","prefixes","locale","grouping","thousands","identity","currencyPrefix","currency","currencySuffix","decimal","numerals","formatNumerals","minus","nan","newFormat","formatTypes","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","out","i0","formatTrim","formatPrefix","IntModel","BoundedIntModel","SliderStyleModel","handle_color","IntSliderModel","readout_format","continuous_update","update_readout_format","readout_formatter","IntRangeSliderModel","BaseIntSliderView","_parse_value","$slider","slider_container","contentEditable","createSlider","regenSlider","updateSliderOptions","updateSliderValue","readout_overflow","handleKeyDown","handleTextChange","behavior","_validate_slide_value","handleSliderUpdateEvent","handleSliderChangeEvent","IntRangeSliderView","_range_regex","valueToString","stringToValue","actual_value","handleSliderChanged","prev_value","IntSliderView","model_value","IntTextModel","BoundedIntTextModel","IntTextView","_default_step","textbox","handleKeypress","handleKeyUp","handleChanging","trimmed","handleChanged","numericalValue","boundedValue","ProgressStyleModel","bar_color","IntProgressModel","bar_style","ProgressView","update_bar_style","set_bar_style","PlayModel","playing","show_repeat","next_value","schedule_next","_timerId","play","PlayView","playPauseButton","stopButton","repeatButton","playIcon","stopIcon","repeatIcon","onPlayingChanged","updateRepeat","updatePlaying","FloatModel","BoundedFloatModel","FloatSliderModel","_range","slider_color","FloatLogSliderModel","FloatRangeSliderModel","FloatSliderView","FloatLogSliderView","logCalc","log_value","_updating_slider","FloatRangeSliderView","FloatTextModel","BoundedFloatTextModel","FloatTextView","FloatProgressModel","ControllerButtonModel","pressed","ControllerButtonView","ControllerAxisModel","ControllerAxisView","bullet","ControllerModel","connected","timestamp","axes","getGamepads","update_loop","wait_loop","pad","btn","_create_button_model","axis","_create_axis_model","reset_gamepad","ControllerView","button_views","add_button","axis_views","add_axis","update_label","axis_box","button_box","SelectionModel","_options_labels","SelectionView","listbox","DropdownModel","DropdownView","_updateOptions","_handle_change","SelectModel","rows","SelectView","updateSelection","optsChange","idxChange","RadioButtonsModel","icons","RadioButtonsView","radios","stale","item_query","radio_el","adjustPadding","elStyles","margins","marginBottom","cStyles","containerMargin","extraMargin","ToggleButtonsStyleModel","button_width","ToggleButtonsModel","ToggleButtonsView","_css_state","buttongroup","previous_icons","previous_bstyle","classMap","item_html","update_style_traits","SelectionSliderModel","SelectionSliderView","slide","slidestop","updateReadout","prev_index","MultipleSelectionModel","SelectMultipleModel","SelectMultipleView","listboxOptions","selectedOptions","SelectionRangeSliderModel","SelectionRangeSliderView","labels","minValue","maxValue","intValues","trunc","EventedPanel","tabContents","Selection","_array","_previousValue","_selectionChanged","_insertBehavior","_removeBehavior","selectionChanged","adjustSelectionForSet","pv","_updateSelectedValue","cv","previousValue","adjustSelectionForInsert","clearSelection","adjustSelectionForRemove","COLLAPSE_CLASS_OPEN","Collapse","_collapseChanged","_header","_content","oldWidget","_onChildDisposed","_collapsed","_collapse","_uncollapse","collapseChanged","ACCORDION_CHILD_ACTIVE_CLASS","Accordion","_selection","_onSelectionChanged","collapseWidgets","_wrapWidget","_onCollapseChange","change","SelectionContainerModel","selected_index","AccordionModel","JupyterLuminoAccordionWidget","AccordionView","add_child_view","remove_child_view","updateChildren","update_selected_index","update_titles","accordion","updatingChildren","placeholder","TabModel","JupyterLuminoTabPanelWidget","TabView","updatingTabs","childrenViews","addChildView","updateTabs","updateTitles","_onTabChanged","updateSelectedIndex","StackModel","StackView","definition","Color","darker","brighter","reI","reN","reP","reHex","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","rebeccapurple","color_formatHex","formatHex","color_formatRgb","formatRgb","rgbn","Rgb","rgba","hsla","rgb_formatHex","rgb_formatRgb","clampa","clampi","Hsl","hslConvert","clamph","clampt","hsl2rgb","m2","removeChildren","channels","displayable","formatHex8","formatHsl","clamp","isSelected","TagsInputBaseModel","allowed_tags","allow_duplicates","TagsInputBaseView","hoveredTag","hoveredTagIndex","taginputWrapper","datalistID","taginput","autocompleteList","updateAutocomplete","updatePlaceholder","ondrop","tags","ondragover","onchange","handleValueAdded","oninput","resizeInput","onkeydown","handleKeyEvent","loseFocus","inputIndex","preventLoosingFocus","createTag","ondragstart","ondragenter","ondragend","updateTags","updateTag","newTagValue","tagIndex","addTag","tagValue","validateValue","allowedTagValues","currentElement","removeSelectedTags","removeTag","dataTransfer","draggedTagValue","draggedTagindex","sameOrigin","TagsInputModel","tag_style","TagsInputView","getTagText","onmousedown","ColorsInputModel","ColorsInputView","darkerColor","backgroundColor","NumbersInputModel","NumbersInputView","parseNumber","FloatsInputModel","FloatsInputView","IntsInputModel","IntsInputView","int","StringStyleModel","HTMLStyleModel","HTMLMathStyleModel","LabelStyleModel","TextStyleModel","StringModel","StringView","HTMLModel","HTMLView","HTMLMathModel","HTMLMathView","LabelModel","LabelView","TextareaModel","TextareaView","update_placeholder","TextModel","TextView","inputType","PasswordModel","PasswordView","ComboboxModel","ensure_options","ComboboxView","isInitialRender","highlightValidState","optionFragment","replaceChildren","FileUploadModel","accept","FileUploadView","fileInput","promisesFile","files","fileReader","FileReader","last_modified","readAsArrayBuffer","OUTPUT_WIDGET_VERSION","OutputModel","OutputView","uri","VIEW_MIME_TYPE","help","help_index","escapeScript","requirejs","Jupyter","dialog","wm","WidgetManager","_managers","notebook","get_cells","cell","output_area","outputs","modal","keyboard_manager","class","register","MIME_TYPE","mngr","LuminoWidget","LuminoMessaging","NOTEBOOK_VERSION_INFO","NOTEBOOK_MAJOR","NOTEBOOK_MINOR","NOTEBOOK_PATCH","RENDER_SHOULD_THROW","handle_kernel","comm_manager","load_ipython_extension","outputarea","viewKey","removeView","viewids","_jupyterWidgetViews","OutputArea","register_mime_type","md","toinsert","create_output_subarea","register_events","safe","outputWidgets","saveState","embedWidgets","polyfill_new_comm_buffers","send_shell_message","widget_md","render_cell_output","_init_actions","_init_menu","failure","notification_area","saveWidgetsAction","menubar","clearWidgetsAction","widgetsMenu","helpMenu","widgetsMenuLink","widgetsSubmenu","divider","_createMenuItem","itemLink","_get_connected_kernel","comm_info","is_connected","iopub_callbacks","handle_output","handle_clear_output","download","outputBase","outputArea","reset_msg_id","set_callbacks_for_msg","prompt_area","newMessage","setOutputs","iopubCallbacks","prev_msg_id","previous_callback","output_callback_overrides_pop","output_callback_overrides_push","__WEBPACK_EXTERNAL_MODULE__1308__","customAlphabet","alphabet","defaultSize","ArrayProto","ObjProto","SymbolProto","supportsArrayBuffer","supportsDataView","nativeIsArray","nativeIsView","_isNaN","_isFinite","hasEnumBug","nonEnumerableProps","MAX_ARRAY_INDEX","restArguments","isUndefined","isBoolean","isElement","tagTester","nodelist","Int8Array","hasDataViewBug","isIE11","isDataView","getInt8","isArrayBuffer","isSymbol","constant","createSizePropertyCheck","getSizeProperty","sizeProperty","shallowProperty","typedArrayPattern","collectNonEnumProps","emulatedSet","nonEnumIdx","isMatch","_wrapped","toBufferView","bufferSource","tagDataView","aStack","bStack","deepEq","areArrays","aCtor","bCtor","allKeys","ie11fingerprint","weakMapMethods","forEachName","commonInit","mapTail","mapMethods","setMethods","createAssigner","baseCreate","extendOwn","interceptor","toPath","deepGet","optimizeCb","argCount","baseIteratee","mapObject","currentKey","propertyOf","times","accum","getTime","createEscaper","escaper","testRegexp","replaceRegexp","templateSettings","evaluate","interpolate","noMatch","escapes","escapeChar","bareIdentifier","template","oldSettings","idCounter","_chain","executeBound","sourceFunc","boundFunc","callingContext","boundArgs","bound","callArgs","flatten","memoize","hasher","throttle","later","leading","throttled","_now","trailing","cancel","debounce","immediate","debounced","_args","negate","compose","findKey","createPredicateIndexFinder","sortedIndex","createIndexFinder","predicateFind","createReduce","reducer","guard","contextPath","lastComputed","reStrSymbol","rand","criteria","pass","keyInObj","compact","otherArrays","uniq","isSorted","arrays","intersection","argsLength","unzip","chainResult","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","globalThis","nmd","paths","baseURI","nc"],"sourceRoot":""} \ No newline at end of file diff --git a/.venv-sp/share/man/man1/ipython.1 b/.venv-sp/share/man/man1/ipython.1 new file mode 100644 index 0000000..0f4a191 --- /dev/null +++ b/.venv-sp/share/man/man1/ipython.1 @@ -0,0 +1,60 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" First parameter, NAME, should be all caps +.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection +.\" other parameters are allowed: see man(7), man(1) +.TH IPYTHON 1 "July 15, 2011" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) and groff_man(7) +.\" .SH section heading +.\" .SS secondary section heading +.\" +.\" +.\" To preview this page as plain text: nroff -man ipython.1 +.\" +.SH NAME +ipython \- Tools for Interactive Computing in Python. +.SH SYNOPSIS +.B ipython +.RI [ options ] " files" ... + +.B ipython subcommand +.RI [ options ] ... + +.SH DESCRIPTION +An interactive Python shell with automatic history (input and output), dynamic +object introspection, easier configuration, command completion, access to the +system shell, integration with numerical and scientific computing tools, +web notebook, Qt console, and more. + +For more information on how to use IPython, see 'ipython \-\-help', +or 'ipython \-\-help\-all' for all available command\(hyline options. + +.SH "ENVIRONMENT VARIABLES" +.sp +.PP +\fIIPYTHONDIR\fR +.RS 4 +This is the location where IPython stores all its configuration files. The default +is $HOME/.ipython if IPYTHONDIR is not defined. + +You can see the computed value of IPYTHONDIR with `ipython locate`. + +.SH FILES + +IPython uses various configuration files stored in profiles within IPYTHONDIR. +To generate the default configuration files and start configuring IPython, +do 'ipython profile create', and edit '*_config.py' files located in +IPYTHONDIR/profile_default. + +.SH AUTHORS +IPython is written by the IPython Development Team . diff --git a/.venv-sp/share/man/man1/ttx.1 b/.venv-sp/share/man/man1/ttx.1 new file mode 100644 index 0000000..bba23b5 --- /dev/null +++ b/.venv-sp/share/man/man1/ttx.1 @@ -0,0 +1,225 @@ +.Dd May 18, 2004 +.\" ttx is not specific to any OS, but contrary to what groff_mdoc(7) +.\" seems to imply, entirely omitting the .Os macro causes 'BSD' to +.\" be used, so I give a zero-width space as its argument. +.Os \& +.\" The "FontTools Manual" argument apparently has no effect in +.\" groff 1.18.1. I think it is a bug in the -mdoc groff package. +.Dt TTX 1 "FontTools Manual" +.Sh NAME +.Nm ttx +.Nd tool for manipulating TrueType and OpenType fonts +.Sh SYNOPSIS +.Nm +.Bk +.Op Ar option ... +.Ek +.Bk +.Ar file ... +.Ek +.Sh DESCRIPTION +.Nm +is a tool for manipulating TrueType and OpenType fonts. It can convert +TrueType and OpenType fonts to and from an +.Tn XML Ns -based format called +.Tn TTX . +.Tn TTX +files have a +.Ql .ttx +extension. +.Pp +For each +.Ar file +argument it is given, +.Nm +detects whether it is a +.Ql .ttf , +.Ql .otf +or +.Ql .ttx +file and acts accordingly: if it is a +.Ql .ttf +or +.Ql .otf +file, it generates a +.Ql .ttx +file; if it is a +.Ql .ttx +file, it generates a +.Ql .ttf +or +.Ql .otf +file. +.Pp +By default, every output file is created in the same directory as the +corresponding input file and with the same name except for the +extension, which is substituted appropriately. +.Nm +never overwrites existing files; if necessary, it appends a suffix to +the output file name before the extension, as in +.Pa Arial#1.ttf . +.Ss "General options" +.Bl -tag -width ".Fl t Ar table" +.It Fl h +Display usage information. +.It Fl d Ar dir +Write the output files to directory +.Ar dir +instead of writing every output file to the same directory as the +corresponding input file. +.It Fl o Ar file +Write the output to +.Ar file +instead of writing it to the same directory as the +corresponding input file. +.It Fl v +Be verbose. Write more messages to the standard output describing what +is being done. +.It Fl a +Allow virtual glyphs ID's on compile or decompile. +.El +.Ss "Dump options" +The following options control the process of dumping font files +(TrueType or OpenType) to +.Tn TTX +files. +.Bl -tag -width ".Fl t Ar table" +.It Fl l +List table information. Instead of dumping the font to a +.Tn TTX +file, display minimal information about each table. +.It Fl t Ar table +Dump table +.Ar table . +This option may be given multiple times to dump several tables at +once. When not specified, all tables are dumped. +.It Fl x Ar table +Exclude table +.Ar table +from the list of tables to dump. This option may be given multiple +times to exclude several tables from the dump. The +.Fl t +and +.Fl x +options are mutually exclusive. +.It Fl s +Split tables. Dump each table to a separate +.Tn TTX +file and write (under the name that would have been used for the output +file if the +.Fl s +option had not been given) one small +.Tn TTX +file containing references to the individual table dump files. This +file can be used as input to +.Nm +as long as the referenced files can be found in the same directory. +.It Fl i +.\" XXX: I suppose OpenType programs (exist and) are also affected. +Don't disassemble TrueType instructions. When this option is specified, +all TrueType programs (glyph programs, the font program and the +pre-program) are written to the +.Tn TTX +file as hexadecimal data instead of +assembly. This saves some time and results in smaller +.Tn TTX +files. +.It Fl y Ar n +When decompiling a TrueType Collection (TTC) file, +decompile font number +.Ar n , +starting from 0. +.El +.Ss "Compilation options" +The following options control the process of compiling +.Tn TTX +files into font files (TrueType or OpenType): +.Bl -tag -width ".Fl t Ar table" +.It Fl m Ar fontfile +Merge the input +.Tn TTX +file +.Ar file +with +.Ar fontfile . +No more than one +.Ar file +argument can be specified when this option is used. +.It Fl b +Don't recalculate glyph bounding boxes. Use the values in the +.Tn TTX +file as is. +.El +.Sh "THE TTX FILE FORMAT" +You can find some information about the +.Tn TTX +file format in +.Pa documentation.html . +In particular, you will find in that file the list of tables understood by +.Nm +and the relations between TrueType GlyphIDs and the glyph names used in +.Tn TTX +files. +.Sh EXAMPLES +In the following examples, all files are read from and written to the +current directory. Additionally, the name given for the output file +assumes in every case that it did not exist before +.Nm +was invoked. +.Pp +Dump the TrueType font contained in +.Pa FreeSans.ttf +to +.Pa FreeSans.ttx : +.Pp +.Dl ttx FreeSans.ttf +.Pp +Compile +.Pa MyFont.ttx +into a TrueType or OpenType font file: +.Pp +.Dl ttx MyFont.ttx +.Pp +List the tables in +.Pa FreeSans.ttf +along with some information: +.Pp +.Dl ttx -l FreeSans.ttf +.Pp +Dump the +.Sq cmap +table from +.Pa FreeSans.ttf +to +.Pa FreeSans.ttx : +.Pp +.Dl ttx -t cmap FreeSans.ttf +.Sh NOTES +On MS\-Windows and MacOS, +.Nm +is available as a graphical application to which files can be dropped. +.Sh SEE ALSO +.Pa documentation.html +.Pp +.Xr fontforge 1 , +.Xr ftinfo 1 , +.Xr gfontview 1 , +.Xr xmbdfed 1 , +.Xr Font::TTF 3pm +.Sh AUTHORS +.Nm +was written by +.An -nosplit +.An "Just van Rossum" Aq just@letterror.com . +.Pp +This manual page was written by +.An "Florent Rougon" Aq f.rougon@free.fr +for the Debian GNU/Linux system based on the existing FontTools +documentation. It may be freely used, modified and distributed without +restrictions. +.\" For Emacs: +.\" Local Variables: +.\" fill-column: 72 +.\" sentence-end: "[.?!][]\"')}]*\\($\\| $\\| \\| \\)[ \n]*" +.\" sentence-end-double-space: t +.\" End: \ No newline at end of file diff --git a/.venv-sp/share/xyzservices/providers.json b/.venv-sp/share/xyzservices/providers.json new file mode 100644 index 0000000..ac7992c --- /dev/null +++ b/.venv-sp/share/xyzservices/providers.json @@ -0,0 +1,17685 @@ +{ + "OpenStreetMap": { + "Mapnik": { + "url": "https://tile.openstreetmap.org/{z}/{x}/{y}.png", + "max_zoom": 19, + "html_attribution": "© OpenStreetMap contributors", + "attribution": "(C) OpenStreetMap contributors", + "name": "OpenStreetMap.Mapnik" + }, + "DE": { + "url": "https://tile.openstreetmap.de/{z}/{x}/{y}.png", + "max_zoom": 18, + "html_attribution": "© OpenStreetMap contributors", + "attribution": "(C) OpenStreetMap contributors", + "name": "OpenStreetMap.DE" + }, + "CH": { + "url": "https://tile.osm.ch/switzerland/{z}/{x}/{y}.png", + "max_zoom": 18, + "html_attribution": "© OpenStreetMap contributors", + "attribution": "(C) OpenStreetMap contributors", + "bounds": [ + [ + 45, + 5 + ], + [ + 48, + 11 + ] + ], + "name": "OpenStreetMap.CH" + }, + "France": { + "url": "https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png", + "max_zoom": 20, + "html_attribution": "© OpenStreetMap France | © OpenStreetMap contributors", + "attribution": "(C) OpenStreetMap France | (C) OpenStreetMap contributors", + "name": "OpenStreetMap.France" + }, + "HOT": { + "url": "https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png", + "max_zoom": 19, + "html_attribution": "© OpenStreetMap contributors, Tiles style by Humanitarian OpenStreetMap Team hosted by OpenStreetMap France", + "attribution": "(C) OpenStreetMap contributors, Tiles style by Humanitarian OpenStreetMap Team hosted by OpenStreetMap France", + "name": "OpenStreetMap.HOT" + }, + "BZH": { + "url": "https://tile.openstreetmap.bzh/br/{z}/{x}/{y}.png", + "max_zoom": 19, + "html_attribution": "© OpenStreetMap contributors, Tiles courtesy of Breton OpenStreetMap Team", + "attribution": "(C) OpenStreetMap contributors, Tiles courtesy of Breton OpenStreetMap Team", + "bounds": [ + [ + 46.2, + -5.5 + ], + [ + 50, + 0.7 + ] + ], + "name": "OpenStreetMap.BZH" + }, + "CAT": { + "url": "https://tile.openstreetmap.bzh/ca/{z}/{x}/{y}.png", + "max_zoom": 19, + "html_attribution": "© OpenStreetMap contributors, Tiles courtesy of Breton OpenStreetMap Team", + "attribution": "(C) OpenStreetMap contributors, Tiles courtesy of Breton OpenStreetMap Team", + "name": "OpenStreetMap.CAT" + } + }, + "MapTilesAPI": { + "OSMEnglish": { + "url": "https://maptiles.p.rapidapi.com/{variant}/{z}/{x}/{y}.png?rapidapi-key={apikey}", + "html_attribution": "© MapTiles API, © OpenStreetMap contributors", + "attribution": "(C) MapTiles API, (C) OpenStreetMap contributors", + "variant": "en/map/v1", + "apikey": "", + "max_zoom": 19, + "name": "MapTilesAPI.OSMEnglish" + }, + "OSMFrancais": { + "url": "https://maptiles.p.rapidapi.com/{variant}/{z}/{x}/{y}.png?rapidapi-key={apikey}", + "html_attribution": "© MapTiles API, © OpenStreetMap contributors", + "attribution": "(C) MapTiles API, (C) OpenStreetMap contributors", + "variant": "fr/map/v1", + "apikey": "", + "max_zoom": 19, + "name": "MapTilesAPI.OSMFrancais" + }, + "OSMEspagnol": { + "url": "https://maptiles.p.rapidapi.com/{variant}/{z}/{x}/{y}.png?rapidapi-key={apikey}", + "html_attribution": "© MapTiles API, © OpenStreetMap contributors", + "attribution": "(C) MapTiles API, (C) OpenStreetMap contributors", + "variant": "es/map/v1", + "apikey": "", + "max_zoom": 19, + "name": "MapTilesAPI.OSMEspagnol" + } + }, + "OpenSeaMap": { + "url": "https://tiles.openseamap.org/seamark/{z}/{x}/{y}.png", + "html_attribution": "Map data: © OpenSeaMap contributors", + "attribution": "Map data: (C) OpenSeaMap contributors", + "name": "OpenSeaMap" + }, + "OPNVKarte": { + "url": "https://tileserver.memomaps.de/tilegen/{z}/{x}/{y}.png", + "max_zoom": 18, + "html_attribution": "Map memomaps.de CC-BY-SA, map data © OpenStreetMap contributors", + "attribution": "Map memomaps.de CC-BY-SA, map data (C) OpenStreetMap contributors", + "name": "OPNVKarte" + }, + "OpenTopoMap": { + "url": "https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png", + "max_zoom": 17, + "html_attribution": "Map data: © OpenStreetMap contributors, SRTM | Map style: © OpenTopoMap (CC-BY-SA)", + "attribution": "Map data: (C) OpenStreetMap contributors, SRTM | Map style: (C) OpenTopoMap (CC-BY-SA)", + "name": "OpenTopoMap" + }, + "OpenRailwayMap": { + "url": "https://{s}.tiles.openrailwaymap.org/standard/{z}/{x}/{y}.png", + "max_zoom": 19, + "html_attribution": "Map data: © OpenStreetMap contributors | Map style: © OpenRailwayMap (CC-BY-SA)", + "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) OpenRailwayMap (CC-BY-SA)", + "name": "OpenRailwayMap" + }, + "OpenFireMap": { + "url": "http://openfiremap.org/hytiles/{z}/{x}/{y}.png", + "max_zoom": 19, + "html_attribution": "Map data: © OpenStreetMap contributors | Map style: © OpenFireMap (CC-BY-SA)", + "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) OpenFireMap (CC-BY-SA)", + "name": "OpenFireMap" + }, + "SafeCast": { + "url": "https://s3.amazonaws.com/te512.safecast.org/{z}/{x}/{y}.png", + "max_zoom": 16, + "html_attribution": "Map data: © OpenStreetMap contributors | Map style: © SafeCast (CC-BY-SA)", + "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) SafeCast (CC-BY-SA)", + "name": "SafeCast" + }, + "Stadia": { + "AlidadeSmooth": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}{r}.{ext}", + "min_zoom": 0, + "max_zoom": 20, + "html_attribution": "© Stadia Maps © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) Stadia Maps (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "alidade_smooth", + "ext": "png", + "name": "Stadia.AlidadeSmooth" + }, + "AlidadeSmoothDark": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}{r}.{ext}", + "min_zoom": 0, + "max_zoom": 20, + "html_attribution": "© Stadia Maps © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) Stadia Maps (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "alidade_smooth_dark", + "ext": "png", + "name": "Stadia.AlidadeSmoothDark" + }, + "AlidadeSatellite": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}{r}.{ext}", + "min_zoom": 0, + "max_zoom": 20, + "html_attribution": "© CNES, Distribution Airbus DS, \u00a9 Airbus DS, \u00a9 PlanetObserver (Contains Copernicus Data) | © Stadia Maps © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) CNES, Distribution Airbus DS, \u00a9 Airbus DS, \u00a9 PlanetObserver (Contains Copernicus Data) | (C) Stadia Maps (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "alidade_satellite", + "ext": "jpg", + "name": "Stadia.AlidadeSatellite", + "status": "broken" + }, + "OSMBright": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}{r}.{ext}", + "min_zoom": 0, + "max_zoom": 20, + "html_attribution": "© Stadia Maps © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) Stadia Maps (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "osm_bright", + "ext": "png", + "name": "Stadia.OSMBright" + }, + "Outdoors": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}{r}.{ext}", + "min_zoom": 0, + "max_zoom": 20, + "html_attribution": "© Stadia Maps © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) Stadia Maps (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "outdoors", + "ext": "png", + "name": "Stadia.Outdoors" + }, + "StamenToner": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}{r}.{ext}", + "min_zoom": 0, + "max_zoom": 20, + "html_attribution": "© Stadia Maps © Stamen Design © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) Stadia Maps (C) Stamen Design (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "stamen_toner", + "ext": "png", + "name": "Stadia.StamenToner" + }, + "StamenTonerBackground": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}{r}.{ext}", + "min_zoom": 0, + "max_zoom": 20, + "html_attribution": "© Stadia Maps © Stamen Design © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) Stadia Maps (C) Stamen Design (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "stamen_toner_background", + "ext": "png", + "name": "Stadia.StamenTonerBackground" + }, + "StamenTonerLines": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}{r}.{ext}", + "min_zoom": 0, + "max_zoom": 20, + "html_attribution": "© Stadia Maps © Stamen Design © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) Stadia Maps (C) Stamen Design (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "stamen_toner_lines", + "ext": "png", + "name": "Stadia.StamenTonerLines" + }, + "StamenTonerLabels": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}{r}.{ext}", + "min_zoom": 0, + "max_zoom": 20, + "html_attribution": "© Stadia Maps © Stamen Design © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) Stadia Maps (C) Stamen Design (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "stamen_toner_labels", + "ext": "png", + "name": "Stadia.StamenTonerLabels" + }, + "StamenTonerLite": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}{r}.{ext}", + "min_zoom": 0, + "max_zoom": 20, + "html_attribution": "© Stadia Maps © Stamen Design © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) Stadia Maps (C) Stamen Design (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "stamen_toner_lite", + "ext": "png", + "name": "Stadia.StamenTonerLite" + }, + "StamenWatercolor": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}.{ext}", + "min_zoom": 1, + "max_zoom": 16, + "html_attribution": "© Stadia Maps © Stamen Design © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) Stadia Maps (C) Stamen Design (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "stamen_watercolor", + "ext": "jpg", + "name": "Stadia.StamenWatercolor" + }, + "StamenTerrain": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}{r}.{ext}", + "min_zoom": 0, + "max_zoom": 18, + "html_attribution": "© Stadia Maps © Stamen Design © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) Stadia Maps (C) Stamen Design (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "stamen_terrain", + "ext": "png", + "name": "Stadia.StamenTerrain" + }, + "StamenTerrainBackground": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}{r}.{ext}", + "min_zoom": 0, + "max_zoom": 18, + "html_attribution": "© Stadia Maps © Stamen Design © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) Stadia Maps (C) Stamen Design (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "stamen_terrain_background", + "ext": "png", + "name": "Stadia.StamenTerrainBackground" + }, + "StamenTerrainLabels": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}{r}.{ext}", + "min_zoom": 0, + "max_zoom": 18, + "html_attribution": "© Stadia Maps © Stamen Design © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) Stadia Maps (C) Stamen Design (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "stamen_terrain_labels", + "ext": "png", + "name": "Stadia.StamenTerrainLabels" + }, + "StamenTerrainLines": { + "url": "https://tiles.stadiamaps.com/tiles/{variant}/{z}/{x}/{y}{r}.{ext}", + "min_zoom": 0, + "max_zoom": 18, + "html_attribution": "© Stadia Maps © Stamen Design © OpenMapTiles © OpenStreetMap contributors", + "attribution": "(C) Stadia Maps (C) Stamen Design (C) OpenMapTiles (C) OpenStreetMap contributors", + "variant": "stamen_terrain_lines", + "ext": "png", + "name": "Stadia.StamenTerrainLines" + } + }, + "Thunderforest": { + "OpenCycleMap": { + "url": "https://{s}.tile.thunderforest.com/{variant}/{z}/{x}/{y}{r}.png?apikey={apikey}", + "html_attribution": "© Thunderforest, © OpenStreetMap contributors", + "attribution": "(C) Thunderforest, (C) OpenStreetMap contributors", + "variant": "cycle", + "apikey": "", + "max_zoom": 22, + "name": "Thunderforest.OpenCycleMap" + }, + "Transport": { + "url": "https://{s}.tile.thunderforest.com/{variant}/{z}/{x}/{y}{r}.png?apikey={apikey}", + "html_attribution": "© Thunderforest, © OpenStreetMap contributors", + "attribution": "(C) Thunderforest, (C) OpenStreetMap contributors", + "variant": "transport", + "apikey": "", + "max_zoom": 22, + "name": "Thunderforest.Transport" + }, + "TransportDark": { + "url": "https://{s}.tile.thunderforest.com/{variant}/{z}/{x}/{y}{r}.png?apikey={apikey}", + "html_attribution": "© Thunderforest, © OpenStreetMap contributors", + "attribution": "(C) Thunderforest, (C) OpenStreetMap contributors", + "variant": "transport-dark", + "apikey": "", + "max_zoom": 22, + "name": "Thunderforest.TransportDark" + }, + "SpinalMap": { + "url": "https://{s}.tile.thunderforest.com/{variant}/{z}/{x}/{y}{r}.png?apikey={apikey}", + "html_attribution": "© Thunderforest, © OpenStreetMap contributors", + "attribution": "(C) Thunderforest, (C) OpenStreetMap contributors", + "variant": "spinal-map", + "apikey": "", + "max_zoom": 22, + "name": "Thunderforest.SpinalMap" + }, + "Landscape": { + "url": "https://{s}.tile.thunderforest.com/{variant}/{z}/{x}/{y}{r}.png?apikey={apikey}", + "html_attribution": "© Thunderforest, © OpenStreetMap contributors", + "attribution": "(C) Thunderforest, (C) OpenStreetMap contributors", + "variant": "landscape", + "apikey": "", + "max_zoom": 22, + "name": "Thunderforest.Landscape" + }, + "Outdoors": { + "url": "https://{s}.tile.thunderforest.com/{variant}/{z}/{x}/{y}{r}.png?apikey={apikey}", + "html_attribution": "© Thunderforest, © OpenStreetMap contributors", + "attribution": "(C) Thunderforest, (C) OpenStreetMap contributors", + "variant": "outdoors", + "apikey": "", + "max_zoom": 22, + "name": "Thunderforest.Outdoors" + }, + "Pioneer": { + "url": "https://{s}.tile.thunderforest.com/{variant}/{z}/{x}/{y}{r}.png?apikey={apikey}", + "html_attribution": "© Thunderforest, © OpenStreetMap contributors", + "attribution": "(C) Thunderforest, (C) OpenStreetMap contributors", + "variant": "pioneer", + "apikey": "", + "max_zoom": 22, + "name": "Thunderforest.Pioneer" + }, + "MobileAtlas": { + "url": "https://{s}.tile.thunderforest.com/{variant}/{z}/{x}/{y}{r}.png?apikey={apikey}", + "html_attribution": "© Thunderforest, © OpenStreetMap contributors", + "attribution": "(C) Thunderforest, (C) OpenStreetMap contributors", + "variant": "mobile-atlas", + "apikey": "", + "max_zoom": 22, + "name": "Thunderforest.MobileAtlas" + }, + "Neighbourhood": { + "url": "https://{s}.tile.thunderforest.com/{variant}/{z}/{x}/{y}{r}.png?apikey={apikey}", + "html_attribution": "© Thunderforest, © OpenStreetMap contributors", + "attribution": "(C) Thunderforest, (C) OpenStreetMap contributors", + "variant": "neighbourhood", + "apikey": "", + "max_zoom": 22, + "name": "Thunderforest.Neighbourhood" + } + }, + "BaseMapDE": { + "Color": { + "url": "https://sgx.geodatenzentrum.de/wmts_basemapde/tile/1.0.0/{variant}/default/GLOBAL_WEBMERCATOR/{z}/{y}/{x}.png", + "html_attribution": "Map data: © dl-de/by-2-0", + "attribution": "Map data: (C) dl-de/by-2-0", + "variant": "de_basemapde_web_raster_farbe", + "name": "BaseMapDE.Color" + }, + "Grey": { + "url": "https://sgx.geodatenzentrum.de/wmts_basemapde/tile/1.0.0/{variant}/default/GLOBAL_WEBMERCATOR/{z}/{y}/{x}.png", + "html_attribution": "Map data: © dl-de/by-2-0", + "attribution": "Map data: (C) dl-de/by-2-0", + "variant": "de_basemapde_web_raster_grau", + "name": "BaseMapDE.Grey" + } + }, + "CyclOSM": { + "url": "https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png", + "max_zoom": 20, + "html_attribution": "CyclOSM | Map data: © OpenStreetMap contributors", + "attribution": "CyclOSM | Map data: (C) OpenStreetMap contributors", + "name": "CyclOSM" + }, + "Jawg": { + "Streets": { + "url": "https://tile.jawg.io/{variant}/{z}/{x}/{y}{r}.png?access-token={accessToken}", + "html_attribution": "© JawgMaps © OpenStreetMap contributors", + "attribution": "(C) **Jawg** Maps (C) OpenStreetMap contributors", + "min_zoom": 0, + "max_zoom": 22, + "variant": "jawg-streets", + "accessToken": "", + "name": "Jawg.Streets" + }, + "Terrain": { + "url": "https://tile.jawg.io/{variant}/{z}/{x}/{y}{r}.png?access-token={accessToken}", + "html_attribution": "© JawgMaps © OpenStreetMap contributors", + "attribution": "(C) **Jawg** Maps (C) OpenStreetMap contributors", + "min_zoom": 0, + "max_zoom": 22, + "variant": "jawg-terrain", + "accessToken": "", + "name": "Jawg.Terrain" + }, + "Lagoon": { + "url": "https://tile.jawg.io/{variant}/{z}/{x}/{y}{r}.png?access-token={accessToken}", + "html_attribution": "© JawgMaps © OpenStreetMap contributors", + "attribution": "(C) **Jawg** Maps (C) OpenStreetMap contributors", + "min_zoom": 0, + "max_zoom": 22, + "variant": "jawg-lagoon", + "accessToken": "", + "name": "Jawg.Lagoon" + }, + "Sunny": { + "url": "https://tile.jawg.io/{variant}/{z}/{x}/{y}{r}.png?access-token={accessToken}", + "html_attribution": "© JawgMaps © OpenStreetMap contributors", + "attribution": "(C) **Jawg** Maps (C) OpenStreetMap contributors", + "min_zoom": 0, + "max_zoom": 22, + "variant": "jawg-sunny", + "accessToken": "", + "name": "Jawg.Sunny" + }, + "Dark": { + "url": "https://tile.jawg.io/{variant}/{z}/{x}/{y}{r}.png?access-token={accessToken}", + "html_attribution": "© JawgMaps © OpenStreetMap contributors", + "attribution": "(C) **Jawg** Maps (C) OpenStreetMap contributors", + "min_zoom": 0, + "max_zoom": 22, + "variant": "jawg-dark", + "accessToken": "", + "name": "Jawg.Dark" + }, + "Light": { + "url": "https://tile.jawg.io/{variant}/{z}/{x}/{y}{r}.png?access-token={accessToken}", + "html_attribution": "© JawgMaps © OpenStreetMap contributors", + "attribution": "(C) **Jawg** Maps (C) OpenStreetMap contributors", + "min_zoom": 0, + "max_zoom": 22, + "variant": "jawg-light", + "accessToken": "", + "name": "Jawg.Light" + }, + "Matrix": { + "url": "https://tile.jawg.io/{variant}/{z}/{x}/{y}{r}.png?access-token={accessToken}", + "html_attribution": "© JawgMaps © OpenStreetMap contributors", + "attribution": "(C) **Jawg** Maps (C) OpenStreetMap contributors", + "min_zoom": 0, + "max_zoom": 22, + "variant": "jawg-matrix", + "accessToken": "", + "name": "Jawg.Matrix" + } + }, + "MapBox": { + "url": "https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}{r}?access_token={accessToken}", + "html_attribution": "© Mapbox © OpenStreetMap contributors Improve this map", + "attribution": "(C) Mapbox (C) OpenStreetMap contributors Improve this map", + "tileSize": 512, + "max_zoom": 18, + "zoomOffset": -1, + "id": "mapbox/streets-v11", + "accessToken": "", + "name": "MapBox" + }, + "MapTiler": { + "Streets": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "streets-v2", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Streets" + }, + "Basic": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "basic-v2", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Basic" + }, + "Bright": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "bright-v2", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Bright" + }, + "Pastel": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "pastel", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Pastel" + }, + "Positron": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "positron", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Positron" + }, + "Hybrid": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "hybrid", + "ext": "jpg", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Hybrid" + }, + "Toner": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "toner-v2", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Toner" + }, + "Topo": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "topo-v2", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Topo" + }, + "Voyager": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "voyager-v2", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Voyager" + }, + "Ocean": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "ocean", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Ocean" + }, + "Backdrop": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "backdrop", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Backdrop" + }, + "Dataviz": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "dataviz", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Dataviz" + }, + "DatavizLight": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "dataviz-light", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.DatavizLight" + }, + "DatavizDark": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "dataviz-dark", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.DatavizDark" + }, + "Aquarelle": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "aquarelle", + "ext": "webp", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Aquarelle" + }, + "Landscape": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "landscape", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Landscape" + }, + "Openstreetmap": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "openstreetmap", + "ext": "jpg", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Openstreetmap" + }, + "Outdoor": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "outdoor", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Outdoor" + }, + "Satellite": { + "url": "https://api.maptiler.com/tiles/{variant}/{z}/{x}/{y}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "satellite-v2", + "ext": "jpg", + "key": "", + "min_zoom": 0, + "max_zoom": 20, + "name": "MapTiler.Satellite" + }, + "Winter": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "winter", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Winter" + }, + "Basic4326": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "basic-4326", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Basic4326", + "crs": "EPSG:4326" + }, + "Topographique": { + "url": "https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "topographique", + "ext": "png", + "key": "", + "tileSize": 512, + "zoomOffset": -1, + "min_zoom": 0, + "max_zoom": 21, + "name": "MapTiler.Topographique" + }, + "Terrain": { + "url": "https://api.maptiler.com/tiles/{variant}/{z}/{x}/{y}.{ext}?key={key}", + "html_attribution": "© MapTiler © OpenStreetMap contributors", + "attribution": "(C) MapTiler (C) OpenStreetMap contributors", + "variant": "terrain-rgb", + "ext": "png", + "key": "", + "min_zoom": 0, + "max_zoom": 12, + "name": "MapTiler.Terrain" + } + }, + "TomTom": { + "Basic": { + "url": "https://{s}.api.tomtom.com/map/1/tile/{variant}/{style}/{z}/{x}/{y}.{ext}?key={apikey}", + "variant": "basic", + "max_zoom": 22, + "html_attribution": "© 1992 - 2025 TomTom. ", + "attribution": "(C) 1992 - 2025 TomTom.", + "subdomains": "abcd", + "style": "main", + "ext": "png", + "apikey": "", + "name": "TomTom.Basic" + }, + "Hybrid": { + "url": "https://{s}.api.tomtom.com/map/1/tile/{variant}/{style}/{z}/{x}/{y}.{ext}?key={apikey}", + "variant": "hybrid", + "max_zoom": 22, + "html_attribution": "© 1992 - 2025 TomTom. ", + "attribution": "(C) 1992 - 2025 TomTom.", + "subdomains": "abcd", + "style": "main", + "ext": "png", + "apikey": "", + "name": "TomTom.Hybrid" + }, + "Labels": { + "url": "https://{s}.api.tomtom.com/map/1/tile/{variant}/{style}/{z}/{x}/{y}.{ext}?key={apikey}", + "variant": "labels", + "max_zoom": 22, + "html_attribution": "© 1992 - 2025 TomTom. ", + "attribution": "(C) 1992 - 2025 TomTom.", + "subdomains": "abcd", + "style": "main", + "ext": "png", + "apikey": "", + "name": "TomTom.Labels" + } + }, + "Esri": { + "WorldStreetMap": { + "url": "https://server.arcgisonline.com/ArcGIS/rest/services/{variant}/MapServer/tile/{z}/{y}/{x}", + "variant": "World_Street_Map", + "html_attribution": "Tiles © Esri — Source: Esri, DeLorme, NAVTEQ, USGS, Intermap, iPC, NRCAN, Esri Japan, METI, Esri China (Hong Kong), Esri (Thailand), TomTom, 2012", + "attribution": "Tiles (C) Esri -- Source: Esri, DeLorme, NAVTEQ, USGS, Intermap, iPC, NRCAN, Esri Japan, METI, Esri China (Hong Kong), Esri (Thailand), TomTom, 2012", + "name": "Esri.WorldStreetMap" + }, + "WorldTopoMap": { + "url": "https://server.arcgisonline.com/ArcGIS/rest/services/{variant}/MapServer/tile/{z}/{y}/{x}", + "variant": "World_Topo_Map", + "html_attribution": "Tiles © Esri — Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community", + "attribution": "Tiles (C) Esri -- Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community", + "name": "Esri.WorldTopoMap" + }, + "WorldImagery": { + "url": "https://server.arcgisonline.com/ArcGIS/rest/services/{variant}/MapServer/tile/{z}/{y}/{x}", + "variant": "World_Imagery", + "html_attribution": "Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community", + "attribution": "Tiles (C) Esri -- Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community", + "name": "Esri.WorldImagery" + }, + "WorldTerrain": { + "url": "https://server.arcgisonline.com/ArcGIS/rest/services/{variant}/MapServer/tile/{z}/{y}/{x}", + "variant": "World_Terrain_Base", + "html_attribution": "Tiles © Esri — Source: USGS, Esri, TANA, DeLorme, and NPS", + "attribution": "Tiles (C) Esri -- Source: USGS, Esri, TANA, DeLorme, and NPS", + "max_zoom": 13, + "name": "Esri.WorldTerrain" + }, + "WorldShadedRelief": { + "url": "https://server.arcgisonline.com/ArcGIS/rest/services/{variant}/MapServer/tile/{z}/{y}/{x}", + "variant": "World_Shaded_Relief", + "html_attribution": "Tiles © Esri — Source: Esri", + "attribution": "Tiles (C) Esri -- Source: Esri", + "max_zoom": 13, + "name": "Esri.WorldShadedRelief" + }, + "WorldPhysical": { + "url": "https://server.arcgisonline.com/ArcGIS/rest/services/{variant}/MapServer/tile/{z}/{y}/{x}", + "variant": "World_Physical_Map", + "html_attribution": "Tiles © Esri — Source: US National Park Service", + "attribution": "Tiles (C) Esri -- Source: US National Park Service", + "max_zoom": 8, + "name": "Esri.WorldPhysical" + }, + "OceanBasemap": { + "url": "https://server.arcgisonline.com/ArcGIS/rest/services/{variant}/MapServer/tile/{z}/{y}/{x}", + "variant": "Ocean/World_Ocean_Base", + "html_attribution": "Tiles © Esri — Sources: GEBCO, NOAA, CHS, OSU, UNH, CSUMB, National Geographic, DeLorme, NAVTEQ, and Esri", + "attribution": "Tiles (C) Esri -- Sources: GEBCO, NOAA, CHS, OSU, UNH, CSUMB, National Geographic, DeLorme, NAVTEQ, and Esri", + "max_zoom": 13, + "name": "Esri.OceanBasemap" + }, + "NatGeoWorldMap": { + "url": "https://server.arcgisonline.com/ArcGIS/rest/services/{variant}/MapServer/tile/{z}/{y}/{x}", + "variant": "NatGeo_World_Map", + "html_attribution": "Tiles © Esri — National Geographic, Esri, DeLorme, NAVTEQ, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, iPC", + "attribution": "Tiles (C) Esri -- National Geographic, Esri, DeLorme, NAVTEQ, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, iPC", + "max_zoom": 16, + "name": "Esri.NatGeoWorldMap" + }, + "WorldGrayCanvas": { + "url": "https://server.arcgisonline.com/ArcGIS/rest/services/{variant}/MapServer/tile/{z}/{y}/{x}", + "variant": "Canvas/World_Light_Gray_Base", + "html_attribution": "Tiles © Esri — Esri, DeLorme, NAVTEQ", + "attribution": "Tiles (C) Esri -- Esri, DeLorme, NAVTEQ", + "max_zoom": 16, + "name": "Esri.WorldGrayCanvas" + }, + "ArcticImagery": { + "url": "http://server.arcgisonline.com/ArcGIS/rest/services/Polar/Arctic_Imagery/MapServer/tile/{z}/{y}/{x}", + "variant": "Arctic_Imagery", + "html_attribution": "Earthstar Geographics", + "attribution": "Earthstar Geographics", + "max_zoom": 24, + "name": "Esri.ArcticImagery", + "crs": "EPSG:5936", + "bounds": [ + [ + -2623285.8808999993, + -2623285.8808999993 + ], + [ + 6623285.8803, + 6623285.8803 + ] + ] + }, + "ArcticOceanBase": { + "url": "http://server.arcgisonline.com/ArcGIS/rest/services/Polar/Arctic_Ocean_Base/MapServer/tile/{z}/{y}/{x}", + "variant": "Arctic_Ocean_Base", + "html_attribution": "Tiles © Esri — Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community", + "attribution": "Tiles © Esri — Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community", + "max_zoom": 24, + "name": "Esri.ArcticOceanBase", + "crs": "EPSG:5936", + "bounds": [ + [ + -2623285.8808999993, + -2623285.8808999993 + ], + [ + 6623285.8803, + 6623285.8803 + ] + ] + }, + "ArcticOceanReference": { + "url": "http://server.arcgisonline.com/ArcGIS/rest/services/Polar/Arctic_Ocean_Reference/MapServer/tile/{z}/{y}/{x}", + "variant": "Arctic_Ocean_Reference", + "html_attribution": "Tiles © Esri — Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community", + "attribution": "Tiles © Esri — Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community", + "max_zoom": 24, + "name": "Esri.ArcticOceanReference", + "crs": "EPSG:5936", + "bounds": [ + [ + -2623285.8808999993, + -2623285.8808999993 + ], + [ + 6623285.8803, + 6623285.8803 + ] + ] + }, + "AntarcticImagery": { + "url": "http://server.arcgisonline.com/ArcGIS/rest/services/Polar/Antarctic_Imagery/MapServer/tile/{z}/{y}/{x}", + "variant": "Antarctic_Imagery", + "html_attribution": "Earthstar Geographics", + "attribution": "Earthstar Geographics", + "max_zoom": 24, + "name": "Esri.AntarcticImagery", + "crs": "EPSG:3031", + "bounds": [ + [ + -9913957.327914657, + -5730886.461772691 + ], + [ + 9913957.327914657, + 5730886.461773157 + ] + ] + }, + "AntarcticBasemap": { + "url": "https://tiles.arcgis.com/tiles/C8EMgrsFcRFL6LrL/arcgis/rest/services/Antarctic_Basemap/MapServer/tile/{z}/{y}/{x}", + "variant": "Antarctic_Basemap", + "html_attribution": "Imagery provided by NOAA National Centers for Environmental Information (NCEI); International Bathymetric Chart of the Southern Ocean (IBCSO); General Bathymetric Chart of the Oceans (GEBCO).", + "attribution": "Imagery provided by NOAA National Centers for Environmental Information (NCEI); International Bathymetric Chart of the Southern Ocean (IBCSO); General Bathymetric Chart of the Oceans (GEBCO).", + "max_zoom": 9, + "name": "Esri.AntarcticBasemap", + "crs": "EPSG:3031", + "bounds": [ + [ + -4524583.19363305, + -4524449.487765655 + ], + [ + 4524449.4877656475, + 4524583.193633042 + ] + ] + } + }, + "OpenWeatherMap": { + "Clouds": { + "url": "http://{s}.tile.openweathermap.org/map/{variant}/{z}/{x}/{y}.png?appid={apiKey}", + "max_zoom": 19, + "html_attribution": "Map data © OpenWeatherMap", + "attribution": "Map data (C) OpenWeatherMap", + "apiKey": "", + "opacity": 0.5, + "variant": "clouds", + "name": "OpenWeatherMap.Clouds" + }, + "CloudsClassic": { + "url": "http://{s}.tile.openweathermap.org/map/{variant}/{z}/{x}/{y}.png?appid={apiKey}", + "max_zoom": 19, + "html_attribution": "Map data © OpenWeatherMap", + "attribution": "Map data (C) OpenWeatherMap", + "apiKey": "", + "opacity": 0.5, + "variant": "clouds_cls", + "name": "OpenWeatherMap.CloudsClassic" + }, + "Precipitation": { + "url": "http://{s}.tile.openweathermap.org/map/{variant}/{z}/{x}/{y}.png?appid={apiKey}", + "max_zoom": 19, + "html_attribution": "Map data © OpenWeatherMap", + "attribution": "Map data (C) OpenWeatherMap", + "apiKey": "", + "opacity": 0.5, + "variant": "precipitation", + "name": "OpenWeatherMap.Precipitation" + }, + "PrecipitationClassic": { + "url": "http://{s}.tile.openweathermap.org/map/{variant}/{z}/{x}/{y}.png?appid={apiKey}", + "max_zoom": 19, + "html_attribution": "Map data © OpenWeatherMap", + "attribution": "Map data (C) OpenWeatherMap", + "apiKey": "", + "opacity": 0.5, + "variant": "precipitation_cls", + "name": "OpenWeatherMap.PrecipitationClassic" + }, + "Rain": { + "url": "http://{s}.tile.openweathermap.org/map/{variant}/{z}/{x}/{y}.png?appid={apiKey}", + "max_zoom": 19, + "html_attribution": "Map data © OpenWeatherMap", + "attribution": "Map data (C) OpenWeatherMap", + "apiKey": "", + "opacity": 0.5, + "variant": "rain", + "name": "OpenWeatherMap.Rain" + }, + "RainClassic": { + "url": "http://{s}.tile.openweathermap.org/map/{variant}/{z}/{x}/{y}.png?appid={apiKey}", + "max_zoom": 19, + "html_attribution": "Map data © OpenWeatherMap", + "attribution": "Map data (C) OpenWeatherMap", + "apiKey": "", + "opacity": 0.5, + "variant": "rain_cls", + "name": "OpenWeatherMap.RainClassic" + }, + "Pressure": { + "url": "http://{s}.tile.openweathermap.org/map/{variant}/{z}/{x}/{y}.png?appid={apiKey}", + "max_zoom": 19, + "html_attribution": "Map data © OpenWeatherMap", + "attribution": "Map data (C) OpenWeatherMap", + "apiKey": "", + "opacity": 0.5, + "variant": "pressure", + "name": "OpenWeatherMap.Pressure" + }, + "PressureContour": { + "url": "http://{s}.tile.openweathermap.org/map/{variant}/{z}/{x}/{y}.png?appid={apiKey}", + "max_zoom": 19, + "html_attribution": "Map data © OpenWeatherMap", + "attribution": "Map data (C) OpenWeatherMap", + "apiKey": "", + "opacity": 0.5, + "variant": "pressure_cntr", + "name": "OpenWeatherMap.PressureContour" + }, + "Wind": { + "url": "http://{s}.tile.openweathermap.org/map/{variant}/{z}/{x}/{y}.png?appid={apiKey}", + "max_zoom": 19, + "html_attribution": "Map data © OpenWeatherMap", + "attribution": "Map data (C) OpenWeatherMap", + "apiKey": "", + "opacity": 0.5, + "variant": "wind", + "name": "OpenWeatherMap.Wind" + }, + "Temperature": { + "url": "http://{s}.tile.openweathermap.org/map/{variant}/{z}/{x}/{y}.png?appid={apiKey}", + "max_zoom": 19, + "html_attribution": "Map data © OpenWeatherMap", + "attribution": "Map data (C) OpenWeatherMap", + "apiKey": "", + "opacity": 0.5, + "variant": "temp", + "name": "OpenWeatherMap.Temperature" + }, + "Snow": { + "url": "http://{s}.tile.openweathermap.org/map/{variant}/{z}/{x}/{y}.png?appid={apiKey}", + "max_zoom": 19, + "html_attribution": "Map data © OpenWeatherMap", + "attribution": "Map data (C) OpenWeatherMap", + "apiKey": "", + "opacity": 0.5, + "variant": "snow", + "name": "OpenWeatherMap.Snow" + } + }, + "HERE": { + "normalDay": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.day", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.normalDay" + }, + "normalDayCustom": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.day.custom", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.normalDayCustom" + }, + "normalDayGrey": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.day.grey", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.normalDayGrey" + }, + "normalDayMobile": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.day.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.normalDayMobile" + }, + "normalDayGreyMobile": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.day.grey.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.normalDayGreyMobile" + }, + "normalDayTransit": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.day.transit", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.normalDayTransit" + }, + "normalDayTransitMobile": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.day.transit.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.normalDayTransitMobile" + }, + "normalDayTraffic": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "traffic", + "variant": "normal.traffic.day", + "max_zoom": 20, + "type": "traffictile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.normalDayTraffic" + }, + "normalNight": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.night", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.normalNight" + }, + "normalNightMobile": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.night.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.normalNightMobile" + }, + "normalNightGrey": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.night.grey", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.normalNightGrey" + }, + "normalNightGreyMobile": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.night.grey.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.normalNightGreyMobile" + }, + "normalNightTransit": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.night.transit", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.normalNightTransit" + }, + "normalNightTransitMobile": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.night.transit.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.normalNightTransitMobile" + }, + "reducedDay": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "reduced.day", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.reducedDay" + }, + "reducedNight": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "reduced.night", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.reducedNight" + }, + "basicMap": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.day", + "max_zoom": 20, + "type": "basetile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.basicMap" + }, + "mapLabels": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "normal.day", + "max_zoom": 20, + "type": "labeltile", + "language": "eng", + "format": "png", + "size": "256", + "name": "HERE.mapLabels" + }, + "trafficFlow": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "traffic", + "variant": "normal.day", + "max_zoom": 20, + "type": "flowtile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.trafficFlow" + }, + "carnavDayGrey": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "carnav.day.grey", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.carnavDayGrey" + }, + "hybridDay": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "aerial", + "variant": "hybrid.day", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.hybridDay" + }, + "hybridDayMobile": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "aerial", + "variant": "hybrid.day.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.hybridDayMobile" + }, + "hybridDayTransit": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "aerial", + "variant": "hybrid.day.transit", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.hybridDayTransit" + }, + "hybridDayGrey": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "aerial", + "variant": "hybrid.grey.day", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.hybridDayGrey" + }, + "hybridDayTraffic": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "traffic", + "variant": "hybrid.traffic.day", + "max_zoom": 20, + "type": "traffictile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.hybridDayTraffic" + }, + "pedestrianDay": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "pedestrian.day", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.pedestrianDay" + }, + "pedestrianNight": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "base", + "variant": "pedestrian.night", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.pedestrianNight" + }, + "satelliteDay": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "aerial", + "variant": "satellite.day", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.satelliteDay" + }, + "terrainDay": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "aerial", + "variant": "terrain.day", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.terrainDay" + }, + "terrainDayMobile": { + "url": "https://{s}.{base}.maps.api.here.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?app_id={app_id}&app_code={app_code}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "app_id": "", + "app_code": "", + "base": "aerial", + "variant": "terrain.day.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HERE.terrainDayMobile" + } + }, + "HEREv3": { + "normalDay": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.day", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.normalDay" + }, + "normalDayCustom": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.day.custom", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.normalDayCustom" + }, + "normalDayGrey": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.day.grey", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.normalDayGrey" + }, + "normalDayMobile": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.day.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.normalDayMobile" + }, + "normalDayGreyMobile": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.day.grey.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.normalDayGreyMobile" + }, + "normalDayTransit": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.day.transit", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.normalDayTransit" + }, + "normalDayTransitMobile": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.day.transit.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.normalDayTransitMobile" + }, + "normalNight": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.night", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.normalNight" + }, + "normalNightMobile": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.night.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.normalNightMobile" + }, + "normalNightGrey": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.night.grey", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.normalNightGrey" + }, + "normalNightGreyMobile": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.night.grey.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.normalNightGreyMobile" + }, + "normalNightTransit": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.night.transit", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.normalNightTransit" + }, + "normalNightTransitMobile": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.night.transit.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.normalNightTransitMobile" + }, + "reducedDay": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "reduced.day", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.reducedDay" + }, + "reducedNight": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "reduced.night", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.reducedNight" + }, + "basicMap": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.day", + "max_zoom": 20, + "type": "basetile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.basicMap" + }, + "mapLabels": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "normal.day", + "max_zoom": 20, + "type": "labeltile", + "language": "eng", + "format": "png", + "size": "256", + "name": "HEREv3.mapLabels" + }, + "trafficFlow": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "traffic", + "variant": "normal.day", + "max_zoom": 20, + "type": "flowtile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.trafficFlow", + "status": "broken" + }, + "carnavDayGrey": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "carnav.day.grey", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.carnavDayGrey" + }, + "hybridDay": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "aerial", + "variant": "hybrid.day", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.hybridDay" + }, + "hybridDayMobile": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "aerial", + "variant": "hybrid.day.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.hybridDayMobile" + }, + "hybridDayTransit": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "aerial", + "variant": "hybrid.day.transit", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.hybridDayTransit" + }, + "hybridDayGrey": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "aerial", + "variant": "hybrid.grey.day", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.hybridDayGrey" + }, + "pedestrianDay": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "pedestrian.day", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.pedestrianDay" + }, + "pedestrianNight": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "base", + "variant": "pedestrian.night", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.pedestrianNight" + }, + "satelliteDay": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "aerial", + "variant": "satellite.day", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.satelliteDay" + }, + "terrainDay": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "aerial", + "variant": "terrain.day", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.terrainDay" + }, + "terrainDayMobile": { + "url": "https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?apiKey={apiKey}&lg={language}", + "html_attribution": "Map © 1987-2025 HERE", + "attribution": "Map (C) 1987-2025 HERE", + "subdomains": "1234", + "mapID": "newest", + "apiKey": "", + "base": "aerial", + "variant": "terrain.day.mobile", + "max_zoom": 20, + "type": "maptile", + "language": "eng", + "format": "png8", + "size": "256", + "name": "HEREv3.terrainDayMobile" + } + }, + "FreeMapSK": { + "url": "https://{s}.freemap.sk/T/{z}/{x}/{y}.jpeg", + "min_zoom": 8, + "max_zoom": 16, + "subdomains": "abcd", + "bounds": [ + [ + 47.204642, + 15.996093 + ], + [ + 49.830896, + 22.576904 + ] + ], + "html_attribution": "© OpenStreetMap contributors, visualization CC-By-SA 2.0 Freemap.sk", + "attribution": "(C) OpenStreetMap contributors, visualization CC-By-SA 2.0 Freemap.sk", + "name": "FreeMapSK" + }, + "MtbMap": { + "url": "http://tile.mtbmap.cz/mtbmap_tiles/{z}/{x}/{y}.png", + "html_attribution": "© OpenStreetMap contributors & USGS", + "attribution": "(C) OpenStreetMap contributors & USGS", + "name": "MtbMap" + }, + "CartoDB": { + "Positron": { + "url": "https://{s}.basemaps.cartocdn.com/{variant}/{z}/{x}/{y}{r}.png", + "html_attribution": "© OpenStreetMap contributors © CARTO", + "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "subdomains": "abcd", + "max_zoom": 20, + "variant": "light_all", + "name": "CartoDB.Positron" + }, + "PositronNoLabels": { + "url": "https://{s}.basemaps.cartocdn.com/{variant}/{z}/{x}/{y}{r}.png", + "html_attribution": "© OpenStreetMap contributors © CARTO", + "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "subdomains": "abcd", + "max_zoom": 20, + "variant": "light_nolabels", + "name": "CartoDB.PositronNoLabels" + }, + "PositronOnlyLabels": { + "url": "https://{s}.basemaps.cartocdn.com/{variant}/{z}/{x}/{y}{r}.png", + "html_attribution": "© OpenStreetMap contributors © CARTO", + "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "subdomains": "abcd", + "max_zoom": 20, + "variant": "light_only_labels", + "name": "CartoDB.PositronOnlyLabels" + }, + "DarkMatter": { + "url": "https://{s}.basemaps.cartocdn.com/{variant}/{z}/{x}/{y}{r}.png", + "html_attribution": "© OpenStreetMap contributors © CARTO", + "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "subdomains": "abcd", + "max_zoom": 20, + "variant": "dark_all", + "name": "CartoDB.DarkMatter" + }, + "DarkMatterNoLabels": { + "url": "https://{s}.basemaps.cartocdn.com/{variant}/{z}/{x}/{y}{r}.png", + "html_attribution": "© OpenStreetMap contributors © CARTO", + "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "subdomains": "abcd", + "max_zoom": 20, + "variant": "dark_nolabels", + "name": "CartoDB.DarkMatterNoLabels" + }, + "DarkMatterOnlyLabels": { + "url": "https://{s}.basemaps.cartocdn.com/{variant}/{z}/{x}/{y}{r}.png", + "html_attribution": "© OpenStreetMap contributors © CARTO", + "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "subdomains": "abcd", + "max_zoom": 20, + "variant": "dark_only_labels", + "name": "CartoDB.DarkMatterOnlyLabels" + }, + "Voyager": { + "url": "https://{s}.basemaps.cartocdn.com/{variant}/{z}/{x}/{y}{r}.png", + "html_attribution": "© OpenStreetMap contributors © CARTO", + "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "subdomains": "abcd", + "max_zoom": 20, + "variant": "rastertiles/voyager", + "name": "CartoDB.Voyager" + }, + "VoyagerNoLabels": { + "url": "https://{s}.basemaps.cartocdn.com/{variant}/{z}/{x}/{y}{r}.png", + "html_attribution": "© OpenStreetMap contributors © CARTO", + "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "subdomains": "abcd", + "max_zoom": 20, + "variant": "rastertiles/voyager_nolabels", + "name": "CartoDB.VoyagerNoLabels" + }, + "VoyagerOnlyLabels": { + "url": "https://{s}.basemaps.cartocdn.com/{variant}/{z}/{x}/{y}{r}.png", + "html_attribution": "© OpenStreetMap contributors © CARTO", + "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "subdomains": "abcd", + "max_zoom": 20, + "variant": "rastertiles/voyager_only_labels", + "name": "CartoDB.VoyagerOnlyLabels" + }, + "VoyagerLabelsUnder": { + "url": "https://{s}.basemaps.cartocdn.com/{variant}/{z}/{x}/{y}{r}.png", + "html_attribution": "© OpenStreetMap contributors © CARTO", + "attribution": "(C) OpenStreetMap contributors (C) CARTO", + "subdomains": "abcd", + "max_zoom": 20, + "variant": "rastertiles/voyager_labels_under", + "name": "CartoDB.VoyagerLabelsUnder" + } + }, + "HikeBike": { + "HikeBike": { + "url": "https://tiles.wmflabs.org/{variant}/{z}/{x}/{y}.png", + "max_zoom": 19, + "html_attribution": "© OpenStreetMap contributors", + "attribution": "(C) OpenStreetMap contributors", + "variant": "hikebike", + "name": "HikeBike.HikeBike" + }, + "HillShading": { + "url": "https://tiles.wmflabs.org/{variant}/{z}/{x}/{y}.png", + "max_zoom": 15, + "html_attribution": "© OpenStreetMap contributors", + "attribution": "(C) OpenStreetMap contributors", + "variant": "hillshading", + "name": "HikeBike.HillShading" + } + }, + "BasemapAT": { + "basemap": { + "url": "https://mapsneu.wien.gv.at/basemap/{variant}/{type}/google3857/{z}/{y}/{x}.{format}", + "max_zoom": 20, + "html_attribution": "Datenquelle: basemap.at", + "attribution": "Datenquelle: basemap.at", + "type": "normal", + "format": "png", + "bounds": [ + [ + 46.35877, + 8.782379 + ], + [ + 49.037872, + 17.189532 + ] + ], + "variant": "geolandbasemap", + "name": "BasemapAT.basemap" + }, + "grau": { + "url": "https://mapsneu.wien.gv.at/basemap/{variant}/{type}/google3857/{z}/{y}/{x}.{format}", + "max_zoom": 19, + "html_attribution": "Datenquelle: basemap.at", + "attribution": "Datenquelle: basemap.at", + "type": "normal", + "format": "png", + "bounds": [ + [ + 46.35877, + 8.782379 + ], + [ + 49.037872, + 17.189532 + ] + ], + "variant": "bmapgrau", + "name": "BasemapAT.grau" + }, + "overlay": { + "url": "https://mapsneu.wien.gv.at/basemap/{variant}/{type}/google3857/{z}/{y}/{x}.{format}", + "max_zoom": 19, + "html_attribution": "Datenquelle: basemap.at", + "attribution": "Datenquelle: basemap.at", + "type": "normal", + "format": "png", + "bounds": [ + [ + 46.35877, + 8.782379 + ], + [ + 49.037872, + 17.189532 + ] + ], + "variant": "bmapoverlay", + "name": "BasemapAT.overlay" + }, + "terrain": { + "url": "https://mapsneu.wien.gv.at/basemap/{variant}/{type}/google3857/{z}/{y}/{x}.{format}", + "max_zoom": 19, + "html_attribution": "Datenquelle: basemap.at", + "attribution": "Datenquelle: basemap.at", + "type": "grau", + "format": "jpeg", + "bounds": [ + [ + 46.35877, + 8.782379 + ], + [ + 49.037872, + 17.189532 + ] + ], + "variant": "bmapgelaende", + "name": "BasemapAT.terrain" + }, + "surface": { + "url": "https://mapsneu.wien.gv.at/basemap/{variant}/{type}/google3857/{z}/{y}/{x}.{format}", + "max_zoom": 19, + "html_attribution": "Datenquelle: basemap.at", + "attribution": "Datenquelle: basemap.at", + "type": "grau", + "format": "jpeg", + "bounds": [ + [ + 46.35877, + 8.782379 + ], + [ + 49.037872, + 17.189532 + ] + ], + "variant": "bmapoberflaeche", + "name": "BasemapAT.surface" + }, + "highdpi": { + "url": "https://mapsneu.wien.gv.at/basemap/{variant}/{type}/google3857/{z}/{y}/{x}.{format}", + "max_zoom": 19, + "html_attribution": "Datenquelle: basemap.at", + "attribution": "Datenquelle: basemap.at", + "type": "normal", + "format": "jpeg", + "bounds": [ + [ + 46.35877, + 8.782379 + ], + [ + 49.037872, + 17.189532 + ] + ], + "variant": "bmaphidpi", + "name": "BasemapAT.highdpi" + }, + "orthofoto": { + "url": "https://mapsneu.wien.gv.at/basemap/{variant}/{type}/google3857/{z}/{y}/{x}.{format}", + "max_zoom": 20, + "html_attribution": "Datenquelle: basemap.at", + "attribution": "Datenquelle: basemap.at", + "type": "normal", + "format": "jpeg", + "bounds": [ + [ + 46.35877, + 8.782379 + ], + [ + 49.037872, + 17.189532 + ] + ], + "variant": "bmaporthofoto30cm", + "name": "BasemapAT.orthofoto" + } + }, + "nlmaps": { + "standaard": { + "url": "https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/{variant}/EPSG:3857/{z}/{x}/{y}.png", + "min_zoom": 6, + "max_zoom": 19, + "bounds": [ + [ + 50.5, + 3.25 + ], + [ + 54, + 7.6 + ] + ], + "html_attribution": "Kaartgegevens © Kadaster", + "attribution": "Kaartgegevens (C) Kadaster", + "variant": "standaard", + "name": "nlmaps.standaard" + }, + "pastel": { + "url": "https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/{variant}/EPSG:3857/{z}/{x}/{y}.png", + "min_zoom": 6, + "max_zoom": 19, + "bounds": [ + [ + 50.5, + 3.25 + ], + [ + 54, + 7.6 + ] + ], + "html_attribution": "Kaartgegevens © Kadaster", + "attribution": "Kaartgegevens (C) Kadaster", + "variant": "pastel", + "name": "nlmaps.pastel" + }, + "grijs": { + "url": "https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/{variant}/EPSG:3857/{z}/{x}/{y}.png", + "min_zoom": 6, + "max_zoom": 19, + "bounds": [ + [ + 50.5, + 3.25 + ], + [ + 54, + 7.6 + ] + ], + "html_attribution": "Kaartgegevens © Kadaster", + "attribution": "Kaartgegevens (C) Kadaster", + "variant": "grijs", + "name": "nlmaps.grijs" + }, + "water": { + "url": "https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/{variant}/EPSG:3857/{z}/{x}/{y}.png", + "min_zoom": 6, + "max_zoom": 19, + "bounds": [ + [ + 50.5, + 3.25 + ], + [ + 54, + 7.6 + ] + ], + "html_attribution": "Kaartgegevens © Kadaster", + "attribution": "Kaartgegevens (C) Kadaster", + "variant": "water", + "name": "nlmaps.water" + }, + "luchtfoto": { + "url": "https://service.pdok.nl/hwh/luchtfotorgb/wmts/v1_0/Actueel_ortho25/EPSG:3857/{z}/{x}/{y}.jpeg", + "min_zoom": 6, + "max_zoom": 19, + "bounds": [ + [ + 50.5, + 3.25 + ], + [ + 54, + 7.6 + ] + ], + "html_attribution": "Kaartgegevens © Kadaster", + "attribution": "Kaartgegevens (C) Kadaster", + "name": "nlmaps.luchtfoto" + } + }, + "NASAGIBS": { + "ModisTerraTrueColorCR": { + "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/{variant}/default/{time}/{tilematrixset}{max_zoom}/{z}/{y}/{x}.{format}", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "bounds": [ + [ + -85.0511287776, + -179.999999975 + ], + [ + 85.0511287776, + 179.999999975 + ] + ], + "min_zoom": 1, + "max_zoom": 9, + "format": "jpg", + "time": "", + "tilematrixset": "GoogleMapsCompatible_Level", + "variant": "MODIS_Terra_CorrectedReflectance_TrueColor", + "name": "NASAGIBS.ModisTerraTrueColorCR" + }, + "ModisTerraBands367CR": { + "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/{variant}/default/{time}/{tilematrixset}{max_zoom}/{z}/{y}/{x}.{format}", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "bounds": [ + [ + -85.0511287776, + -179.999999975 + ], + [ + 85.0511287776, + 179.999999975 + ] + ], + "min_zoom": 1, + "max_zoom": 9, + "format": "jpg", + "time": "", + "tilematrixset": "GoogleMapsCompatible_Level", + "variant": "MODIS_Terra_CorrectedReflectance_Bands367", + "name": "NASAGIBS.ModisTerraBands367CR" + }, + "ViirsEarthAtNight2012": { + "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/{variant}/default/{time}/{tilematrixset}{max_zoom}/{z}/{y}/{x}.{format}", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "bounds": [ + [ + -85.0511287776, + -179.999999975 + ], + [ + 85.0511287776, + 179.999999975 + ] + ], + "min_zoom": 1, + "max_zoom": 8, + "format": "jpg", + "time": "", + "tilematrixset": "GoogleMapsCompatible_Level", + "variant": "VIIRS_CityLights_2012", + "name": "NASAGIBS.ViirsEarthAtNight2012" + }, + "ModisTerraLSTDay": { + "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/{variant}/default/{time}/{tilematrixset}{max_zoom}/{z}/{y}/{x}.{format}", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "bounds": [ + [ + -85.0511287776, + -179.999999975 + ], + [ + 85.0511287776, + 179.999999975 + ] + ], + "min_zoom": 1, + "max_zoom": 7, + "format": "png", + "time": "", + "tilematrixset": "GoogleMapsCompatible_Level", + "variant": "MODIS_Terra_Land_Surface_Temp_Day", + "opacity": 0.75, + "name": "NASAGIBS.ModisTerraLSTDay" + }, + "ModisTerraSnowCover": { + "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/{variant}/default/{time}/{tilematrixset}{max_zoom}/{z}/{y}/{x}.{format}", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "bounds": [ + [ + -85.0511287776, + -179.999999975 + ], + [ + 85.0511287776, + 179.999999975 + ] + ], + "min_zoom": 1, + "max_zoom": 8, + "format": "png", + "time": "", + "tilematrixset": "GoogleMapsCompatible_Level", + "variant": "MODIS_Terra_NDSI_Snow_Cover", + "opacity": 0.75, + "name": "NASAGIBS.ModisTerraSnowCover" + }, + "ModisTerraAOD": { + "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/{variant}/default/{time}/{tilematrixset}{max_zoom}/{z}/{y}/{x}.{format}", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "bounds": [ + [ + -85.0511287776, + -179.999999975 + ], + [ + 85.0511287776, + 179.999999975 + ] + ], + "min_zoom": 1, + "max_zoom": 6, + "format": "png", + "time": "", + "tilematrixset": "GoogleMapsCompatible_Level", + "variant": "MODIS_Terra_Aerosol", + "opacity": 0.75, + "name": "NASAGIBS.ModisTerraAOD" + }, + "ModisTerraChlorophyll": { + "url": "https://map1.vis.earthdata.nasa.gov/wmts-webmerc/{variant}/default/{time}/{tilematrixset}{max_zoom}/{z}/{y}/{x}.{format}", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "bounds": [ + [ + -85.0511287776, + -179.999999975 + ], + [ + 85.0511287776, + 179.999999975 + ] + ], + "min_zoom": 1, + "max_zoom": 7, + "format": "png", + "time": "", + "tilematrixset": "GoogleMapsCompatible_Level", + "variant": "MODIS_Terra_L2_Chlorophyll_A", + "opacity": 0.75, + "name": "NASAGIBS.ModisTerraChlorophyll", + "status": "broken" + }, + "ModisTerraBands721CR": { + "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_CorrectedReflectance_Bands721/default/{time}/GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg", + "max_zoom": 9, + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "name": "NASAGIBS.ModisTerraBands721CR", + "time": "" + }, + "ModisAquaTrueColorCR": { + "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_CorrectedReflectance_TrueColor/default/{time}/GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg", + "max_zoom": 9, + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "name": "NASAGIBS.ModisAquaTrueColorCR", + "time": "" + }, + "ModisAquaBands721CR": { + "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_CorrectedReflectance_Bands721/default/{time}/GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg", + "max_zoom": 9, + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "name": "NASAGIBS.ModisAquaBands721CR", + "time": "" + }, + "ViirsTrueColorCR": { + "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_SNPP_CorrectedReflectance_TrueColor/default/{time}/GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg", + "max_zoom": 9, + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "name": "NASAGIBS.ViirsTrueColorCR", + "time": "" + }, + "BlueMarble": { + "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/BlueMarble_NextGeneration/default/GoogleMapsCompatible_Level8/{z}/{y}/{x}.jpeg", + "max_zoom": 8, + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "name": "NASAGIBS.BlueMarble", + "crs": "EPSG:3857" + }, + "BlueMarble3413": { + "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3413/best/BlueMarble_NextGeneration/default/500m/{z}/{y}/{x}.jpeg", + "max_zoom": 5, + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "name": "NASAGIBS.BlueMarble3413", + "crs": "EPSG:3413" + }, + "BlueMarble3031": { + "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3031/best/BlueMarble_NextGeneration/default/500m/{z}/{y}/{x}.jpeg", + "max_zoom": 5, + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "name": "NASAGIBS.BlueMarble3031", + "crs": "EPSG:3031" + }, + "BlueMarbleBathymetry3413": { + "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3413/best/BlueMarble_ShadedRelief_Bathymetry/default/500m/{z}/{y}/{x}.jpeg", + "max_zoom": 5, + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "name": "NASAGIBS.BlueMarbleBathymetry3413", + "crs": "EPSG:3413" + }, + "BlueMarbleBathymetry3031": { + "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3031/best/BlueMarble_ShadedRelief_Bathymetry/default/500m/{z}/{y}/{x}.jpeg", + "max_zoom": 5, + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "name": "NASAGIBS.BlueMarbleBathymetry3031", + "crs": "EPSG:3031" + }, + "MEaSUREsIceVelocity3413": { + "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3413/best/MEaSUREs_Ice_Velocity_Greenland/default/500m/{z}/{y}/{x}", + "max_zoom": 4, + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "name": "NASAGIBS.MEaSUREsIceVelocity3413", + "crs": "EPSG:3413" + }, + "MEaSUREsIceVelocity3031": { + "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3031/best/MEaSUREs_Ice_Velocity_Antarctica/default/500m/{z}/{y}/{x}", + "max_zoom": 4, + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "name": "NASAGIBS.MEaSUREsIceVelocity3031", + "crs": "EPSG:3031" + }, + "ASTER_GDEM_Greyscale_Shaded_Relief": { + "url": "https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/ASTER_GDEM_Greyscale_Shaded_Relief/default/GoogleMapsCompatible_Level12/{z}/{y}/{x}.jpg", + "max_zoom": 12, + "attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "html_attribution": "Imagery provided by services from the Global Imagery Browse Services (GIBS), operated by the NASA/GSFC/Earth Science Data and Information System (ESDIS) with funding provided by NASA/HQ.", + "name": "NASAGIBS.ASTER_GDEM_Greyscale_Shaded_Relief" + } + }, + "NLS": { + "osgb63k1885": { + "url": "https://api.maptiler.com/tiles/{variant}/{z}/{x}/{y}.jpg?key={apikey}", + "html_attribution": "National Library of Scotland Historic Maps", + "attribution": "National Library of Scotland Historic Maps", + "bounds": [ + [ + 49.6, + -12 + ], + [ + 61.7, + 3 + ] + ], + "min_zoom": 1, + "max_zoom": 18, + "apikey": "", + "variant": "uk-osgb63k1885", + "name": "NLS.osgb63k1885" + }, + "osgb1888": { + "url": "https://api.maptiler.com/tiles/{variant}/{z}/{x}/{y}.jpg?key={apikey}", + "html_attribution": "National Library of Scotland Historic Maps", + "attribution": "National Library of Scotland Historic Maps", + "bounds": [ + [ + 49.6, + -12 + ], + [ + 61.7, + 3 + ] + ], + "min_zoom": 1, + "max_zoom": 18, + "apikey": "", + "variant": "uk-osgb1888", + "name": "NLS.osgb1888" + }, + "osgb10k1888": { + "url": "https://api.maptiler.com/tiles/{variant}/{z}/{x}/{y}.jpg?key={apikey}", + "html_attribution": "National Library of Scotland Historic Maps", + "attribution": "National Library of Scotland Historic Maps", + "bounds": [ + [ + 49.6, + -12 + ], + [ + 61.7, + 3 + ] + ], + "min_zoom": 1, + "max_zoom": 18, + "apikey": "", + "variant": "uk-osgb10k1888", + "name": "NLS.osgb10k1888" + }, + "osgb1919": { + "url": "https://api.maptiler.com/tiles/{variant}/{z}/{x}/{y}.jpg?key={apikey}", + "html_attribution": "National Library of Scotland Historic Maps", + "attribution": "National Library of Scotland Historic Maps", + "bounds": [ + [ + 49.6, + -12 + ], + [ + 61.7, + 3 + ] + ], + "min_zoom": 1, + "max_zoom": 18, + "apikey": "", + "variant": "uk-osgb1919", + "name": "NLS.osgb1919" + }, + "osgb25k1937": { + "url": "https://api.maptiler.com/tiles/{variant}/{z}/{x}/{y}.jpg?key={apikey}", + "html_attribution": "National Library of Scotland Historic Maps", + "attribution": "National Library of Scotland Historic Maps", + "bounds": [ + [ + 49.6, + -12 + ], + [ + 61.7, + 3 + ] + ], + "min_zoom": 1, + "max_zoom": 18, + "apikey": "", + "variant": "uk-osgb25k1937", + "name": "NLS.osgb25k1937" + }, + "osgb63k1955": { + "url": "https://api.maptiler.com/tiles/{variant}/{z}/{x}/{y}.jpg?key={apikey}", + "html_attribution": "National Library of Scotland Historic Maps", + "attribution": "National Library of Scotland Historic Maps", + "bounds": [ + [ + 49.6, + -12 + ], + [ + 61.7, + 3 + ] + ], + "min_zoom": 1, + "max_zoom": 18, + "apikey": "", + "variant": "uk-osgb63k1955", + "name": "NLS.osgb63k1955" + }, + "oslondon1k1893": { + "url": "https://api.maptiler.com/tiles/{variant}/{z}/{x}/{y}.jpg?key={apikey}", + "html_attribution": "National Library of Scotland Historic Maps", + "attribution": "National Library of Scotland Historic Maps", + "bounds": [ + [ + 49.6, + -12 + ], + [ + 61.7, + 3 + ] + ], + "min_zoom": 1, + "max_zoom": 18, + "apikey": "", + "variant": "uk-oslondon1k1893", + "name": "NLS.oslondon1k1893" + } + }, + "JusticeMap": { + "income": { + "url": "https://www.justicemap.org/tile/{size}/{variant}/{z}/{x}/{y}.png", + "html_attribution": "Justice Map", + "attribution": "Justice Map", + "size": "county", + "bounds": [ + [ + 14, + -180 + ], + [ + 72, + -56 + ] + ], + "variant": "income", + "name": "JusticeMap.income", + "status": "broken" + }, + "americanIndian": { + "url": "https://www.justicemap.org/tile/{size}/{variant}/{z}/{x}/{y}.png", + "html_attribution": "Justice Map", + "attribution": "Justice Map", + "size": "county", + "bounds": [ + [ + 14, + -180 + ], + [ + 72, + -56 + ] + ], + "variant": "indian", + "name": "JusticeMap.americanIndian", + "status": "broken" + }, + "asian": { + "url": "https://www.justicemap.org/tile/{size}/{variant}/{z}/{x}/{y}.png", + "html_attribution": "Justice Map", + "attribution": "Justice Map", + "size": "county", + "bounds": [ + [ + 14, + -180 + ], + [ + 72, + -56 + ] + ], + "variant": "asian", + "name": "JusticeMap.asian", + "status": "broken" + }, + "black": { + "url": "https://www.justicemap.org/tile/{size}/{variant}/{z}/{x}/{y}.png", + "html_attribution": "Justice Map", + "attribution": "Justice Map", + "size": "county", + "bounds": [ + [ + 14, + -180 + ], + [ + 72, + -56 + ] + ], + "variant": "black", + "name": "JusticeMap.black", + "status": "broken" + }, + "hispanic": { + "url": "https://www.justicemap.org/tile/{size}/{variant}/{z}/{x}/{y}.png", + "html_attribution": "Justice Map", + "attribution": "Justice Map", + "size": "county", + "bounds": [ + [ + 14, + -180 + ], + [ + 72, + -56 + ] + ], + "variant": "hispanic", + "name": "JusticeMap.hispanic", + "status": "broken" + }, + "multi": { + "url": "https://www.justicemap.org/tile/{size}/{variant}/{z}/{x}/{y}.png", + "html_attribution": "Justice Map", + "attribution": "Justice Map", + "size": "county", + "bounds": [ + [ + 14, + -180 + ], + [ + 72, + -56 + ] + ], + "variant": "multi", + "name": "JusticeMap.multi", + "status": "broken" + }, + "nonWhite": { + "url": "https://www.justicemap.org/tile/{size}/{variant}/{z}/{x}/{y}.png", + "html_attribution": "Justice Map", + "attribution": "Justice Map", + "size": "county", + "bounds": [ + [ + 14, + -180 + ], + [ + 72, + -56 + ] + ], + "variant": "nonwhite", + "name": "JusticeMap.nonWhite", + "status": "broken" + }, + "white": { + "url": "https://www.justicemap.org/tile/{size}/{variant}/{z}/{x}/{y}.png", + "html_attribution": "Justice Map", + "attribution": "Justice Map", + "size": "county", + "bounds": [ + [ + 14, + -180 + ], + [ + 72, + -56 + ] + ], + "variant": "white", + "name": "JusticeMap.white", + "status": "broken" + }, + "plurality": { + "url": "https://www.justicemap.org/tile/{size}/{variant}/{z}/{x}/{y}.png", + "html_attribution": "Justice Map", + "attribution": "Justice Map", + "size": "county", + "bounds": [ + [ + 14, + -180 + ], + [ + 72, + -56 + ] + ], + "variant": "plural", + "name": "JusticeMap.plurality", + "status": "broken" + } + }, + "GeoportailFrance": { + "plan": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -85.0, + -179.9 + ], + [ + 85.0, + 179.9 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2", + "name": "GeoportailFrance.plan", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "parcels": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/png", + "style": "PCI vecteur", + "variant": "CADASTRALPARCELS.PARCELLAIRE_EXPRESS", + "name": "GeoportailFrance.parcels", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "orthos": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -80.0, + -180.0 + ], + [ + 80.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 21, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS", + "name": "GeoportailFrance.orthos", + "TileMatrixSet": "PM_0_21", + "apikey": "your_api_key_here" + }, + "500k": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.38, + -6.0 + ], + [ + 51.45, + 11.15 + ] + ], + "min_zoom": 0, + "max_zoom": 11, + "format": "image/jpeg", + "style": "normal", + "variant": "500k", + "name": "GeoportailFrance.500k", + "TileMatrixSet": "PM_0_11", + "apikey": "your_api_key_here" + }, + "Acces_Biomethane": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "ACCES.BIOMETHANE", + "variant": "ACCES.BIOMETHANE", + "name": "GeoportailFrance.Acces_Biomethane", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Adminexpress_cog_carto_Latest": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ADMINEXPRESS-COG-CARTO.LATEST", + "name": "GeoportailFrance.Adminexpress_cog_carto_Latest", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Adminexpress_cog_2017": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ADMINEXPRESS-COG.2017", + "name": "GeoportailFrance.Adminexpress_cog_2017", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Adminexpress_cog_2018": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ADMINEXPRESS-COG.2018", + "name": "GeoportailFrance.Adminexpress_cog_2018", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Adminexpress_cog_2019": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ADMINEXPRESS-COG.2019", + "name": "GeoportailFrance.Adminexpress_cog_2019", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Adminexpress_cog_2020": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ADMINEXPRESS-COG.2020", + "name": "GeoportailFrance.Adminexpress_cog_2020", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Adminexpress_cog_2021": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ADMINEXPRESS-COG.2021", + "name": "GeoportailFrance.Adminexpress_cog_2021", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Adminexpress_cog_2022": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ADMINEXPRESS-COG.2022", + "name": "GeoportailFrance.Adminexpress_cog_2022", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Adminexpress_cog_2023": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ADMINEXPRESS-COG.2023", + "name": "GeoportailFrance.Adminexpress_cog_2023", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Adminexpress_cog_2024": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ADMINEXPRESS-COG.2024", + "name": "GeoportailFrance.Adminexpress_cog_2024", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Adminexpress_cog_2025": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ADMINEXPRESS-COG.2025", + "name": "GeoportailFrance.Adminexpress_cog_2025", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Adminexpress_cog_Latest": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ADMINEXPRESS-COG.LATEST", + "name": "GeoportailFrance.Adminexpress_cog_Latest", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Areamanagement_Zfu": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "AREAMANAGEMENT.ZFU", + "name": "GeoportailFrance.Areamanagement_Zfu", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Areamanagement_Zus": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "AREAMANAGEMENT.ZUS", + "name": "GeoportailFrance.Areamanagement_Zus", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Aire-parcellaire": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "Aire-Parcellaire", + "name": "GeoportailFrance.Aire-parcellaire", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Bdcarto_etat_major_Niveau3": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.0, + -5.5 + ], + [ + 52.0, + 10.0 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "BDCARTO_ETAT-MAJOR.NIVEAU3", + "name": "GeoportailFrance.Bdcarto_etat_major_Niveau3", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Bdcarto_etat_major_Niveau4": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "BDCARTO_ETAT-MAJOR.NIVEAU4", + "name": "GeoportailFrance.Bdcarto_etat_major_Niveau4", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Besoin_Chaleur_Industriel": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "BESOIN.CHALEUR.INDUSTRIEL", + "variant": "BESOIN.CHALEUR.INDUSTRIEL", + "name": "GeoportailFrance.Besoin_Chaleur_Industriel", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Besoin_Chaleur_Residentiel": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "BESOIN.CHALEUR.RESIDENTIEL", + "variant": "BESOIN.CHALEUR.RESIDENTIEL", + "name": "GeoportailFrance.Besoin_Chaleur_Residentiel", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Besoin_Chaleur_Tertiaire": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "BESOIN.CHALEUR.TERTIAIRE", + "variant": "BESOIN.CHALEUR.TERTIAIRE", + "name": "GeoportailFrance.Besoin_Chaleur_Tertiaire", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Besoin_Froid_Residentiel": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "BESOIN.FROID.RESIDENTIEL", + "variant": "BESOIN.FROID.RESIDENTIEL", + "name": "GeoportailFrance.Besoin_Froid_Residentiel", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Besoin_Froid_Tertiaire": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "BESOIN.FROID.TERTIAIRE", + "variant": "BESOIN.FROID.TERTIAIRE", + "name": "GeoportailFrance.Besoin_Froid_Tertiaire", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Bnf_ignf_geographicalgridsystems_Cassini": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.9343, + -6.39486 + ], + [ + 51.8839, + 9.96282 + ] + ], + "min_zoom": 6, + "max_zoom": 14, + "format": "image/png", + "style": "normal", + "variant": "BNF-IGNF_GEOGRAPHICALGRIDSYSTEMS.CASSINI", + "name": "GeoportailFrance.Bnf_ignf_geographicalgridsystems_Cassini", + "TileMatrixSet": "PM_6_14", + "apikey": "your_api_key_here" + }, + "Buildings_Buildings": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4969, + -63.9692 + ], + [ + 71.5841, + 55.9644 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "BUILDINGS.BUILDINGS", + "variant": "BUILDINGS.BUILDINGS", + "name": "GeoportailFrance.Buildings_Buildings", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Cadastral_Parcels_Sections": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 13, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "CADASTRAL.PARCELS.SECTIONS", + "name": "GeoportailFrance.Cadastral_Parcels_Sections", + "TileMatrixSet": "PM_13_18", + "apikey": "your_api_key_here" + }, + "Cadastralparcels_Heatmap": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "DECALAGE DE LA REPRESENTATION CADASTRALE", + "variant": "CADASTRALPARCELS.HEATMAP", + "name": "GeoportailFrance.Cadastralparcels_Heatmap", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Cadastralparcels_Histo_2008_2013_Parcels": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3922, + -63.1607 + ], + [ + 51.0945, + 55.8464 + ] + ], + "min_zoom": 0, + "max_zoom": 20, + "format": "image/png", + "style": "bdparcellaire", + "variant": "CADASTRALPARCELS.HISTO.2008-2013.PARCELS", + "name": "GeoportailFrance.Cadastralparcels_Histo_2008_2013_Parcels", + "TileMatrixSet": "PM_0_20", + "apikey": "your_api_key_here" + }, + "Cadastralparcels_Parcellaire_express_L93": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.1505 + ], + [ + 51.0991, + 9.5705 + ] + ], + "min_zoom": 12, + "max_zoom": 20, + "format": "image/png", + "style": "PCI vecteur", + "variant": "CADASTRALPARCELS.PARCELLAIRE_EXPRESS.L93", + "name": "GeoportailFrance.Cadastralparcels_Parcellaire_express_L93", + "TileMatrixSet": "2154_10cm_12_20", + "apikey": "your_api_key_here", + "status": "broken" + }, + "Cadastralparcels_Parcels": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3922, + -63.1607 + ], + [ + 51.091, + 55.8464 + ] + ], + "min_zoom": 0, + "max_zoom": 20, + "format": "image/png", + "style": "normal", + "variant": "CADASTRALPARCELS.PARCELS", + "name": "GeoportailFrance.Cadastralparcels_Parcels", + "TileMatrixSet": "PM_0_20", + "apikey": "your_api_key_here" + }, + "Cadastralparcels_Parcels_L93": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -41.0, + -6.0 + ], + [ + 52.0, + 10.0 + ] + ], + "min_zoom": 6, + "max_zoom": 20, + "format": "image/png", + "style": "normal", + "variant": "CADASTRALPARCELS.PARCELS.L93", + "name": "GeoportailFrance.Cadastralparcels_Parcels_L93", + "TileMatrixSet": "2154_10cm_6_20", + "apikey": "your_api_key_here" + }, + "Cadastralparcels_Qualrefbdp": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "DIVCAD_MTD", + "variant": "CADASTRALPARCELS.QUALREFBDP", + "name": "GeoportailFrance.Cadastralparcels_Qualrefbdp", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Cadastres_Solaires_Locaux": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "CADASTRES.SOLAIRES.LOCAUX", + "variant": "CADASTRES.SOLAIRES.LOCAUX", + "name": "GeoportailFrance.Cadastres_Solaires_Locaux", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Capacite_Accueil_Electrique": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "CAPACITE.ACCUEIL.ELECTRIQUE", + "variant": "CAPACITE.ACCUEIL.ELECTRIQUE", + "name": "GeoportailFrance.Capacite_Accueil_Electrique", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Cartes-14-18-edugeo_pyr-png_fxx_wm": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.9421, + 4.79205 + ], + [ + 49.5144, + 5.9969 + ] + ], + "min_zoom": 6, + "max_zoom": 13, + "format": "image/png", + "style": "normal", + "variant": "CARTES-14-18-EDUGEO_PYR-PNG_FXX_WM", + "name": "GeoportailFrance.Cartes-14-18-edugeo_pyr-png_fxx_wm", + "TileMatrixSet": "PM_6_13", + "apikey": "your_api_key_here" + }, + "Cartes_Naturalearth": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 1, + "max_zoom": 9, + "format": "image/jpeg", + "style": "normal", + "variant": "CARTES.NATURALEARTH", + "name": "GeoportailFrance.Cartes_Naturalearth", + "TileMatrixSet": "PM_1_9", + "apikey": "your_api_key_here" + }, + "Cget_qp_bdd_wld_wm_wmts_20150914": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 17, + "format": "image/png", + "style": "normal", + "variant": "CGET_QP_BDD_WLD_WM_WMTS_20150914", + "name": "GeoportailFrance.Cget_qp_bdd_wld_wm_wmts_20150914", + "TileMatrixSet": "PM_6_17", + "apikey": "your_api_key_here" + }, + "Communes_Prioritydisctrict": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 17, + "format": "image/png", + "style": "normal", + "variant": "COMMUNES.PRIORITYDISCTRICT", + "name": "GeoportailFrance.Communes_Prioritydisctrict", + "TileMatrixSet": "PM_6_17", + "apikey": "your_api_key_here" + }, + "Communes_Sismicite": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "COMMUNES.SISMICITE", + "name": "GeoportailFrance.Communes_Sismicite", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Conso_Elec_Commune": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "CONSO.ELEC.COMMUNE", + "variant": "CONSO.ELEC.COMMUNE", + "name": "GeoportailFrance.Conso_Elec_Commune", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Conso_Gaz_Commune": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "CONSO.GAZ.COMMUNE", + "variant": "CONSO.GAZ.COMMUNE", + "name": "GeoportailFrance.Conso_Gaz_Commune", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Cosia": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.8392, + -1.99328 + ], + [ + 48.3882, + -1.42008 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "COSIA", + "name": "GeoportailFrance.Cosia", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Carhab_habitat": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "Carhab_habitat", + "name": "GeoportailFrance.Carhab_habitat", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Debroussaillement": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "nolegend", + "variant": "DEBROUSSAILLEMENT", + "name": "GeoportailFrance.Debroussaillement", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Delaisses_Autoroutiers": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "DELAISSES.AUTOROUTIERS", + "variant": "DELAISSES.AUTOROUTIERS", + "name": "GeoportailFrance.Delaisses_Autoroutiers", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Dreal_Zonage_pinel": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.2719, + -5.15012 + ], + [ + 48.9064, + -1.00687 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "DREAL.ZONAGE_PINEL", + "name": "GeoportailFrance.Dreal_Zonage_pinel", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Edugeo_Landuse_Agriculture2012": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "EDUGEO.LANDUSE.AGRICULTURE2012", + "name": "GeoportailFrance.Edugeo_Landuse_Agriculture2012", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Edugeo_Naturalriskzones_1910floodedwatersheds": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.4163, + 0.419457 + ], + [ + 50.064, + 5.43248 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "EDUGEO.NATURALRISKZONES.1910FLOODEDWATERSHEDS", + "name": "GeoportailFrance.Edugeo_Naturalriskzones_1910floodedwatersheds", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Elevation_Contour_Line": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ELEVATION.CONTOUR.LINE", + "name": "GeoportailFrance.Elevation_Contour_Line", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Elevation_Elevationgridcoverage_Shadow": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4069, + -63.187 + ], + [ + 50.9218, + 55.8884 + ] + ], + "min_zoom": 0, + "max_zoom": 15, + "format": "image/png", + "style": "estompage_grayscale", + "variant": "ELEVATION.ELEVATIONGRIDCOVERAGE.SHADOW", + "name": "GeoportailFrance.Elevation_Elevationgridcoverage_Shadow", + "TileMatrixSet": "PM_0_15", + "apikey": "your_api_key_here" + }, + "Elevation_Elevationgridcoverage_Threshold": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 3, + "max_zoom": 17, + "format": "image/png", + "style": "ELEVATION.ELEVATIONGRIDCOVERAGE.THRESHOLD", + "variant": "ELEVATION.ELEVATIONGRIDCOVERAGE.THRESHOLD", + "name": "GeoportailFrance.Elevation_Elevationgridcoverage_Threshold", + "TileMatrixSet": "PM_3_17", + "apikey": "your_api_key_here" + }, + "Elevation_Level0": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.51, + -63.2529 + ], + [ + 51.1388, + 55.9472 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ELEVATION.LEVEL0", + "name": "GeoportailFrance.Elevation_Level0", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Elevation_Slopes": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 6, + "max_zoom": 14, + "format": "image/jpeg", + "style": "normal", + "variant": "ELEVATION.SLOPES", + "name": "GeoportailFrance.Elevation_Slopes", + "TileMatrixSet": "PM_6_14", + "apikey": "your_api_key_here" + }, + "Elevation_Slopes_Highres": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 42.9786, + 5.75296 + ], + [ + 43.2733, + 6.25761 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ELEVATION.SLOPES.HIGHRES", + "name": "GeoportailFrance.Elevation_Slopes_Highres", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Elevationgridcoverage_Highres_Quality": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "Graphe de source du RGE Alti", + "variant": "ELEVATIONGRIDCOVERAGE.HIGHRES.QUALITY", + "name": "GeoportailFrance.Elevationgridcoverage_Highres_Quality", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Enr_Aero_Civil": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "ENR.AERO.CIVIL", + "variant": "ENR.AERO.CIVIL", + "name": "GeoportailFrance.Enr_Aero_Civil", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Enr_Aero_Militaire": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "ENR.AERO.MILITAIRE", + "variant": "ENR.AERO.MILITAIRE", + "name": "GeoportailFrance.Enr_Aero_Militaire", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Enr_Grands_Sites_France": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "ENR.GRANDS.SITES.FRANCE", + "variant": "ENR.GRANDS.SITES.FRANCE", + "name": "GeoportailFrance.Enr_Grands_Sites_France", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Enr_Perimetre_Habitation": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "PERIMETRE.HABITATION", + "variant": "ENR.PERIMETRE.HABITATION", + "name": "GeoportailFrance.Enr_Perimetre_Habitation", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Enr_Perimetre_Pente": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "PERIMETRE.PENTE", + "variant": "ENR.PERIMETRE.PENTE", + "name": "GeoportailFrance.Enr_Perimetre_Pente", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Enr_Perimetre_Route": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "PERIMETRE.ROUTE", + "variant": "ENR.PERIMETRE.ROUTE", + "name": "GeoportailFrance.Enr_Perimetre_Route", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Enr_Perimetre_Voie_Ferree": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PERIMETRE.VOIE.FERREE", + "variant": "ENR.PERIMETRE.VOIE.FERREE", + "name": "GeoportailFrance.Enr_Perimetre_Voie_Ferree", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Enrezo_Besoins_Chaud": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "ENREZO.BESOINS.CHAUD", + "variant": "ENREZO.BESOINS.CHAUD", + "name": "GeoportailFrance.Enrezo_Besoins_Chaud", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Enrezo_Besoins_Froid": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "ENREZO.BESOINS.FROID", + "variant": "ENREZO.BESOINS.FROID", + "name": "GeoportailFrance.Enrezo_Besoins_Froid", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Enrezo_Chaleur_Fatale_500_Industries": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "ENREZO.CHALEUR.FATALE.500.INDUSTRIES", + "variant": "ENREZO.CHALEUR.FATALE.500.INDUSTRIES", + "name": "GeoportailFrance.Enrezo_Chaleur_Fatale_500_Industries", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Enrezo_Chaleur_Fatale_Datacenter": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "ENREZO.CHALEUR.FATALE.DATACENTER", + "variant": "ENREZO.CHALEUR.FATALE.DATACENTER", + "name": "GeoportailFrance.Enrezo_Chaleur_Fatale_Datacenter", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Enrezo_Chaleur_Fatale_Step": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "ENREZO.CHALEUR.FATALE.STEP", + "variant": "ENREZO.CHALEUR.FATALE.STEP", + "name": "GeoportailFrance.Enrezo_Chaleur_Fatale_Step", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Enrezo_Zone_Potentiel_Chaud": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "ENREZO.ZONE.POTENTIEL.CHAUD", + "variant": "ENREZO.ZONE.POTENTIEL.CHAUD", + "name": "GeoportailFrance.Enrezo_Zone_Potentiel_Chaud", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Enrezo_Zone_Potentiel_Fort_Chaud": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "ENREZO.ZONE.POTENTIEL.FORT.CHAUD", + "variant": "ENREZO.ZONE.POTENTIEL.FORT.CHAUD", + "name": "GeoportailFrance.Enrezo_Zone_Potentiel_Fort_Chaud", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Enrezo_Zone_Potentiel_Fort_Froid": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "ENREZO.ZONE.POTENTIEL.FORT.FROID", + "variant": "ENREZO.ZONE.POTENTIEL.FORT.FROID", + "name": "GeoportailFrance.Enrezo_Zone_Potentiel_Fort_Froid", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Enrezo_Zone_Potentiel_Froid": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "ENREZO.ZONE.POTENTIEL.FROID", + "variant": "ENREZO.ZONE.POTENTIEL.FROID", + "name": "GeoportailFrance.Enrezo_Zone_Potentiel_Froid", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Evol-surface-forestiere-1980-2011_edugeo_pyr-png_fxx_lamb93_20150918": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 0, + "max_zoom": 15, + "format": "image/png", + "style": "normal", + "variant": "EVOL-SURFACE-FORESTIERE-1980-2011_EDUGEO_PYR-PNG_FXX_LAMB93_20150918", + "name": "GeoportailFrance.Evol-surface-forestiere-1980-2011_edugeo_pyr-png_fxx_lamb93_20150918", + "TileMatrixSet": "PM_0_15", + "apikey": "your_api_key_here" + }, + "Forets_Publiques": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 3, + "max_zoom": 16, + "format": "image/png", + "style": "FORETS PUBLIQUES ONF", + "variant": "FORETS.PUBLIQUES", + "name": "GeoportailFrance.Forets_Publiques", + "TileMatrixSet": "PM_3_16", + "apikey": "your_api_key_here" + }, + "Gaz_Corridor_Distribution": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "GAZ.CORRIDOR.DISTRIBUTION", + "variant": "GAZ.CORRIDOR.DISTRIBUTION", + "name": "GeoportailFrance.Gaz_Corridor_Distribution", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Gaz_Corridor_Transport": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "GAZ.CORRIDOR.TRANSPORT", + "variant": "GAZ.CORRIDOR.TRANSPORT", + "name": "GeoportailFrance.Gaz_Corridor_Transport", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Gaz_Reseau_Distribution": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "GAZ.RESEAU.DISTRIBUTION", + "variant": "GAZ.RESEAU.DISTRIBUTION", + "name": "GeoportailFrance.Gaz_Reseau_Distribution", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Gaz_Reseau_Transport": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "GAZ.RESEAU.TRANSPORT", + "variant": "GAZ.RESEAU.TRANSPORT", + "name": "GeoportailFrance.Gaz_Reseau_Transport", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystem_Dfci": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEM.DFCI", + "name": "GeoportailFrance.Geographicalgridsystem_Dfci", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_1900typemaps": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.4726, + 1.62941 + ], + [ + 49.1548, + 3.0 + ] + ], + "min_zoom": 10, + "max_zoom": 15, + "format": "image/jpeg", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.1900TYPEMAPS", + "name": "GeoportailFrance.Geographicalgridsystems_1900typemaps", + "TileMatrixSet": "PM_10_15", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_1914_11_15_arras_verdun_belfort_fronts_600k": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.3396, + 0.87353 + ], + [ + 51.2857, + 8.88521 + ] + ], + "min_zoom": 6, + "max_zoom": 10, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.1914_11_15_ARRAS_VERDUN_BELFORT_fronts_600K", + "name": "GeoportailFrance.Geographicalgridsystems_1914_11_15_arras_verdun_belfort_fronts_600k", + "TileMatrixSet": "PM_6_10", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Bonne": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -0.49941, + -55.9127 + ], + [ + 7.88966, + -50.0835 + ] + ], + "min_zoom": 0, + "max_zoom": 10, + "format": "image/jpeg", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.BONNE", + "name": "GeoportailFrance.Geographicalgridsystems_Bonne", + "TileMatrixSet": "PM_0_10", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Coastalmaps": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.5205, + -61.8799 + ], + [ + 51.1895, + 56.1352 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.COASTALMAPS", + "name": "GeoportailFrance.Geographicalgridsystems_Coastalmaps", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Douaumont_fort_positions_5k_18mai1916": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.2064, + 5.42696 + ], + [ + 49.2229, + 5.45493 + ] + ], + "min_zoom": 6, + "max_zoom": 17, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.DOUAUMONT_FORT_positions_5K_18mai1916", + "name": "GeoportailFrance.Geographicalgridsystems_Douaumont_fort_positions_5k_18mai1916", + "TileMatrixSet": "PM_6_17", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Ajaccio1976": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.6654, + 8.507 + ], + [ + 42.0381, + 9.13252 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.AJACCIO1976", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Ajaccio1976", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Belfort_montbelliard1973": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.3676, + 6.50535 + ], + [ + 47.8735, + 7.25597 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.BELFORT-MONTBELLIARD1973", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Belfort_montbelliard1973", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Berry_sud1952": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 46.168, + 1.00082 + ], + [ + 46.6854, + 1.75144 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.BERRY-SUD1952", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Berry_sud1952", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Bethune1956": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 50.17, + 2.37696 + ], + [ + 50.6484, + 3.37778 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.BETHUNE1956", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Bethune1956", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Biarritz1979": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.1433, + -1.87654 + ], + [ + 43.6885, + -1.25103 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.BIARRITZ1979", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Biarritz1979", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Bourg_st_maurice1974": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.3827, + 6.50535 + ], + [ + 45.7331, + 7.13087 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.BOURG-ST-MAURICE1974", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Bourg_st_maurice1974", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Caen1969": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.035, + -0.875721 + ], + [ + 49.4434, + -0.125103 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.CAEN1969", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Caen1969", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Cap_dagde1971": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.1433, + 3.00247 + ], + [ + 43.5073, + 3.62799 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.CAP-DAGDE1971", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Cap_dagde1971", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Clermont_ferrand1966": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.6457, + 2.75227 + ], + [ + 45.9944, + 3.37778 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.CLERMONT-FERRAND1966", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Clermont_ferrand1966", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Creil_sud_picardie1979": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.035, + 2.25185 + ], + [ + 49.6058, + 3.12757 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.CREIL-SUD-PICARDIE1979", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Creil_sud_picardie1979", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Dijon1962": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 46.9422, + 4.75391 + ], + [ + 47.5368, + 5.37943 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.DIJON1962", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Dijon1962", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Douaumont1916": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.1519, + 5.38761 + ], + [ + 49.2326, + 5.49243 + ] + ], + "min_zoom": 6, + "max_zoom": 17, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.Douaumont1916", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Douaumont1916", + "TileMatrixSet": "PM_6_17", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Grenoble1965": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.9416, + 5.50453 + ], + [ + 45.3827, + 6.13005 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.GRENOBLE1965", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Grenoble1965", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Grenoble1976": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.0301, + 5.50453 + ], + [ + 45.4705, + 6.25515 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.GRENOBLE1976", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Grenoble1976", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Grenoble1991": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.9416, + 5.50453 + ], + [ + 45.3827, + 6.13005 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.GRENOBLE1991", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Grenoble1991", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Guadeloupe1955": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 16.1695, + -61.6758 + ], + [ + 16.6495, + -61.3005 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.GUADELOUPE1955", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Guadeloupe1955", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Guyane1958": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 5.12238, + -54.4198 + ], + [ + 5.99398, + -53.419 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.GUYANE1958", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Guyane1958", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_La_reunion1980": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4954, + 55.0453 + ], + [ + -20.6783, + 55.6708 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.LA-REUNION1980", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_La_reunion1980", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_La_rochelle_rochefort1959": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.7331, + -1.37613 + ], + [ + 46.4273, + -0.750618 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.LA-ROCHELLE-ROCHEFORT1959", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_La_rochelle_rochefort1959", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Le_havre1975": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.2805, + -0.125103 + ], + [ + 49.6868, + 0.500412 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.LE-HAVRE1975", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Le_havre1975", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Le_havre1979": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.2805, + -0.125103 + ], + [ + 49.6868, + 0.625515 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.LE-HAVRE1979", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Le_havre1979", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Limoges1966": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.6457, + 1.00082 + ], + [ + 45.9944, + 1.50124 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.LIMOGES1966", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Limoges1966", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Lyon1947": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.4705, + 4.50371 + ], + [ + 46.0813, + 5.37943 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.LYON1947", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Lyon1947", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Lyon1980": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.4705, + 4.62881 + ], + [ + 45.9944, + 5.12922 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.LYON1980", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Lyon1980", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Lyon1985": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.5582, + 4.62881 + ], + [ + 45.9944, + 5.12922 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.LYON1985", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Lyon1985", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Le_mort_homme_et_ses_environs_avril_1916": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.1978, + 5.20969 + ], + [ + 49.2602, + 5.31045 + ] + ], + "min_zoom": 6, + "max_zoom": 17, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.Le-Mort-Homme-et-ses-environs-avril-1916", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Le_mort_homme_et_ses_environs_avril_1916", + "TileMatrixSet": "PM_6_17", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Marne_la_vallee1966": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.7059, + 2.37696 + ], + [ + 49.035, + 3.12757 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.MARNE-LA-VALLEE1966", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Marne_la_vallee1966", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Marne_la_vallee1978": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.7059, + 2.37696 + ], + [ + 49.035, + 2.75227 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.MARNE-LA-VALLEE1978", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Marne_la_vallee1978", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Marne_la_vallee1987": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.7059, + 2.37696 + ], + [ + 49.035, + 3.12757 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.MARNE-LA-VALLEE1987", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Marne_la_vallee1987", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Marseille_martigues1947": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.052, + 4.50371 + ], + [ + 43.6885, + 5.62963 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.MARSEILLE-MARTIGUES1947", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Marseille_martigues1947", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Marseille_martigues1980": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.052, + 5.00412 + ], + [ + 43.5073, + 5.62963 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.MARSEILLE-MARTIGUES1980", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Marseille_martigues1980", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Marseille_martigues1986": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.052, + 4.87902 + ], + [ + 43.6885, + 5.62963 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.MARSEILLE-MARTIGUES1986", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Marseille_martigues1986", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Metz_nancy1983": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.4576, + 5.75474 + ], + [ + 49.362, + 6.50535 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.METZ-NANCY1983", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Metz_nancy1983", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Nantes1972": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.0276, + -2.50206 + ], + [ + 47.4522, + -1.25103 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.NANTES1972", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Nantes1972", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Paris1964": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.7884, + 2.00165 + ], + [ + 49.117, + 2.50206 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.PARIS1964", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Paris1964", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Paris1979": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.7059, + 2.00165 + ], + [ + 49.035, + 2.62716 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.PARIS1979", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Paris1979", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Positions_20k_avr1916": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.1307, + 5.11659 + ], + [ + 49.2732, + 5.58059 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.Positions_20K_avr1916", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Positions_20k_avr1916", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Reims1974": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.035, + 3.75309 + ], + [ + 49.4434, + 4.50371 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.REIMS1974", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Reims1974", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Roissy1973": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.8707, + 2.25185 + ], + [ + 49.117, + 2.75227 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.ROISSY1973", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Roissy1973", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Roissy1978": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.8707, + 2.25185 + ], + [ + 49.2805, + 2.75227 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.ROISSY1978", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Roissy1978", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Strasbourg1956": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.2081, + 7.25597 + ], + [ + 48.7884, + 8.13169 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.STRASBOURG1956", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Strasbourg1956", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Strasbourg1978": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.1246, + 7.25597 + ], + [ + 48.8707, + 8.00659 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.STRASBOURG1978", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Strasbourg1978", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Toulon_hyeres1976": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 42.8689, + 5.62963 + ], + [ + 43.2345, + 6.38025 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.TOULON-HYERES1976", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Toulon_hyeres1976", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Toulouse1948": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.4165, + 1.12593 + ], + [ + 43.7789, + 1.75144 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.TOULOUSE1948", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Toulouse1948", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Vannes_golfe_du_morbihan1960": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.3676, + -3.37778 + ], + [ + 47.8735, + -2.50206 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.VANNES-GOLFE-DU-MORBIHAN1960", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Vannes_golfe_du_morbihan1960", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Vannes_golfe_du_morbihan1971": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.3676, + -3.37778 + ], + [ + 47.8735, + -2.50206 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.VANNES-GOLFE-DU-MORBIHAN1971", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Vannes_golfe_du_morbihan1971", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Verdun_nord_fronts_francais_20k": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.168, + 5.29434 + ], + [ + 49.3036, + 5.58034 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.VERDUN_NORD_fronts_francais_20K", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Verdun_nord_fronts_francais_20k", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Verdun_nord_organisations_defensives_20k": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.1609, + 5.28694 + ], + [ + 49.3069, + 5.58493 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.VERDUN_NORD_organisations_defensives_20K", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Verdun_nord_organisations_defensives_20k", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Edugeo_Versailles1979": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.5405, + 1.87654 + ], + [ + 49.035, + 2.50206 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.EDUGEO.VERSAILLES1979", + "name": "GeoportailFrance.Geographicalgridsystems_Edugeo_Versailles1979", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Etatmajor10": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.3847, + 1.82682 + ], + [ + 49.5142, + 2.79738 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/jpeg", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.ETATMAJOR10", + "name": "GeoportailFrance.Geographicalgridsystems_Etatmajor10", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Etatmajor40": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.1844, + -6.08889 + ], + [ + 51.2745, + 10.961 + ] + ], + "min_zoom": 6, + "max_zoom": 15, + "format": "image/jpeg", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.ETATMAJOR40", + "name": "GeoportailFrance.Geographicalgridsystems_Etatmajor40", + "TileMatrixSet": "PM_6_15", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Maps_Bduni_J1": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -80.0, + -180.0 + ], + [ + 80.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.MAPS.BDUNI.J1", + "name": "GeoportailFrance.Geographicalgridsystems_Maps_Bduni_J1", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Maps_Overview": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 1, + "max_zoom": 8, + "format": "image/jpeg", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.MAPS.OVERVIEW", + "name": "GeoportailFrance.Geographicalgridsystems_Maps_Overview", + "TileMatrixSet": "PM_1_8", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Maps_Scan50_1950": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 3, + "max_zoom": 15, + "format": "image/jpeg", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.MAPS.SCAN50.1950", + "name": "GeoportailFrance.Geographicalgridsystems_Maps_Scan50_1950", + "TileMatrixSet": "PM_3_15", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Planignv2_L93": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3274, + -5.14151 + ], + [ + 51.0897, + 9.55802 + ] + ], + "min_zoom": 6, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2.L93", + "name": "GeoportailFrance.Geographicalgridsystems_Planignv2_L93", + "TileMatrixSet": "2154_10cm_6_19", + "apikey": "your_api_key_here", + "status": "broken" + }, + "Geographicalgridsystems_Slopes_Mountain": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.5446, + -63.1614 + ], + [ + 51.0991, + 56.0018 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.SLOPES.MOUNTAIN", + "name": "GeoportailFrance.Geographicalgridsystems_Slopes_Mountain", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Slopes_Pac": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.5446, + -63.1614 + ], + [ + 51.0991, + 56.0018 + ] + ], + "min_zoom": 0, + "max_zoom": 15, + "format": "image/png", + "style": "GEOGRAPHICALGRIDSYSTEMS.SLOPES.PAC", + "variant": "GEOGRAPHICALGRIDSYSTEMS.SLOPES.PAC", + "name": "GeoportailFrance.Geographicalgridsystems_Slopes_Pac", + "TileMatrixSet": "PM_0_15", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Terrier_v1": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.2568, + 8.36284 + ], + [ + 43.1174, + 9.75281 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "nolegend", + "variant": "GEOGRAPHICALGRIDSYSTEMS.TERRIER_V1", + "name": "GeoportailFrance.Geographicalgridsystems_Terrier_v1", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Terrier_v2": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.2568, + 8.36284 + ], + [ + 43.1174, + 9.75282 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "nolegend", + "variant": "GEOGRAPHICALGRIDSYSTEMS.TERRIER_V2", + "name": "GeoportailFrance.Geographicalgridsystems_Terrier_v2", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Verdun_environs_nord_fronts_offensves_50k": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.0887, + 4.99018 + ], + [ + 49.4144, + 5.65437 + ] + ], + "min_zoom": 6, + "max_zoom": 14, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.VERDUN_ENVIRONS_NORD_fronts_offensves_50K", + "name": "GeoportailFrance.Geographicalgridsystems_Verdun_environs_nord_fronts_offensves_50k", + "TileMatrixSet": "PM_6_14", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Verdun_environs_sud_nord_com_group_80k": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.9421, + 4.79205 + ], + [ + 49.5144, + 5.9969 + ] + ], + "min_zoom": 6, + "max_zoom": 13, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.VERDUN_ENVIRONS_SUD_NORD_com_group_80K", + "name": "GeoportailFrance.Geographicalgridsystems_Verdun_environs_sud_nord_com_group_80k", + "TileMatrixSet": "PM_6_13", + "apikey": "your_api_key_here" + }, + "Geographicalgridsystems_Verdun_environs_fronts_50k_21_26fevr1916": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.0849, + 4.98696 + ], + [ + 49.3719, + 5.64305 + ] + ], + "min_zoom": 6, + "max_zoom": 14, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALGRIDSYSTEMS.VERDUN_ENVIRONS_fronts_50K_21-26fevr1916", + "name": "GeoportailFrance.Geographicalgridsystems_Verdun_environs_fronts_50k_21_26fevr1916", + "TileMatrixSet": "PM_6_14", + "apikey": "your_api_key_here" + }, + "Geographicalnames_Names": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4969, + -63.9692 + ], + [ + 71.5841, + 55.9644 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "GEOGRAPHICALNAMES.NAMES", + "name": "GeoportailFrance.Geographicalnames_Names", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Hr_Orthoimagery_Orthophotos": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -80.0, + -180.0 + ], + [ + 80.0, + 180.0 + ] + ], + "min_zoom": 6, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "HR.ORTHOIMAGERY.ORTHOPHOTOS", + "name": "GeoportailFrance.Hr_Orthoimagery_Orthophotos", + "TileMatrixSet": "PM_6_19", + "apikey": "your_api_key_here" + }, + "Hr_Orthoimagery_Orthophotos_L93": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.0, + -5.0 + ], + [ + 52.0, + 10.0 + ] + ], + "min_zoom": 10, + "max_zoom": 20, + "format": "image/jpeg", + "style": "normal", + "variant": "HR.ORTHOIMAGERY.ORTHOPHOTOS.L93", + "name": "GeoportailFrance.Hr_Orthoimagery_Orthophotos_L93", + "TileMatrixSet": "2154_10cm_10_20", + "apikey": "your_api_key_here", + "status": "broken" + }, + "Hydrography_Bcae_2020": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 17, + "format": "image/png", + "style": "nolegend", + "variant": "HYDROGRAPHY.BCAE.2020", + "name": "GeoportailFrance.Hydrography_Bcae_2020", + "TileMatrixSet": "PM_6_17", + "apikey": "your_api_key_here" + }, + "Hydrography_Bcae_2021": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 17, + "format": "image/png", + "style": "nolegend", + "variant": "HYDROGRAPHY.BCAE.2021", + "name": "GeoportailFrance.Hydrography_Bcae_2021", + "TileMatrixSet": "PM_6_17", + "apikey": "your_api_key_here" + }, + "Hydrography_Bcae_2022": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 17, + "format": "image/png", + "style": "normal", + "variant": "HYDROGRAPHY.BCAE.2022", + "name": "GeoportailFrance.Hydrography_Bcae_2022", + "TileMatrixSet": "PM_6_17", + "apikey": "your_api_key_here" + }, + "Hydrography_Bcae_2023": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 17, + "format": "image/png", + "style": "normal", + "variant": "HYDROGRAPHY.BCAE.2023", + "name": "GeoportailFrance.Hydrography_Bcae_2023", + "TileMatrixSet": "PM_6_17", + "apikey": "your_api_key_here" + }, + "Hydrography_Bcae_2024": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.1505 + ], + [ + 51.0991, + 9.5705 + ] + ], + "min_zoom": 6, + "max_zoom": 17, + "format": "image/png", + "style": "normal", + "variant": "HYDROGRAPHY.BCAE.2024", + "name": "GeoportailFrance.Hydrography_Bcae_2024", + "TileMatrixSet": "PM_6_17", + "apikey": "your_api_key_here" + }, + "Hydrography_Bcae_2025": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.1505 + ], + [ + 51.0991, + 9.5705 + ] + ], + "min_zoom": 6, + "max_zoom": 17, + "format": "image/png", + "style": "normal", + "variant": "HYDROGRAPHY.BCAE.2025", + "name": "GeoportailFrance.Hydrography_Bcae_2025", + "TileMatrixSet": "PM_6_17", + "apikey": "your_api_key_here" + }, + "Hydrography_Bcae_Latest": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 17, + "format": "image/png", + "style": "normal", + "variant": "HYDROGRAPHY.BCAE.LATEST", + "name": "GeoportailFrance.Hydrography_Bcae_Latest", + "TileMatrixSet": "PM_6_17", + "apikey": "your_api_key_here" + }, + "Hydrography_Hydrography": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4969, + -63.9692 + ], + [ + 71.5841, + 55.9644 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "HYDROGRAPHY.HYDROGRAPHY", + "name": "GeoportailFrance.Hydrography_Hydrography", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Ignf_cosia_2021-2023": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.0, + -5.5 + ], + [ + 52.0, + 10.0 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "IGNF_COSIA_2021-2023", + "name": "GeoportailFrance.Ignf_cosia_2021-2023", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Ignf_elevation_Elevationgridcoverage_Shadow": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.2735, + -5.27131 + ], + [ + 51.1791, + 9.67502 + ] + ], + "min_zoom": 6, + "max_zoom": 17, + "format": "image/png", + "style": "normal", + "variant": "IGNF_ELEVATION.ELEVATIONGRIDCOVERAGE.SHADOW", + "name": "GeoportailFrance.Ignf_elevation_Elevationgridcoverage_Shadow", + "TileMatrixSet": "PM_6_17", + "apikey": "your_api_key_here" + }, + "Ignf_lidar_hd_mnh_elevation_Elevationgridcoverage_Shadow": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.5, + -5.5 + ], + [ + 52.0, + 10.0 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "IGNF_LIDAR-HD_MNH_ELEVATION.ELEVATIONGRIDCOVERAGE.SHADOW", + "name": "GeoportailFrance.Ignf_lidar_hd_mnh_elevation_Elevationgridcoverage_Shadow", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Ignf_lidar_hd_mns_elevation_Elevationgridcoverage_Shadow": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.5, + -5.5 + ], + [ + 52.0, + 10.0 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "IGNF_LIDAR-HD_MNS_ELEVATION.ELEVATIONGRIDCOVERAGE.SHADOW", + "name": "GeoportailFrance.Ignf_lidar_hd_mns_elevation_Elevationgridcoverage_Shadow", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Ignf_lidar_hd_mnt_elevation_Elevationgridcoverage_Shadow": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.5, + -5.5 + ], + [ + 52.0, + 10.0 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "IGNF_LIDAR-HD_MNT_ELEVATION.ELEVATIONGRIDCOVERAGE.SHADOW", + "name": "GeoportailFrance.Ignf_lidar_hd_mnt_elevation_Elevationgridcoverage_Shadow", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Ign_nl_test_st_amand": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 46.7204, + 2.49458 + ], + [ + 46.7276, + 2.49723 + ] + ], + "min_zoom": 0, + "max_zoom": 21, + "format": "image/png", + "style": "normal", + "variant": "IGN_NL_TEST_ST_AMAND", + "name": "GeoportailFrance.Ign_nl_test_st_amand", + "TileMatrixSet": "PM_0_21", + "apikey": "your_api_key_here" + }, + "Inpe": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INPE", + "variant": "INPE", + "name": "GeoportailFrance.Inpe", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Inra_Carte_Sols": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "CARTE DES SOLS", + "variant": "INRA.CARTE.SOLS", + "name": "GeoportailFrance.Inra_Carte_Sols", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Enfants_0_17_Ans_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.ENFANTS.0.17.ANS.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Enfants_0_17_Ans_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Logements_Surface_Moyenne_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.LOGEMENTS.SURFACE.MOYENNE.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Logements_Surface_Moyenne_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Niveau_De_Vie_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.NIVEAU.DE.VIE.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Niveau_De_Vie_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Familles_Monoparentales_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.FAMILLES.MONOPARENTALES.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Familles_Monoparentales_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Individus_25_39_Ans_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.INDIVIDUS.25.39.ANS.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Individus_25_39_Ans_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Individus_40_54_Ans_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.INDIVIDUS.40.54.ANS.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Individus_40_54_Ans_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Individus_55_64_Ans_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.INDIVIDUS.55.64.ANS.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Individus_55_64_Ans_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Logements_Apres_1990_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.LOGEMENTS.APRES.1990.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Logements_Apres_1990_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Logements_Avant_1945_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.LOGEMENTS.AVANT.1945.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Logements_Avant_1945_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Logements_Collectifs_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.LOGEMENTS.COLLECTIFS.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Logements_Collectifs_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Logements_Construits_1945_1970_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.LOGEMENTS.CONSTRUITS.1945.1970.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Logements_Construits_1945_1970_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Logements_Construits_1970_1990_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.LOGEMENTS.CONSTRUITS.1970.1990.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Logements_Construits_1970_1990_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Logements_Sociaux_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.LOGEMENTS.SOCIAUX.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Logements_Sociaux_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Menages_1_Personne_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.MENAGES.1.PERSONNE.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Menages_1_Personne_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Menages_5_Personnes_Ouplus_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.MENAGES.5.PERSONNES.OUPLUS.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Menages_5_Personnes_Ouplus_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Menages_Maison_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.MENAGES.MAISON.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Menages_Maison_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Menages_Pauvres_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.MENAGES.PAUVRES.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Menages_Pauvres_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Menages_Proprietaires_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.MENAGES.PROPRIETAIRES.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Menages_Proprietaires_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Part_Plus_65_Ans_Secret": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.PART.PLUS.65.ANS.SECRET", + "name": "GeoportailFrance.Insee_Filosofi_Part_Plus_65_Ans_Secret", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Insee_Filosofi_Population": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSEE", + "variant": "INSEE.FILOSOFI.POPULATION", + "name": "GeoportailFrance.Insee_Filosofi_Population", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Installations_Pv_Sol": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "INSTALLATIONS.PV.SOL", + "variant": "INSTALLATIONS.PV.SOL", + "name": "GeoportailFrance.Installations_Pv_Sol", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landcover_Cha00": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.CHA00", + "name": "GeoportailFrance.Landcover_Cha00", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Cha00_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.CHA00_FR", + "name": "GeoportailFrance.Landcover_Cha00_fr", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Cha06": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.4428, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CHA06", + "name": "GeoportailFrance.Landcover_Cha06", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Cha06_dom": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 47.1747, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CHA06_DOM", + "name": "GeoportailFrance.Landcover_Cha06_dom", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Cha06_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.CHA06_FR", + "name": "GeoportailFrance.Landcover_Cha06_fr", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Cha12": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.4428, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CHA12", + "name": "GeoportailFrance.Landcover_Cha12", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Cha12_dom": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 47.1747, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CHA12_DOM", + "name": "GeoportailFrance.Landcover_Cha12_dom", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Cha12_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.CHA12_FR", + "name": "GeoportailFrance.Landcover_Cha12_fr", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Cha18": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.4428, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover", + "variant": "LANDCOVER.CHA18", + "name": "GeoportailFrance.Landcover_Cha18", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Cha18_dom": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 47.1747, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CHA18_DOM", + "name": "GeoportailFrance.Landcover_Cha18_dom", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Cha18_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.CHA18_FR", + "name": "GeoportailFrance.Landcover_Cha18_fr", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc00": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.4428, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CLC00", + "name": "GeoportailFrance.Landcover_Clc00", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc00r": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.4428, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CLC00R", + "name": "GeoportailFrance.Landcover_Clc00r", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc00r_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.CLC00R_FR", + "name": "GeoportailFrance.Landcover_Clc00r_fr", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc00_dom": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 47.1747, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CLC00_DOM", + "name": "GeoportailFrance.Landcover_Clc00_dom", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc00_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.CLC00_FR", + "name": "GeoportailFrance.Landcover_Clc00_fr", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc06": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.4428, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CLC06", + "name": "GeoportailFrance.Landcover_Clc06", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc06r": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.4428, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CLC06R", + "name": "GeoportailFrance.Landcover_Clc06r", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc06r_dom": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 47.1747, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CLC06R_DOM", + "name": "GeoportailFrance.Landcover_Clc06r_dom", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc06r_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.CLC06R_FR", + "name": "GeoportailFrance.Landcover_Clc06r_fr", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc06_dom": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 47.1747, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CLC06_DOM", + "name": "GeoportailFrance.Landcover_Clc06_dom", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc06_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.CLC06_FR", + "name": "GeoportailFrance.Landcover_Clc06_fr", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc12": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.4428, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CLC12", + "name": "GeoportailFrance.Landcover_Clc12", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc12r": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.4428, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover", + "variant": "LANDCOVER.CLC12R", + "name": "GeoportailFrance.Landcover_Clc12r", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc12r_dom": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 47.1747, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CLC12R_DOM", + "name": "GeoportailFrance.Landcover_Clc12r_dom", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc12r_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.CLC12R_FR", + "name": "GeoportailFrance.Landcover_Clc12r_fr", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc12_dom": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 47.1747, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CLC12_DOM", + "name": "GeoportailFrance.Landcover_Clc12_dom", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc12_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.CLC12_FR", + "name": "GeoportailFrance.Landcover_Clc12_fr", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc18": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.4428, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover", + "variant": "LANDCOVER.CLC18", + "name": "GeoportailFrance.Landcover_Clc18", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc18_dom": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 47.1747, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.CLC18_DOM", + "name": "GeoportailFrance.Landcover_Clc18_dom", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc18_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.CLC18_FR", + "name": "GeoportailFrance.Landcover_Clc18_fr", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc90": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.CLC90", + "name": "GeoportailFrance.Landcover_Clc90", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Clc90_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.CLC90_FR", + "name": "GeoportailFrance.Landcover_Clc90_fr", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landcover_Edugeo_Evol_surface_forestiere_1980_2011": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 0, + "max_zoom": 15, + "format": "image/png", + "style": "normal", + "variant": "LANDCOVER.EDUGEO.EVOL_SURFACE_FORESTIERE_1980-2011", + "name": "GeoportailFrance.Landcover_Edugeo_Evol_surface_forestiere_1980_2011", + "TileMatrixSet": "PM_0_15", + "apikey": "your_api_key_here" + }, + "Landcover_Edugeo_Klaus": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/png", + "style": "normal", + "variant": "LANDCOVER.EDUGEO.KLAUS", + "name": "GeoportailFrance.Landcover_Edugeo_Klaus", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Landcover_Edugeo_Lgv_archeologie": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "LANDCOVER.EDUGEO.LGV_archeologie", + "name": "GeoportailFrance.Landcover_Edugeo_Lgv_archeologie", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Landcover_Edugeo_Lgv_faune": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.8631, + -0.898315 + ], + [ + 47.4145, + 0.898315 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "LANDCOVER.EDUGEO.LGV_faune", + "name": "GeoportailFrance.Landcover_Edugeo_Lgv_faune", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Landcover_Edugeo_Lgv_flore": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.8631, + -0.898315 + ], + [ + 47.4145, + 0.898315 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "LANDCOVER.EDUGEO.LGV_flore", + "name": "GeoportailFrance.Landcover_Edugeo_Lgv_flore", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Landcover_Edugeo_Lgv_technique": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.8631, + -0.898315 + ], + [ + 47.4145, + 0.898315 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "LANDCOVER.EDUGEO.LGV_technique", + "name": "GeoportailFrance.Landcover_Edugeo_Lgv_technique", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Landcover_Edugeo_Taux_boisement_2009_2013": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 0, + "max_zoom": 15, + "format": "image/png", + "style": "normal", + "variant": "LANDCOVER.EDUGEO.TAUX_BOISEMENT_2009-2013", + "name": "GeoportailFrance.Landcover_Edugeo_Taux_boisement_2009_2013", + "TileMatrixSet": "PM_0_15", + "apikey": "your_api_key_here" + }, + "Landcover_Forestareas": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDCOVER.FORESTAREAS", + "name": "GeoportailFrance.Landcover_Forestareas", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landcover_Forestinventory_V1": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDCOVER.FORESTINVENTORY.V1", + "name": "GeoportailFrance.Landcover_Forestinventory_V1", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landcover_Forestinventory_V2": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "LANDCOVER.FORESTINVENTORY.V2", + "variant": "LANDCOVER.FORESTINVENTORY.V2", + "name": "GeoportailFrance.Landcover_Forestinventory_V2", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landcover_Grid_Clc00": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4825, + -61.9063 + ], + [ + 51.1827, + 55.9362 + ] + ], + "min_zoom": 0, + "max_zoom": 13, + "format": "image/png", + "style": "CORINE Land Cover", + "variant": "LANDCOVER.GRID.CLC00", + "name": "GeoportailFrance.Landcover_Grid_Clc00", + "TileMatrixSet": "PM_0_13", + "apikey": "your_api_key_here" + }, + "Landcover_Grid_Clc00r_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.1779, + -5.68494 + ], + [ + 51.1827, + 10.8556 + ] + ], + "min_zoom": 0, + "max_zoom": 13, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.GRID.CLC00R_FR", + "name": "GeoportailFrance.Landcover_Grid_Clc00r_fr", + "TileMatrixSet": "PM_0_13", + "apikey": "your_api_key_here" + }, + "Landcover_Grid_Clc00_dom": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4825, + -61.9063 + ], + [ + 16.6077, + 55.9362 + ] + ], + "min_zoom": 0, + "max_zoom": 12, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.GRID.CLC00_DOM", + "name": "GeoportailFrance.Landcover_Grid_Clc00_dom", + "TileMatrixSet": "PM_0_12", + "apikey": "your_api_key_here" + }, + "Landcover_Grid_Clc00_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.1779, + -5.68494 + ], + [ + 51.1827, + 10.8556 + ] + ], + "min_zoom": 0, + "max_zoom": 12, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.GRID.CLC00_FR", + "name": "GeoportailFrance.Landcover_Grid_Clc00_fr", + "TileMatrixSet": "PM_0_12", + "apikey": "your_api_key_here" + }, + "Landcover_Grid_Clc06": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -89.0, + -180.0 + ], + [ + 89.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 13, + "format": "image/png", + "style": "CORINE Land Cover", + "variant": "LANDCOVER.GRID.CLC06", + "name": "GeoportailFrance.Landcover_Grid_Clc06", + "TileMatrixSet": "PM_0_13", + "apikey": "your_api_key_here" + }, + "Landcover_Grid_Clc06r": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4825, + -61.9063 + ], + [ + 51.2963, + 55.9362 + ] + ], + "min_zoom": 0, + "max_zoom": 13, + "format": "image/png", + "style": "CORINE Land Cover", + "variant": "LANDCOVER.GRID.CLC06R", + "name": "GeoportailFrance.Landcover_Grid_Clc06r", + "TileMatrixSet": "PM_0_13", + "apikey": "your_api_key_here" + }, + "Landcover_Grid_Clc06r_dom": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4825, + -61.9063 + ], + [ + 16.6077, + 55.9362 + ] + ], + "min_zoom": 0, + "max_zoom": 12, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.GRID.CLC06R_DOM", + "name": "GeoportailFrance.Landcover_Grid_Clc06r_dom", + "TileMatrixSet": "PM_0_12", + "apikey": "your_api_key_here" + }, + "Landcover_Grid_Clc06r_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.0278, + -5.91689 + ], + [ + 51.2963, + 11.0883 + ] + ], + "min_zoom": 0, + "max_zoom": 12, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.GRID.CLC06R_FR", + "name": "GeoportailFrance.Landcover_Grid_Clc06r_fr", + "TileMatrixSet": "PM_0_12", + "apikey": "your_api_key_here" + }, + "Landcover_Grid_Clc06_dom": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -89.0, + -180.0 + ], + [ + 89.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 12, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.GRID.CLC06_DOM", + "name": "GeoportailFrance.Landcover_Grid_Clc06_dom", + "TileMatrixSet": "PM_0_12", + "apikey": "your_api_key_here" + }, + "Landcover_Grid_Clc06_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.1779, + -5.68494 + ], + [ + 51.1827, + 10.8556 + ] + ], + "min_zoom": 0, + "max_zoom": 12, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.GRID.CLC06_FR", + "name": "GeoportailFrance.Landcover_Grid_Clc06_fr", + "TileMatrixSet": "PM_0_12", + "apikey": "your_api_key_here" + }, + "Landcover_Grid_Clc12": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -89.0, + -180.0 + ], + [ + 89.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 13, + "format": "image/png", + "style": "CORINE Land Cover", + "variant": "LANDCOVER.GRID.CLC12", + "name": "GeoportailFrance.Landcover_Grid_Clc12", + "TileMatrixSet": "PM_0_13", + "apikey": "your_api_key_here" + }, + "Landcover_Grid_Clc12_dom": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -89.0, + -180.0 + ], + [ + 89.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 12, + "format": "image/png", + "style": "CORINE Land Cover - DOM", + "variant": "LANDCOVER.GRID.CLC12_DOM", + "name": "GeoportailFrance.Landcover_Grid_Clc12_dom", + "TileMatrixSet": "PM_0_12", + "apikey": "your_api_key_here" + }, + "Landcover_Grid_Clc12_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.0278, + -5.91689 + ], + [ + 51.2963, + 11.0883 + ] + ], + "min_zoom": 0, + "max_zoom": 12, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.GRID.CLC12_FR", + "name": "GeoportailFrance.Landcover_Grid_Clc12_fr", + "TileMatrixSet": "PM_0_12", + "apikey": "your_api_key_here" + }, + "Landcover_Grid_Clc90_fr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.1779, + -5.68494 + ], + [ + 51.1827, + 10.8556 + ] + ], + "min_zoom": 0, + "max_zoom": 13, + "format": "image/png", + "style": "CORINE Land Cover - France m\u00e9tropolitaine", + "variant": "LANDCOVER.GRID.CLC90_FR", + "name": "GeoportailFrance.Landcover_Grid_Clc90_fr", + "TileMatrixSet": "PM_0_13", + "apikey": "your_api_key_here" + }, + "Landcover_Hr_Dlt_Clc12": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -89.0, + -180.0 + ], + [ + 89.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 13, + "format": "image/png", + "style": "CORINE Land Cover - HR - type de for\u00eats", + "variant": "LANDCOVER.HR.DLT.CLC12", + "name": "GeoportailFrance.Landcover_Hr_Dlt_Clc12", + "TileMatrixSet": "PM_0_13", + "apikey": "your_api_key_here" + }, + "Landcover_Hr_Dlt_Clc15": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -89.0, + -180.0 + ], + [ + 89.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 13, + "format": "image/png", + "style": "CORINE Land Cover - HR - type de for\u00eats", + "variant": "LANDCOVER.HR.DLT.CLC15", + "name": "GeoportailFrance.Landcover_Hr_Dlt_Clc15", + "TileMatrixSet": "PM_0_13", + "apikey": "your_api_key_here" + }, + "Landcover_Hr_Gra_Clc15": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -89.0, + -180.0 + ], + [ + 89.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 13, + "format": "image/png", + "style": "CORINE Land Cover - HR - prairies", + "variant": "LANDCOVER.HR.GRA.CLC15", + "name": "GeoportailFrance.Landcover_Hr_Gra_Clc15", + "TileMatrixSet": "PM_0_13", + "apikey": "your_api_key_here" + }, + "Landcover_Hr_Imd_Clc12": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -89.0, + -180.0 + ], + [ + 89.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 13, + "format": "image/png", + "style": "CORINE Land Cover - HR - taux d'imperm\u00e9abilisation des sols", + "variant": "LANDCOVER.HR.IMD.CLC12", + "name": "GeoportailFrance.Landcover_Hr_Imd_Clc12", + "TileMatrixSet": "PM_0_13", + "apikey": "your_api_key_here" + }, + "Landcover_Hr_Imd_Clc15": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -89.0, + -180.0 + ], + [ + 89.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 13, + "format": "image/png", + "style": "CORINE Land Cover - HR - taux d'imperm\u00e9abilisation des sols", + "variant": "LANDCOVER.HR.IMD.CLC15", + "name": "GeoportailFrance.Landcover_Hr_Imd_Clc15", + "TileMatrixSet": "PM_0_13", + "apikey": "your_api_key_here" + }, + "Landcover_Hr_Tcd_Clc12": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -89.0, + -180.0 + ], + [ + 89.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 13, + "format": "image/png", + "style": "CORINE Land Cover - HR - taux de couvert arbor\u00e9", + "variant": "LANDCOVER.HR.TCD.CLC12", + "name": "GeoportailFrance.Landcover_Hr_Tcd_Clc12", + "TileMatrixSet": "PM_0_13", + "apikey": "your_api_key_here" + }, + "Landcover_Hr_Tcd_Clc15": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -89.0, + -180.0 + ], + [ + 89.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 13, + "format": "image/png", + "style": "CORINE Land Cover - HR - taux de couvert arbor\u00e9", + "variant": "LANDCOVER.HR.TCD.CLC15", + "name": "GeoportailFrance.Landcover_Hr_Tcd_Clc15", + "TileMatrixSet": "PM_0_13", + "apikey": "your_api_key_here" + }, + "Landcover_Hr_Waw_Clc15": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -89.0, + -180.0 + ], + [ + 89.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 13, + "format": "image/png", + "style": "CORINE Land Cover - HR - zones humides et surfaces en eaux permanentes", + "variant": "LANDCOVER.HR.WAW.CLC15", + "name": "GeoportailFrance.Landcover_Hr_Waw_Clc15", + "TileMatrixSet": "PM_0_13", + "apikey": "your_api_key_here" + }, + "Landcover_Sylvoecoregions": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDCOVER.SYLVOECOREGIONS", + "name": "GeoportailFrance.Landcover_Sylvoecoregions", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landcover_Sylvoecoregions_Alluvium": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDCOVER.SYLVOECOREGIONS.ALLUVIUM", + "name": "GeoportailFrance.Landcover_Sylvoecoregions_Alluvium", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture_Latest": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE.LATEST", + "name": "GeoportailFrance.Landuse_Agriculture_Latest", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2007": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.419, + -63.2635 + ], + [ + 51.2203, + 56.0237 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2007", + "name": "GeoportailFrance.Landuse_Agriculture2007", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2008": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.419, + -63.2635 + ], + [ + 51.2203, + 56.0237 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2008", + "name": "GeoportailFrance.Landuse_Agriculture2008", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2009": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.419, + -63.2635 + ], + [ + 51.2203, + 56.0237 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2009", + "name": "GeoportailFrance.Landuse_Agriculture2009", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2010": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2010", + "name": "GeoportailFrance.Landuse_Agriculture2010", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2011": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2011", + "name": "GeoportailFrance.Landuse_Agriculture2011", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2012": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2012", + "name": "GeoportailFrance.Landuse_Agriculture2012", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2013": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2013", + "name": "GeoportailFrance.Landuse_Agriculture2013", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2014": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2014", + "name": "GeoportailFrance.Landuse_Agriculture2014", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2015": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2015", + "name": "GeoportailFrance.Landuse_Agriculture2015", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2016": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2016", + "name": "GeoportailFrance.Landuse_Agriculture2016", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2017": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2017", + "name": "GeoportailFrance.Landuse_Agriculture2017", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2018": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2018", + "name": "GeoportailFrance.Landuse_Agriculture2018", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2019": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2019", + "name": "GeoportailFrance.Landuse_Agriculture2019", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2020": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2020", + "name": "GeoportailFrance.Landuse_Agriculture2020", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2021": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2021", + "name": "GeoportailFrance.Landuse_Agriculture2021", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2022": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2022", + "name": "GeoportailFrance.Landuse_Agriculture2022", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Landuse_Agriculture2023": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LANDUSE.AGRICULTURE2023", + "name": "GeoportailFrance.Landuse_Agriculture2023", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Lgv_edugeo_archeologie_pyr-png_fxx_wm_20170210": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "LGV_EDUGEO_ARCHEOLOGIE_PYR-PNG_FXX_WM_20170210", + "name": "GeoportailFrance.Lgv_edugeo_archeologie_pyr-png_fxx_wm_20170210", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Lgv_edugeo_faune_pyr-png_fxx_wm_20170215": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.8631, + -0.898315 + ], + [ + 47.4145, + 0.898315 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "LGV_EDUGEO_FAUNE_PYR-PNG_FXX_WM_20170215", + "name": "GeoportailFrance.Lgv_edugeo_faune_pyr-png_fxx_wm_20170215", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Lgv_edugeo_flore_pyr-png_fxx_wm_20170213": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.8631, + -0.898315 + ], + [ + 47.4145, + 0.898315 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "LGV_EDUGEO_FLORE_PYR-PNG_FXX_WM_20170213", + "name": "GeoportailFrance.Lgv_edugeo_flore_pyr-png_fxx_wm_20170213", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Lgv_edugeo_technique_pyr-png_fxx_wm_20170215": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.8631, + -0.898315 + ], + [ + 47.4145, + 0.898315 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "LGV_EDUGEO_TECHNIQUE_PYR-PNG_FXX_WM_20170215", + "name": "GeoportailFrance.Lgv_edugeo_technique_pyr-png_fxx_wm_20170215", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Limites_administratives_express_Latest": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LIMITES_ADMINISTRATIVES_EXPRESS.LATEST", + "name": "GeoportailFrance.Limites_administratives_express_Latest", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Localisation_Concessions_Hydro": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "LOCALISATION.CONCESSIONS.HYDRO", + "variant": "LOCALISATION.CONCESSIONS.HYDRO", + "name": "GeoportailFrance.Localisation_Concessions_Hydro", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Localisation_Mats_Eolien": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "LOCALISATION.MATS.EOLIEN", + "variant": "LOCALISATION.MATS.EOLIEN", + "name": "GeoportailFrance.Localisation_Mats_Eolien", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Lsep-crue_pyr-png_wld_wm_edugeo_20130128": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.4163, + 0.419457 + ], + [ + 50.064, + 5.43248 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "LSEP-CRUE_PYR-PNG_WLD_WM_EDUGEO_20130128", + "name": "GeoportailFrance.Lsep-crue_pyr-png_wld_wm_edugeo_20130128", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Maj_evdc": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 46.5514, + 0.495276 + ], + [ + 46.5662, + 0.51663 + ] + ], + "min_zoom": 6, + "max_zoom": 22, + "format": "image/jpeg", + "style": "normal", + "variant": "MAJ_EVDC", + "name": "GeoportailFrance.Maj_evdc", + "TileMatrixSet": "2154_5cm_6_22", + "apikey": "your_api_key_here" + }, + "Naturalriskzones_1910floodedwatersheds": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.4163, + 0.419457 + ], + [ + 50.064, + 5.43248 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "NATURALRISKZONES.1910FLOODEDWATERSHEDS", + "name": "GeoportailFrance.Naturalriskzones_1910floodedwatersheds", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Artif_2016_2017": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3998, + -63.1614 + ], + [ + 51.0991, + 55.8465 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.ARTIF.2016-2017", + "name": "GeoportailFrance.Ocsge_Artif_2016_2017", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Artif_2017_2020": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3998, + -63.1614 + ], + [ + 51.0991, + 55.8465 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.ARTIF.2017-2020", + "name": "GeoportailFrance.Ocsge_Artif_2017_2020", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Artif_2021_2023": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3998, + -63.1614 + ], + [ + 51.0991, + 55.8465 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.ARTIF.2021-2023", + "name": "GeoportailFrance.Ocsge_Artif_2021_2023", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Construction_2010": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.CONSTRUCTION.2010", + "name": "GeoportailFrance.Ocsge_Construction_2010", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Construction_2016_2017": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.1505 + ], + [ + 51.0991, + 9.5705 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.CONSTRUCTION.2016-2017", + "name": "GeoportailFrance.Ocsge_Construction_2016_2017", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Construction_2017_2020": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3998, + -63.1614 + ], + [ + 51.0991, + 55.8465 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.CONSTRUCTION.2017-2020", + "name": "GeoportailFrance.Ocsge_Construction_2017_2020", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Construction_2021_2023": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3998, + -63.1614 + ], + [ + 51.0991, + 55.8465 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.CONSTRUCTION.2021-2023", + "name": "GeoportailFrance.Ocsge_Construction_2021_2023", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Constructions": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 14.2395, + -61.6644 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.CONSTRUCTIONS", + "name": "GeoportailFrance.Ocsge_Constructions", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Constructions_2002": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.366, + -5.13902 + ], + [ + 51.089, + 9.55982 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.CONSTRUCTIONS.2002", + "name": "GeoportailFrance.Ocsge_Constructions_2002", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here", + "status": "broken" + }, + "Ocsge_Constructions_2011": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.CONSTRUCTIONS.2011", + "name": "GeoportailFrance.Ocsge_Constructions_2011", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Constructions_2014": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.366, + -5.13902 + ], + [ + 51.089, + 9.55982 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.CONSTRUCTIONS.2014", + "name": "GeoportailFrance.Ocsge_Constructions_2014", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here", + "status": "broken" + }, + "Ocsge_Constructions_2016": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.CONSTRUCTIONS.2016", + "name": "GeoportailFrance.Ocsge_Constructions_2016", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Constructions_2017": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 14.2395, + -61.6644 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.CONSTRUCTIONS.2017", + "name": "GeoportailFrance.Ocsge_Constructions_2017", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Constructions_2019": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.3043, + -0.291052 + ], + [ + 44.0864, + 1.2122 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.CONSTRUCTIONS.2019", + "name": "GeoportailFrance.Ocsge_Constructions_2019", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Couverture": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 14.2395, + -61.6644 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.COUVERTURE", + "name": "GeoportailFrance.Ocsge_Couverture", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Couverture_2002": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.366, + -5.13902 + ], + [ + 51.089, + 9.55982 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.COUVERTURE.2002", + "name": "GeoportailFrance.Ocsge_Couverture_2002", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here", + "status": "broken" + }, + "Ocsge_Couverture_2010": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.COUVERTURE.2010", + "name": "GeoportailFrance.Ocsge_Couverture_2010", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Couverture_2011": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.COUVERTURE.2011", + "name": "GeoportailFrance.Ocsge_Couverture_2011", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Couverture_2014": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.366, + -5.13902 + ], + [ + 51.089, + 9.55982 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.COUVERTURE.2014", + "name": "GeoportailFrance.Ocsge_Couverture_2014", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here", + "status": "broken" + }, + "Ocsge_Couverture_2016": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.COUVERTURE.2016", + "name": "GeoportailFrance.Ocsge_Couverture_2016", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Couverture_2016_2017": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.1505 + ], + [ + 51.0991, + 9.5705 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.COUVERTURE.2016-2017", + "name": "GeoportailFrance.Ocsge_Couverture_2016_2017", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Couverture_2017": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 14.2395, + -61.6644 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.COUVERTURE.2017", + "name": "GeoportailFrance.Ocsge_Couverture_2017", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Couverture_2017_2020": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3998, + -63.1614 + ], + [ + 51.0991, + 55.8465 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.COUVERTURE.2017-2020", + "name": "GeoportailFrance.Ocsge_Couverture_2017_2020", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Couverture_2019": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.3043, + -0.291052 + ], + [ + 44.0864, + 1.2122 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.COUVERTURE.2019", + "name": "GeoportailFrance.Ocsge_Couverture_2019", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Couverture_2021_2023": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3998, + -63.1614 + ], + [ + 51.0991, + 55.8465 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.COUVERTURE.2021-2023", + "name": "GeoportailFrance.Ocsge_Couverture_2021_2023", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Usage": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 14.2395, + -61.6644 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.USAGE", + "name": "GeoportailFrance.Ocsge_Usage", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Usage_2002": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.366, + -5.13902 + ], + [ + 51.089, + 9.55982 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.USAGE.2002", + "name": "GeoportailFrance.Ocsge_Usage_2002", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here", + "status": "broken" + }, + "Ocsge_Usage_2010": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.USAGE.2010", + "name": "GeoportailFrance.Ocsge_Usage_2010", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Usage_2011": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.USAGE.2011", + "name": "GeoportailFrance.Ocsge_Usage_2011", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Usage_2014": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.366, + -5.13902 + ], + [ + 51.089, + 9.55982 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.USAGE.2014", + "name": "GeoportailFrance.Ocsge_Usage_2014", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here", + "status": "broken" + }, + "Ocsge_Usage_2016": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.USAGE.2016", + "name": "GeoportailFrance.Ocsge_Usage_2016", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Usage_2016_2017": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.1505 + ], + [ + 51.0991, + 9.5705 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.USAGE.2016-2017", + "name": "GeoportailFrance.Ocsge_Usage_2016_2017", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Usage_2017": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 14.2395, + -61.6644 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.USAGE.2017", + "name": "GeoportailFrance.Ocsge_Usage_2017", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Usage_2017_2020": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3998, + -63.1614 + ], + [ + 51.0991, + 55.8465 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.USAGE.2017-2020", + "name": "GeoportailFrance.Ocsge_Usage_2017_2020", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Usage_2019": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.3043, + -0.291052 + ], + [ + 44.0864, + 1.2122 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.USAGE.2019", + "name": "GeoportailFrance.Ocsge_Usage_2019", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Usage_2021_2023": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3998, + -63.1614 + ], + [ + 51.0991, + 55.8465 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "OCSGE.USAGE.2021-2023", + "name": "GeoportailFrance.Ocsge_Usage_2021_2023", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ocsge_Visu_2016": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.2815, + -0.318517 + ], + [ + 44.0543, + 1.22575 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.VISU.2016", + "name": "GeoportailFrance.Ocsge_Visu_2016", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Ocsge_Visu_2019": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.2815, + -0.321664 + ], + [ + 44.1082, + 1.22575 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "nolegend", + "variant": "OCSGE.VISU.2019", + "name": "GeoportailFrance.Ocsge_Visu_2019", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Ofb_Zones_Exclues": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "OFB.ZONES.EXCLUES", + "variant": "OFB.ZONES.EXCLUES", + "name": "GeoportailFrance.Ofb_Zones_Exclues", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ofb_Zones_Exclues_Sauf_Toiture": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "OFB.ZONES.EXCLUES.SAUF.TOITURE", + "variant": "OFB.ZONES.EXCLUES.SAUF.TOITURE", + "name": "GeoportailFrance.Ofb_Zones_Exclues_Sauf_Toiture", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ofb_Zones_Necessitant_Avis_Gestionnaire": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "OFB.ZONES.NECESSITANT.AVIS.GESTIONNAIRE", + "variant": "OFB.ZONES.NECESSITANT.AVIS.GESTIONNAIRE", + "name": "GeoportailFrance.Ofb_Zones_Necessitant_Avis_Gestionnaire", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Ortho-edugeo_pyr-png_wld_wm": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.4607, + -3.20264 + ], + [ + 47.7138, + -2.62716 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHO-EDUGEO_PYR-PNG_WLD_WM", + "name": "GeoportailFrance.Ortho-edugeo_pyr-png_wld_wm", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Ortho-express-2020_pyr-jpg_wld_wm_wmts2": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHO-EXPRESS-2020_PYR-JPG_WLD_WM_WMTS2", + "name": "GeoportailFrance.Ortho-express-2020_pyr-jpg_wld_wm_wmts2", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Ajaccio1975": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.8334, + 8.65713 + ], + [ + 42.0846, + 8.98239 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.AJACCIO1975", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Ajaccio1975", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Ajaccio1990": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.7868, + 8.64462 + ], + [ + 42.0939, + 8.98239 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.AJACCIO1990", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Ajaccio1990", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Arcachon2010": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.2289, + -1.87654 + ], + [ + 45.0301, + -0.750618 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.ARCACHON2010", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Arcachon2010", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Arras_lens_bethune2008": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.929, + 1.75144 + ], + [ + 50.8068, + 3.25268 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.ARRAS-LENS-BETHUNE2008", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Arras_lens_bethune2008", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Belfort_montbelliard1951": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.4607, + 6.69301 + ], + [ + 47.6801, + 6.96824 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.BELFORT-MONTBELLIARD1951", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Belfort_montbelliard1951", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Berry_sud1950": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 46.3669, + 1.23852 + ], + [ + 46.4531, + 1.48873 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.BERRY-SUD1950", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Berry_sud1950", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Berry_sud1970": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 46.6081, + 1.01333 + ], + [ + 46.7283, + 1.42617 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.BERRY-SUD1970", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Berry_sud1970", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Bethune1963": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 50.3939, + 2.62716 + ], + [ + 50.5054, + 2.95243 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.BETHUNE1963", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Bethune1963", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Bethune1964": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 50.33, + 2.83984 + ], + [ + 50.4098, + 3.29021 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.BETHUNE1964", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Bethune1964", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Bethune1988": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 50.322, + 2.5521 + ], + [ + 50.4895, + 3.24017 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.BETHUNE1988", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Bethune1988", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Biarritz1977": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.3165, + -1.8265 + ], + [ + 43.7157, + -1.18848 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.BIARRITZ1977", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Biarritz1977", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Biarrtitz1979": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.6795, + -1.13844 + ], + [ + 43.7609, + -0.975803 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.BIARRTITZ1979", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Biarrtitz1979", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Bordeaux2003": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.6754, + -1.12593 + ], + [ + 45.5582, + 0.125103 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.BORDEAUX2003", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Bordeaux2003", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Bourg_st_maurice1956": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.4793, + 6.61795 + ], + [ + 45.6282, + 6.85564 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.BOURG-ST-MAURICE1956", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Bourg_st_maurice1956", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Caen1991": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.035, + -0.975803 + ], + [ + 49.4109, + 0.0250206 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.CAEN1991", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Caen1991", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Cap_d_agde1968": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.1889, + 3.02749 + ], + [ + 43.3984, + 3.60297 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.CAP-D-AGDE1968", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Cap_d_agde1968", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Cap_d_agde2008": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.1433, + 3.12757 + ], + [ + 43.5073, + 3.75309 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.CAP-D-AGDE2008", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Cap_d_agde2008", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Cap_dage1981": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.1889, + 3.01498 + ], + [ + 43.3984, + 3.66552 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.CAP-DAGE1981", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Cap_dage1981", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Clermont_ferrand1965": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.7156, + 2.82733 + ], + [ + 45.9596, + 3.29021 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.CLERMONT-FERRAND1965", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Clermont_ferrand1965", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Clermont_ferrand1985": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.7069, + 2.88988 + ], + [ + 45.9423, + 3.2777 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.CLERMONT-FERRAND1985", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Clermont_ferrand1985", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Creil_sud_picardie1975": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.076, + 2.25185 + ], + [ + 49.5085, + 2.96494 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.CREIL-SUD-PICARDIE1975", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Creil_sud_picardie1975", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Dijon1971": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.1893, + 4.87902 + ], + [ + 47.3676, + 5.24181 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.DIJON1971", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Dijon1971", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Grenoble1966": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.0655, + 5.61712 + ], + [ + 45.286, + 5.94239 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.GRENOBLE1966", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Grenoble1966", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Grenoble1989": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.0566, + 5.54206 + ], + [ + 45.3387, + 5.96741 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.GRENOBLE1989", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Grenoble1989", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Guadeloupe1984": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 15.9411, + -61.7633 + ], + [ + 16.3376, + -61.4756 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.GUADELOUPE1984", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Guadeloupe1984", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Guyane1955": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 5.384, + -54.1321 + ], + [ + 5.79487, + -53.5065 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.GUYANE1955", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Guyane1955", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_La_reunion1961": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3906, + 55.258 + ], + [ + -20.8538, + 55.5833 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.LA-REUNION1961", + "name": "GeoportailFrance.Orthoimagery_Edugeo_La_reunion1961", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_La_reunion1980": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4372, + 55.1579 + ], + [ + -20.7836, + 55.6583 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.LA-REUNION1980", + "name": "GeoportailFrance.Orthoimagery_Edugeo_La_reunion1980", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_La_reunion1989": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4022, + 55.2079 + ], + [ + -20.8538, + 55.7334 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.LA-REUNION1989", + "name": "GeoportailFrance.Orthoimagery_Edugeo_La_reunion1989", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_La_reunion2010": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4954, + 55.0453 + ], + [ + -20.6783, + 55.921 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.LA-REUNION2010", + "name": "GeoportailFrance.Orthoimagery_Edugeo_La_reunion2010", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_La_rochelle_rochefort1973": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 46.0726, + -1.37613 + ], + [ + 46.2286, + -1.03835 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.LA-ROCHELLE-ROCHEFORT1973", + "name": "GeoportailFrance.Orthoimagery_Edugeo_La_rochelle_rochefort1973", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Le_havre1955": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.4597, + 0.0500412 + ], + [ + 49.5409, + 0.387819 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.LE-HAVRE1955", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Le_havre1955", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Le_havre1964": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.4434, + 0.0500412 + ], + [ + 49.622, + 0.375309 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.LE-HAVRE1964", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Le_havre1964", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Le_havre2008": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.035, + -0.375309 + ], + [ + 49.8484, + 1.00082 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.LE-HAVRE2008", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Le_havre2008", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Limoges1974": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.7069, + 1.00082 + ], + [ + 45.9596, + 1.42617 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.LIMOGES1974", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Limoges1974", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Lyon1965": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.5494, + 4.71638 + ], + [ + 45.8987, + 5.07918 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.LYON1965", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Lyon1965", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Lyon1984": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.7069, + 4.70387 + ], + [ + 45.8726, + 5.17926 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.LYON1984", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Lyon1984", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Lyon1988": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.5319, + 4.62881 + ], + [ + 45.9161, + 5.12922 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.LYON1988", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Lyon1988", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Lyon2008": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.2067, + 4.50371 + ], + [ + 45.9944, + 5.75474 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.LYON2008", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Lyon2008", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Marne_la_vallee1965": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.846, + 2.40198 + ], + [ + 48.9858, + 2.93992 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.MARNE-LA-VALLEE1965", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Marne_la_vallee1965", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Marne_la_vallee1977": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.8131, + 2.48955 + ], + [ + 48.9694, + 2.92741 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.MARNE-LA-VALLEE1977", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Marne_la_vallee1977", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Marne_la_vallee1987": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.8625, + 2.47704 + ], + [ + 48.9447, + 2.92741 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.MARNE-LA-VALLEE1987", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Marne_la_vallee1987", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Marseille_martigues1969": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.1798, + 5.20428 + ], + [ + 43.3984, + 5.69219 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.MARSEILLE-MARTIGUES1969", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Marseille_martigues1969", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Marseille_martigues1980": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.3165, + 4.67885 + ], + [ + 43.5708, + 5.29186 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.MARSEILLE-MARTIGUES1980", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Marseille_martigues1980", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Marseille_martigues1987": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.3165, + 4.65383 + ], + [ + 43.5708, + 5.1042 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.MARSEILLE-MARTIGUES1987", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Marseille_martigues1987", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Marseille_martigues1988": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.3711, + 4.91655 + ], + [ + 43.5708, + 5.39194 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.MARSEILLE-MARTIGUES1988", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Marseille_martigues1988", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Marseille_martigues2010": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.1433, + 5.25433 + ], + [ + 43.4165, + 5.75474 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.MARSEILLE-MARTIGUES2010", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Marseille_martigues2010", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Martinique1988": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 14.3713, + -61.1378 + ], + [ + 14.7104, + -60.8251 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.MARTINIQUE1988", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Martinique1988", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Metz_nancy1982": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.5902, + 5.9549 + ], + [ + 49.3376, + 6.43029 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.METZ-NANCY1982", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Metz_nancy1982", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Nantes1971": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.1042, + -2.27687 + ], + [ + 47.3591, + -1.40115 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.NANTES1971", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Nantes1971", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Paris1949": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.7636, + 2.20181 + ], + [ + 48.9529, + 2.52708 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.PARIS1949", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Paris1949", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Paris1965": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.846, + 2.02667 + ], + [ + 48.9858, + 2.48955 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.PARIS1965", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Paris1965", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Paris2010spot": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.5405, + 1.87654 + ], + [ + 49.362, + 3.00247 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.PARIS2010SPOT", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Paris2010spot", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Reims1963": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.117, + 3.95325 + ], + [ + 49.2968, + 4.21597 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.REIMS1963", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Reims1963", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Reims1973": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.1252, + 3.95325 + ], + [ + 49.2886, + 4.22848 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.REIMS1973", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Reims1973", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Reims1988": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.1252, + 3.91572 + ], + [ + 49.2805, + 4.2535 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.REIMS1988", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Reims1988", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Reims2010": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.9529, + 3.50288 + ], + [ + 49.362, + 4.75391 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.REIMS2010", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Reims2010", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Roissy1965": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.9036, + 2.35194 + ], + [ + 49.0432, + 2.70222 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.ROISSY1965", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Roissy1965", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Roissy1987": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.9447, + 2.45202 + ], + [ + 49.035, + 2.65218 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.ROISSY1987", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Roissy1987", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Strasbourg1975": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.4078, + 7.31852 + ], + [ + 48.6563, + 7.93153 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.STRASBOURG1975", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Strasbourg1975", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Strasbourg1985": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.3995, + 7.46865 + ], + [ + 48.6232, + 7.894 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.STRASBOURG1985", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Strasbourg1985", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Strasbourg2010": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.0411, + 7.13087 + ], + [ + 48.8707, + 8.2568 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.STRASBOURG2010", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Strasbourg2010", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Toulon_hyeres1972": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 42.9696, + 5.74223 + ], + [ + 43.2163, + 6.33021 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.TOULON-HYERES1972", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Toulon_hyeres1972", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Toulouse1954": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.5618, + 1.23852 + ], + [ + 43.7247, + 1.55128 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.TOULOUSE1954", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Toulouse1954", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Valee_du_drac2010": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.7643, + 5.12922 + ], + [ + 45.0301, + 6.25515 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.VALEE-DU-DRAC2010", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Valee_du_drac2010", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Vannes_golfe_du_morbihan1970": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.4607, + -3.20264 + ], + [ + 47.7138, + -2.62716 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.VANNES-GOLFE-DU-MORBIHAN1970", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Vannes_golfe_du_morbihan1970", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Versailles1965": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.6067, + 1.98914 + ], + [ + 48.8789, + 2.32692 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.VERSAILLES1965", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Versailles1965", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Edugeo_Versailles1989": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.6315, + 1.87654 + ], + [ + 48.8789, + 2.33943 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.EDUGEO.VERSAILLES1989", + "name": "GeoportailFrance.Orthoimagery_Edugeo_Versailles1989", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Pleiades_2012": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3539, + -53.2686 + ], + [ + 50.6037, + 55.5544 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2012", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2012", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Pleiades_2013": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2013", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2013", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Pleiades_2014": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2014", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2014", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Pleiades_2015": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -37.8942, + -178.196 + ], + [ + 51.0283, + 77.6156 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2015", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2015", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Pleiades_2016": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.32, + -54.1373 + ], + [ + 50.6549, + 55.8441 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2016", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2016", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Pleiades_2017": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -63.1796 + ], + [ + 51.1117, + 55.8465 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2017", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2017", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Pleiades_2018": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4094, + -63.1702 + ], + [ + 51.0841, + 55.8649 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2018", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2018", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Pleiades_2019": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4094, + -63.1702 + ], + [ + 51.1117, + 55.8649 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2019", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2019", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Pleiades_2020": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -13.0169, + -63.1724 + ], + [ + 51.1117, + 45.3136 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2020", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2020", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Pleiades_2021": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -61.8234 + ], + [ + 51.13, + 55.8464 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2021", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2021", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Pleiades_2022": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -13.0259, + -61.6648 + ], + [ + 51.1117, + 45.3136 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2022", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2022", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Pleiades_2025": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -13.0277, + 44.9613 + ], + [ + -12.6208, + 45.3115 + ] + ], + "min_zoom": 4, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.PLEIADES.2025", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_2025", + "TileMatrixSet": "PM_4_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Pleiades_Mayotte_2024_06": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -13.091, + 44.9299 + ], + [ + -12.5665, + 45.317 + ] + ], + "min_zoom": 4, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.PLEIADES.MAYOTTE.2024-06", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Pleiades_Mayotte_2024_06", + "TileMatrixSet": "PM_4_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Rapideye_2010": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.2014, + -5.80725 + ], + [ + 50.9218, + 10.961 + ] + ], + "min_zoom": 0, + "max_zoom": 15, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.RAPIDEYE.2010", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Rapideye_2010", + "TileMatrixSet": "PM_0_15", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Rapideye_2011": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.0227, + -5.80725 + ], + [ + 51.1752, + 10.961 + ] + ], + "min_zoom": 0, + "max_zoom": 15, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.RAPIDEYE.2011", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Rapideye_2011", + "TileMatrixSet": "PM_0_15", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Spot_2013": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.8809, + 0.563585 + ], + [ + 50.3879, + 4.29191 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.SPOT.2013", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2013", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Spot_2014": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.SPOT.2014", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2014", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Spot_2015": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4104, + -61.8141 + ], + [ + 51.106, + 55.856 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.SPOT.2015", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2015", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Spot_2016": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4104, + -61.85 + ], + [ + 51.1123, + 55.8562 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.SPOT.2016", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2016", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Spot_2017": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4104, + -61.8534 + ], + [ + 51.1123, + 55.8562 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.SPOT.2017", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2017", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Spot_2018": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.2593, + -5.57103 + ], + [ + 51.1123, + 10.7394 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.SPOT.2018", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2018", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Spot_2019": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.2593, + -5.57103 + ], + [ + 51.1123, + 10.7394 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.SPOT.2019", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2019", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Spot_2020": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.2593, + -5.57103 + ], + [ + 51.1123, + 10.7394 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.SPOT.2020", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2020", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Spot_2021": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.2593, + -5.57103 + ], + [ + 51.1123, + 10.7394 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.SPOT.2021", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2021", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Spot_2022": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.2593, + -5.57103 + ], + [ + 51.1123, + 10.7394 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.SPOT.2022", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2022", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Spot_2023": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.2593, + -5.57103 + ], + [ + 51.1123, + 10.7394 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.SPOT.2023", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2023", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Ortho_sat_Spot_2024": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.2581, + -5.18838 + ], + [ + 50.9429, + 9.63 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHO-SAT.SPOT.2024", + "name": "GeoportailFrance.Orthoimagery_Ortho_sat_Spot_2024", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophos_Restrictedareas": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -47.0456, + -178.309 + ], + [ + 51.3121, + 168.298 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOS.RESTRICTEDAREAS", + "name": "GeoportailFrance.Orthoimagery_Orthophos_Restrictedareas", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_1950_1965": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -67.7214 + ], + [ + 51.0945, + 55.8464 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.1950-1965", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_1950_1965", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_1965_1980": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.0, + -6.0 + ], + [ + 52.0, + 10.0 + ] + ], + "min_zoom": 3, + "max_zoom": 18, + "format": "image/png", + "style": "BDORTHOHISTORIQUE", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.1965-1980", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_1965_1980", + "TileMatrixSet": "PM_3_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_1980_1995": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.0, + -5.0 + ], + [ + 52.0, + 10.0 + ] + ], + "min_zoom": 3, + "max_zoom": 18, + "format": "image/png", + "style": "BDORTHOHISTORIQUE", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.1980-1995", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_1980_1995", + "TileMatrixSet": "PM_3_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Bdortho": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -80.0, + -180.0 + ], + [ + 80.0, + 180.0 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.BDORTHO", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Bdortho", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Coast2000": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.301, + -5.21565 + ], + [ + 51.1233, + 2.60783 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.COAST2000", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Coast2000", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here", + "status": "broken" + }, + "Orthoimagery_Orthophotos_Geneve": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 46.1241, + 5.95007 + ], + [ + 46.3658, + 6.31198 + ] + ], + "min_zoom": 6, + "max_zoom": 20, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.GENEVE", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Geneve", + "TileMatrixSet": "PM_6_20", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Ilesdunord": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 17.8626, + -63.1986 + ], + [ + 18.1701, + -62.7828 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.ILESDUNORD", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ilesdunord", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -80.0, + -180.0 + ], + [ + 80.0, + 180.0 + ] + ], + "min_zoom": 6, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc", + "TileMatrixSet": "PM_6_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_express_2018": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC-EXPRESS.2018", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_express_2018", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_express_2019": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC-EXPRESS.2019", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_express_2019", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_express_2020": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 6, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC-EXPRESS.2020", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_express_2020", + "TileMatrixSet": "PM_6_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_express_2021": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC-EXPRESS.2021", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_express_2021", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_express_2023": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC-EXPRESS.2023", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_express_2023", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_express_2024": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC-EXPRESS.2024", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_express_2024", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_2012": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -80.0, + -180.0 + ], + [ + 80.0, + 180.0 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC.2012", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2012", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_2013": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -80.0, + -180.0 + ], + [ + 80.0, + 180.0 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC.2013", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2013", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_2014": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -80.0, + -180.0 + ], + [ + 80.0, + 180.0 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC.2014", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2014", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_2015": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 42.3163, + -5.20863 + ], + [ + 51.0945, + 8.25674 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC.2015", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2015", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_2016": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -80.0, + -180.0 + ], + [ + 80.0, + 180.0 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC.2016", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2016", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_2017": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -80.0, + -180.0 + ], + [ + 80.0, + 180.0 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC.2017", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2017", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_2018": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 2.10403, + -63.1702 + ], + [ + 51.1124, + 8.25765 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC.2018", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2018", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_2019": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3125, + -3.74871 + ], + [ + 50.1928, + 9.66314 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC.2019", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2019", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_2020": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 42.9454, + -2.68142 + ], + [ + 49.4512, + 7.74363 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC.2020", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2020", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_2021": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.0 + ], + [ + 75.0, + 179.0 + ] + ], + "min_zoom": 6, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC.2021", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2021", + "TileMatrixSet": "PM_6_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_2022": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -80.0, + -180.0 + ], + [ + 80.0, + 180.0 + ] + ], + "min_zoom": 6, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC.2022", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2022", + "TileMatrixSet": "PM_6_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Irc_2023": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.0 + ], + [ + 75.0, + 179.0 + ] + ], + "min_zoom": 6, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.IRC.2023", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Irc_2023", + "TileMatrixSet": "PM_6_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Low_res_Crs84": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -86.0, + -180.0 + ], + [ + 84.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 12, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.LOW_RES.CRS84", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Low_res_Crs84", + "TileMatrixSet": "WGS84G_PO_0_12", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Ncl": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.NCL", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ncl", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Ortho_asp_pac2020": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-ASP_PAC2020", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_asp_pac2020", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Ortho_asp_pac2021": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-ASP_PAC2021", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_asp_pac2021", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Ortho_asp_pac2022": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-ASP_PAC2022", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_asp_pac2022", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Ortho_asp_pac2024": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 3.73601, + -54.4984 + ], + [ + 50.1839, + 7.72339 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-ASP_PAC2024", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_asp_pac2024", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Ortho_asp_pac2025": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-ASP_PAC2025", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_asp_pac2025", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Ortho_express_2017": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-EXPRESS.2017", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_express_2017", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Ortho_express_2018": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-EXPRESS.2018", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_express_2018", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Ortho_express_2019": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-EXPRESS.2019", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_express_2019", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Ortho_express_2020": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-EXPRESS.2020", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_express_2020", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Ortho_express_2021": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 20, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-EXPRESS.2021", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_express_2021", + "TileMatrixSet": "PM_0_20", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Ortho_express_2023": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-EXPRESS.2023", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_express_2023", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Ortho_express_2024": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.ORTHO-EXPRESS.2024", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Ortho_express_2024", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Pre_Irma": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 17.8626, + -63.1986 + ], + [ + 18.1701, + -62.7828 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.PRE.IRMA", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Pre_Irma", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Rapideye": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.0227, + -5.80725 + ], + [ + 51.1752, + 10.961 + ] + ], + "min_zoom": 0, + "max_zoom": 15, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.RAPIDEYE", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Rapideye", + "TileMatrixSet": "PM_0_15", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Socle_asp_2018": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.5 + ], + [ + 75.0, + 179.5 + ] + ], + "min_zoom": 0, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.SOCLE-ASP.2018", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Socle_asp_2018", + "TileMatrixSet": "PM_0_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Spot5": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.9023, + -2.10938 + ], + [ + 46.0732, + 5.09766 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.SPOT5", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Spot5", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos_Urgence_Alex": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.8095, + 7.07917 + ], + [ + 44.1903, + 7.64199 + ] + ], + "min_zoom": 6, + "max_zoom": 20, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS.URGENCE.ALEX", + "name": "GeoportailFrance.Orthoimagery_Orthophotos_Urgence_Alex", + "TileMatrixSet": "PM_6_20", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2000": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 14.372, + -61.2472 + ], + [ + 49.0193, + 7.13497 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2000", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2000", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2000_2005": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.091, + 55.8561 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2000-2005", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2000_2005", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2001": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 4.47153, + -61.2472 + ], + [ + 50.3765, + 7.23234 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2001", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2001", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2002": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 4.49867, + -61.2472 + ], + [ + 50.3765, + 9.68861 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2002", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2002", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2003": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -61.2472 + ], + [ + 50.3765, + 55.8561 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2003", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2003", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2004": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.091, + 55.8561 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2004", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2004", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2005": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.091, + 55.8561 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2005", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2005", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2006": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.091, + 55.8561 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2006", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2006", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2006_2010": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.091, + 55.8561 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2006-2010", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2006_2010", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2007": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.091, + 55.8561 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2007", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2007", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2008": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.091, + 55.8561 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2008", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2008", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2009": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.091, + 55.8561 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2009", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2009", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2010": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.091, + 55.8561 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2010", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2010", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2011": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.091, + 55.8561 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2011", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2011", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2011_2015": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.0945, + 55.8561 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2011-2015", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2011_2015", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2012": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.091, + 55.8561 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2012", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2012", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2013": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.091, + 55.8561 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2013", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2013", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2014": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.0945, + 55.8561 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2014", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2014", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2015": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.0945, + 55.8561 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2015", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2015", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2016": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -178.187 + ], + [ + 51.0945, + 55.8561 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2016", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2016", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2017": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4013, + -63.1607 + ], + [ + 50.3856, + 55.8464 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2017", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2017", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2018": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -89.0, + -180.0 + ], + [ + 89.0, + 180.0 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2018", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2018", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2019": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3125, + -3.74871 + ], + [ + 50.1928, + 9.66314 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2019", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2019", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2020": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 42.9454, + -2.68142 + ], + [ + 49.4512, + 7.74363 + ] + ], + "min_zoom": 6, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2020", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2020", + "TileMatrixSet": "PM_6_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2021": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.0 + ], + [ + 75.0, + 179.0 + ] + ], + "min_zoom": 6, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2021", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2021", + "TileMatrixSet": "PM_6_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2022": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.0 + ], + [ + 75.0, + 179.0 + ] + ], + "min_zoom": 6, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2022", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2022", + "TileMatrixSet": "PM_6_19", + "apikey": "your_api_key_here" + }, + "Orthoimagery_Orthophotos2023": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -75.0, + -179.0 + ], + [ + 75.0, + 179.0 + ] + ], + "min_zoom": 6, + "max_zoom": 19, + "format": "image/jpeg", + "style": "normal", + "variant": "ORTHOIMAGERY.ORTHOPHOTOS2023", + "name": "GeoportailFrance.Orthoimagery_Orthophotos2023", + "TileMatrixSet": "PM_6_19", + "apikey": "your_api_key_here" + }, + "Parking_Sup_500": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "PARKING.SUP.500", + "variant": "PARKING.SUP.500", + "name": "GeoportailFrance.Parking_Sup_500", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Part_Enr_Commune": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "PART.ENR.COMMUNE", + "variant": "PART.ENR.COMMUNE", + "name": "GeoportailFrance.Part_Enr_Commune", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Pcrs_Lamb93": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.0, + -5.0 + ], + [ + 52.0, + 10.0 + ] + ], + "min_zoom": 6, + "max_zoom": 22, + "format": "image/jpeg", + "style": "normal", + "variant": "PCRS.LAMB93", + "name": "GeoportailFrance.Pcrs_Lamb93", + "TileMatrixSet": "2154_5cm_6_22", + "apikey": "your_api_key_here", + "status": "broken" + }, + "Pcrs_chantier_d046_crige": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.436, + 1.44147 + ], + [ + 44.4632, + 1.45428 + ] + ], + "min_zoom": 6, + "max_zoom": 22, + "format": "image/jpeg", + "style": "normal", + "variant": "PCRS_chantier_D046_CRIGE", + "name": "GeoportailFrance.Pcrs_chantier_d046_crige", + "TileMatrixSet": "2154_5cm_6_22", + "apikey": "your_api_key_here" + }, + "Pcrs_chantier_d46_test_sde22": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.4357, + 1.41634 + ], + [ + 44.4632, + 1.45428 + ] + ], + "min_zoom": 6, + "max_zoom": 22, + "format": "image/jpeg", + "style": "normal", + "variant": "PCRS_chantier_D46_test_SDE22", + "name": "GeoportailFrance.Pcrs_chantier_d46_test_sde22", + "TileMatrixSet": "2154_5cm_6_22", + "apikey": "your_api_key_here" + }, + "Plan_ign_074_gris_n15": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.4544, + 5.47119 + ], + [ + 46.5192, + 7.56134 + ] + ], + "min_zoom": 0, + "max_zoom": 15, + "format": "image/png", + "style": "normal", + "variant": "PLAN_IGN_074_GRIS_N15", + "name": "GeoportailFrance.Plan_ign_074_gris_n15", + "TileMatrixSet": "PM_0_15", + "apikey": "your_api_key_here" + }, + "Plan_ign_074_n10_gris": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 45.4544, + 5.47119 + ], + [ + 46.5192, + 7.56134 + ] + ], + "min_zoom": 0, + "max_zoom": 10, + "format": "image/png", + "style": "normal", + "variant": "PLAN_IGN_074_N10_GRIS", + "name": "GeoportailFrance.Plan_ign_074_n10_gris", + "TileMatrixSet": "PM_0_10", + "apikey": "your_api_key_here" + }, + "Points_Injection_Biomethane": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "POINTS.INJECTION.BIOMETHANE", + "variant": "POINTS.INJECTION.BIOMETHANE", + "name": "GeoportailFrance.Points_Injection_Biomethane", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Potentiel_Eolien_Reglementaire": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "POTENTIEL.EOLIEN.REGLE", + "variant": "POTENTIEL.EOLIEN.REGLEMENTAIRE", + "name": "GeoportailFrance.Potentiel_Eolien_Reglementaire", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Potentiel_Geothermie": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "POTENTIEL.GEOTHERMIE", + "variant": "POTENTIEL.GEOTHERMIE", + "name": "GeoportailFrance.Potentiel_Geothermie", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Potentiel_Hydro": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "POTENTIEL.HYDRO", + "variant": "POTENTIEL.HYDRO", + "name": "GeoportailFrance.Potentiel_Hydro", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Potentiel_Reseau_Chaleur_Paca": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "POTENTIEL.RESEAU.CHALEUR.PACA", + "variant": "POTENTIEL.RESEAU.CHALEUR.PACA", + "name": "GeoportailFrance.Potentiel_Reseau_Chaleur_Paca", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Potentiel_Reseau_Chaud_Froid_Paca": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "POTENTIEL.RESEAU.CHAUD.FROID.PACA", + "variant": "POTENTIEL.RESEAU.CHAUD.FROID.PACA", + "name": "GeoportailFrance.Potentiel_Reseau_Chaud_Froid_Paca", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Potentiel_Reseau_Froid_Paca": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "POTENTIEL.RESEAU.FROID.PACA", + "variant": "POTENTIEL.RESEAU.FROID.PACA", + "name": "GeoportailFrance.Potentiel_Reseau_Froid_Paca", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Potentiel_Solaire_Batiment": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "POTENTIEL.SOLAIRE.BATIMENT", + "variant": "POTENTIEL.SOLAIRE.BATIMENT", + "name": "GeoportailFrance.Potentiel_Solaire_Batiment", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Potentiel_Solaire_Friche": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "POTENTIEL.SOLAIRE.FRICHE", + "variant": "POTENTIEL.SOLAIRE.FRICHE", + "name": "GeoportailFrance.Potentiel_Solaire_Friche", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Potentiel_Solaire_Parking500": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "POTENTIEL.SOLAIRE.PARKING500", + "variant": "POTENTIEL.SOLAIRE.PARKING500", + "name": "GeoportailFrance.Potentiel_Solaire_Parking500", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Potentiel_Solaire_Rrn": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "POTENTIEL.SOLAIRE.RRN", + "variant": "POTENTIEL.SOLAIRE.RRN", + "name": "GeoportailFrance.Potentiel_Solaire_Rrn", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Potentiel_Solaire_Sol": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "POTENTIEL.SOLAIRE.SOL", + "variant": "POTENTIEL.SOLAIRE.SOL", + "name": "GeoportailFrance.Potentiel_Solaire_Sol", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Prairies_Sensibles_Bcae": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "PRAIRIES.SENSIBLES.BCAE", + "name": "GeoportailFrance.Prairies_Sensibles_Bcae", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Prod_Installation_Eolien": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "PROD.INSTALLATION.EOLIEN", + "variant": "PROD.INSTALLATION.EOLIEN", + "name": "GeoportailFrance.Prod_Installation_Eolien", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Prod_Installation_Hydro": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "PROD.INSTALLATION.HYDRO", + "variant": "PROD.INSTALLATION.HYDRO", + "name": "GeoportailFrance.Prod_Installation_Hydro", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Prod_Installation_Pv": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "PROD.INSTALLATION.PV", + "variant": "PROD.INSTALLATION.PV", + "name": "GeoportailFrance.Prod_Installation_Pv", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Productible_Biomethane_Commune": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "PRODUCTIBLE.BIOMETHANE.COMMUNE", + "variant": "PRODUCTIBLE.BIOMETHANE.COMMUNE", + "name": "GeoportailFrance.Productible_Biomethane_Commune", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Productible_Eolien_Commune": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "PRODUCTIBLE.EOLIEN.COMMUNE", + "variant": "PRODUCTIBLE.EOLIEN.COMMUNE", + "name": "GeoportailFrance.Productible_Eolien_Commune", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Productible_Methanisation_Commune": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "PRODUCTIBLE.METHANISATION.COMMUNE", + "variant": "PRODUCTIBLE.METHANISATION.COMMUNE", + "name": "GeoportailFrance.Productible_Methanisation_Commune", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Productible_Photovoltaique_Commune": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "PRODUCTIBLE.PHOTOVOLTAIQUE.COMMUNE", + "variant": "PRODUCTIBLE.PHOTOVOLTAIQUE.COMMUNE", + "name": "GeoportailFrance.Productible_Photovoltaique_Commune", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Protectedareas_Apb": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PROTECTEDAREAS.APB", + "variant": "PROTECTEDAREAS.APB", + "name": "GeoportailFrance.Protectedareas_Apb", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Apg": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "PROTECTEDAREAS.APG", + "name": "GeoportailFrance.Protectedareas_Apg", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Aphn": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -53.6279, + -63.3725 + ], + [ + 51.3121, + 82.645 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "PROTECTEDAREAS.APHN", + "name": "GeoportailFrance.Protectedareas_Aphn", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Aplg": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -53.6279, + -63.3725 + ], + [ + 51.3121, + 82.645 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "nolegend", + "variant": "PROTECTEDAREAS.APLG", + "name": "GeoportailFrance.Protectedareas_Aplg", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Bios": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PROTECTEDAREAS.BIOS", + "variant": "PROTECTEDAREAS.BIOS", + "name": "GeoportailFrance.Protectedareas_Bios", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Gp": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "PROTECTEDAREAS.GP", + "name": "GeoportailFrance.Protectedareas_Gp", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Inpg": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -53.6279, + -63.3725 + ], + [ + 51.3121, + 82.645 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "PROTECTEDAREAS.INPG", + "name": "GeoportailFrance.Protectedareas_Inpg", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Mnhn_Cdl_Parcels": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PROTECTEDAREAS.MNHN.CDL.PARCELS", + "variant": "PROTECTEDAREAS.MNHN.CDL.PARCELS", + "name": "GeoportailFrance.Protectedareas_Mnhn_Cdl_Parcels", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Mnhn_Cdl_Perimeter": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3955, + -63.1538 + ], + [ + 51.097, + 55.8522 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "PROTECTEDAREAS.MNHN.CDL.PERIMETER", + "name": "GeoportailFrance.Protectedareas_Mnhn_Cdl_Perimeter", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Mnhn_Conservatoires": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "PROTECTEDAREAS.MNHN.CONSERVATOIRES", + "name": "GeoportailFrance.Protectedareas_Mnhn_Conservatoires", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Mnhn_Rn_Perimeter": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -53.6279, + -63.3725 + ], + [ + 51.3121, + 82.645 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "PROTECTEDAREAS.MNHN.RN.PERIMETER", + "name": "GeoportailFrance.Protectedareas_Mnhn_Rn_Perimeter", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Pn": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PROTECTEDAREAS.PN", + "variant": "PROTECTEDAREAS.PN", + "name": "GeoportailFrance.Protectedareas_Pn", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Pnm": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "PROTECTEDAREAS.PNM", + "name": "GeoportailFrance.Protectedareas_Pnm", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Pnr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PROTECTEDAREAS.PNR", + "variant": "PROTECTEDAREAS.PNR", + "name": "GeoportailFrance.Protectedareas_Pnr", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Prsf": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 17, + "format": "image/png", + "style": "POINT RENCONTRE SECOURS FORET", + "variant": "PROTECTEDAREAS.PRSF", + "name": "GeoportailFrance.Protectedareas_Prsf", + "TileMatrixSet": "PM_6_17", + "apikey": "your_api_key_here" + }, + "Protectedareas_Ramsar": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PROTECTEDAREAS.RAMSAR", + "variant": "PROTECTEDAREAS.RAMSAR", + "name": "GeoportailFrance.Protectedareas_Ramsar", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Rb": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "PROTECTEDAREAS.RB", + "name": "GeoportailFrance.Protectedareas_Rb", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Ripn": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "PROTECTEDAREAS.RIPN", + "name": "GeoportailFrance.Protectedareas_Ripn", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Rn": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -53.6279, + -63.3725 + ], + [ + 51.3121, + 82.645 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PROTECTEDAREAS.RN", + "variant": "PROTECTEDAREAS.RN", + "name": "GeoportailFrance.Protectedareas_Rn", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Rnc": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PROTECTEDAREAS.RNC", + "variant": "PROTECTEDAREAS.RNC", + "name": "GeoportailFrance.Protectedareas_Rnc", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Rncf": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "PROTECTEDAREAS.RNCF", + "name": "GeoportailFrance.Protectedareas_Rncf", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Sic": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PROTECTEDAREAS.SIC", + "variant": "PROTECTEDAREAS.SIC", + "name": "GeoportailFrance.Protectedareas_Sic", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Unesco": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "PROTECTEDAREAS.UNESCO", + "name": "GeoportailFrance.Protectedareas_Unesco", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Znieff1": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PROTECTEDAREAS.ZNIEFF1", + "variant": "PROTECTEDAREAS.ZNIEFF1", + "name": "GeoportailFrance.Protectedareas_Znieff1", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Znieff1_Sea": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "PROTECTEDAREAS.ZNIEFF1.SEA", + "name": "GeoportailFrance.Protectedareas_Znieff1_Sea", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Znieff2": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PROTECTEDAREAS.ZNIEFF2", + "variant": "PROTECTEDAREAS.ZNIEFF2", + "name": "GeoportailFrance.Protectedareas_Znieff2", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Znieff2_Sea": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "PROTECTEDAREAS.ZNIEFF2.SEA", + "name": "GeoportailFrance.Protectedareas_Znieff2_Sea", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Zpr": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -53.6279, + -63.3725 + ], + [ + 51.3121, + 82.645 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PROTECTEDAREAS.BIOS", + "variant": "PROTECTEDAREAS.ZPR", + "name": "GeoportailFrance.Protectedareas_Zpr", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedareas_Zps": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PROTECTEDAREAS.ZPS", + "variant": "PROTECTEDAREAS.ZPS", + "name": "GeoportailFrance.Protectedareas_Zps", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Protectedsites_Mnhn_Reserves_regionales": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "PROTECTEDSITES.MNHN.RESERVES-REGIONALES", + "variant": "PROTECTEDSITES.MNHN.RESERVES-REGIONALES", + "name": "GeoportailFrance.Protectedsites_Mnhn_Reserves_regionales", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Puissance_Installee_Biomethane": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "PUISSANCE.INSTALLEE.METHANISATION.BIOMETHANE", + "variant": "PUISSANCE.INSTALLEE.BIOMETHANE", + "name": "GeoportailFrance.Puissance_Installee_Biomethane", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Puissance_Installee_Methanisation": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "PUISSANCE.INSTALLEE.METHANISATION.BIOMETHANE", + "variant": "PUISSANCE.INSTALLEE.METHANISATION", + "name": "GeoportailFrance.Puissance_Installee_Methanisation", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Pva_ign_zone-marais-de-virvee_1945": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.9109, + -0.473697 + ], + [ + 44.9958, + -0.353311 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/png", + "style": "BDORTHOHISTORIQUE", + "variant": "PVA_IGN_zone-marais-de-Virvee_1945", + "name": "GeoportailFrance.Pva_ign_zone-marais-de-virvee_1945", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Pva_ign_zone-marais-de-virvee_1956": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.943, + -0.459808 + ], + [ + 44.9831, + -0.400713 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/png", + "style": "BDORTHOHISTORIQUE", + "variant": "PVA_IGN_zone-marais-de-Virvee_1956", + "name": "GeoportailFrance.Pva_ign_zone-marais-de-virvee_1956", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Pva_ign_zone-marais-de-virvee_1976": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.9412, + -0.462614 + ], + [ + 44.9695, + -0.421769 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "PVA_IGN_zone-marais-de-Virvee_1976", + "name": "GeoportailFrance.Pva_ign_zone-marais-de-virvee_1976", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Pva_ign_zone-marais-de-virvee_1984": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.9204, + -0.479737 + ], + [ + 44.9712, + -0.403842 + ] + ], + "min_zoom": 0, + "max_zoom": 17, + "format": "image/png", + "style": "normal", + "variant": "PVA_IGN_zone-marais-de-Virvee_1984", + "name": "GeoportailFrance.Pva_ign_zone-marais-de-virvee_1984", + "TileMatrixSet": "PM_0_17", + "apikey": "your_api_key_here" + }, + "Patinat_apb": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3781, + -109.438 + ], + [ + 50.9841, + 55.6872 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "Patinat_APB", + "name": "GeoportailFrance.Patinat_apb", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Patinat_pn": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3863, + -62.018 + ], + [ + 48.1066, + 55.8367 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "Patinat_PN", + "name": "GeoportailFrance.Patinat_pn", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Patinat_rb": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3768, + -61.5181 + ], + [ + 50.7622, + 55.8053 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "Patinat_RB", + "name": "GeoportailFrance.Patinat_rb", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Patinat_rnn": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -53.2258, + -63.0583 + ], + [ + 51.0775, + 81.811 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "Patinat_RNN", + "name": "GeoportailFrance.Patinat_rnn", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Rapideye_pyr-jpeg_wld_wm_2010": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.2014, + -5.80725 + ], + [ + 50.9218, + 10.961 + ] + ], + "min_zoom": 0, + "max_zoom": 15, + "format": "image/jpeg", + "style": "normal", + "variant": "RAPIDEYE_PYR-JPEG_WLD_WM_2010", + "name": "GeoportailFrance.Rapideye_pyr-jpeg_wld_wm_2010", + "TileMatrixSet": "PM_0_15", + "apikey": "your_api_key_here" + }, + "Rapideye_pyr-jpeg_wld_wm_2011": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.0227, + -5.80725 + ], + [ + 51.1752, + 10.961 + ] + ], + "min_zoom": 0, + "max_zoom": 15, + "format": "image/jpeg", + "style": "normal", + "variant": "RAPIDEYE_PYR-JPEG_WLD_WM_2011", + "name": "GeoportailFrance.Rapideye_pyr-jpeg_wld_wm_2011", + "TileMatrixSet": "PM_0_15", + "apikey": "your_api_key_here" + }, + "Repartition_Potentiel_Methanisation_2050": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "REPARTITION.POTENTIEL.METHANISATION.2050", + "variant": "REPARTITION.POTENTIEL.METHANISATION.2050", + "name": "GeoportailFrance.Repartition_Potentiel_Methanisation_2050", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Rpg2012_pyr-png_wld_edugeo_20170126": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "RPG2012_PYR-PNG_WLD_EDUGEO_20170126", + "name": "GeoportailFrance.Rpg2012_pyr-png_wld_edugeo_20170126", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Scan-edugeo_pyr-png_fxx_wm": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 49.2805, + -0.125103 + ], + [ + 49.6868, + 0.625515 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "SCAN-EDUGEO_PYR-PNG_FXX_WM", + "name": "GeoportailFrance.Scan-edugeo_pyr-png_fxx_wm", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Scan1000_pyr-jpeg_wld_wm_wmts_3d": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.2891, + -6.42088 + ], + [ + 51.444, + 13.55 + ] + ], + "min_zoom": 0, + "max_zoom": 10, + "format": "image/jpeg", + "style": "normal", + "variant": "SCAN1000_PYR-JPEG_WLD_WM_WMTS_3D", + "name": "GeoportailFrance.Scan1000_pyr-jpeg_wld_wm_wmts_3d", + "TileMatrixSet": "PM_0_10", + "apikey": "your_api_key_here" + }, + "Securoute_Te_1te": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 7, + "max_zoom": 17, + "format": "image/png", + "style": "RESEAU ROUTIER 1TE", + "variant": "SECUROUTE.TE.1TE", + "name": "GeoportailFrance.Securoute_Te_1te", + "TileMatrixSet": "PM_7_17", + "apikey": "your_api_key_here" + }, + "Securoute_Te_2te48": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 7, + "max_zoom": 17, + "format": "image/png", + "style": "RESEAU ROUTIER 2TE48", + "variant": "SECUROUTE.TE.2TE48", + "name": "GeoportailFrance.Securoute_Te_2te48", + "TileMatrixSet": "PM_7_17", + "apikey": "your_api_key_here" + }, + "Securoute_Te_All": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 7, + "max_zoom": 17, + "format": "image/png", + "style": "TOUS LES FRANCHISSEMENTS", + "variant": "SECUROUTE.TE.ALL", + "name": "GeoportailFrance.Securoute_Te_All", + "TileMatrixSet": "PM_7_17", + "apikey": "your_api_key_here" + }, + "Securoute_Te_Oa": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 7, + "max_zoom": 17, + "format": "image/png", + "style": "AUTRES FRANCHISSEMENTS", + "variant": "SECUROUTE.TE.OA", + "name": "GeoportailFrance.Securoute_Te_Oa", + "TileMatrixSet": "PM_7_17", + "apikey": "your_api_key_here" + }, + "Securoute_Te_Pn": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 7, + "max_zoom": 17, + "format": "image/png", + "style": "FRANCHISSEMENTS PASSAGE A NIVEAU", + "variant": "SECUROUTE.TE.PN", + "name": "GeoportailFrance.Securoute_Te_Pn", + "TileMatrixSet": "PM_7_17", + "apikey": "your_api_key_here" + }, + "Securoute_Te_Pnd": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 7, + "max_zoom": 17, + "format": "image/png", + "style": "FRANCHISSEMENTS PASSAGE A NIVEAU DIFFICILE", + "variant": "SECUROUTE.TE.PND", + "name": "GeoportailFrance.Securoute_Te_Pnd", + "TileMatrixSet": "PM_7_17", + "apikey": "your_api_key_here" + }, + "Securoute_Te_Te120": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 7, + "max_zoom": 17, + "format": "image/png", + "style": "RESEAU ROUTIER TE120", + "variant": "SECUROUTE.TE.TE120", + "name": "GeoportailFrance.Securoute_Te_Te120", + "TileMatrixSet": "PM_7_17", + "apikey": "your_api_key_here" + }, + "Securoute_Te_Te72": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 7, + "max_zoom": 17, + "format": "image/png", + "style": "RESEAU ROUTIER TE94", + "variant": "SECUROUTE.TE.TE72", + "name": "GeoportailFrance.Securoute_Te_Te72", + "TileMatrixSet": "PM_7_17", + "apikey": "your_api_key_here" + }, + "Securoute_Te_Te94": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 7, + "max_zoom": 17, + "format": "image/png", + "style": "RESEAU ROUTIER TE94", + "variant": "SECUROUTE.TE.TE94", + "name": "GeoportailFrance.Securoute_Te_Te94", + "TileMatrixSet": "PM_7_17", + "apikey": "your_api_key_here" + }, + "Site_Production_Chaleur_Biogaz": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "SITE.PRODUCTION.CHALEUR.BIOGAZ", + "variant": "SITE.PRODUCTION.CHALEUR.BIOGAZ", + "name": "GeoportailFrance.Site_Production_Chaleur_Biogaz", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Site_Production_Chaleur_Cogeneration": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "SITE.PRODUCTION.CHALEUR.COGENERATION", + "variant": "SITE.PRODUCTION.CHALEUR.COGENERATION", + "name": "GeoportailFrance.Site_Production_Chaleur_Cogeneration", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Site_Production_Chaleur_Dechets": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "SITE.PRODUCTION.CHALEUR.DECHETS", + "variant": "SITE.PRODUCTION.CHALEUR.DECHETS", + "name": "GeoportailFrance.Site_Production_Chaleur_Dechets", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Site_Production_Chaleur_Methanisaton": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "SITE.PRODUCTION.CHALEUR.METHANISATON", + "variant": "SITE.PRODUCTION.CHALEUR.METHANISATON", + "name": "GeoportailFrance.Site_Production_Chaleur_Methanisaton", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Site_Production_Chaleur_Rc": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "SITE.PRODUCTION.CHALEUR.RC", + "variant": "SITE.PRODUCTION.CHALEUR.RC", + "name": "GeoportailFrance.Site_Production_Chaleur_Rc", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Site_Production_Chaleur_Rc_Bretagne": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.2719, + -5.15012 + ], + [ + 48.9064, + -1.00687 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "SITE.PRODUCTION.CHALEUR.RC.BRETAGNE", + "variant": "SITE.PRODUCTION.CHALEUR.RC.BRETAGNE", + "name": "GeoportailFrance.Site_Production_Chaleur_Rc_Bretagne", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Site_Production_Chaleur_Rc_Paca": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 42.9758, + 4.22277 + ], + [ + 45.1331, + 7.72777 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "SITE.PRODUCTION.CHALEUR.RC.PACA", + "variant": "SITE.PRODUCTION.CHALEUR.RC.PACA", + "name": "GeoportailFrance.Site_Production_Chaleur_Rc_Paca", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Site_Production_Chaleur_Rcf_Lineaire": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "SITE.PRODUCTION.CHALEUR.RCF.LINEAIRE", + "variant": "SITE.PRODUCTION.CHALEUR.RCF.LINEAIRE", + "name": "GeoportailFrance.Site_Production_Chaleur_Rcf_Lineaire", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Site_Production_Chaleur_Rcf_Point": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.3252, + -5.15047 + ], + [ + 51.0991, + 9.57054 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "SITE.PRODUCTION.CHALEUR.RCF.POINT", + "variant": "SITE.PRODUCTION.CHALEUR.RCF.POINT", + "name": "GeoportailFrance.Site_Production_Chaleur_Rcf_Point", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Spot-edugeo_pyr-png_wld_wm": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.6754, + -1.12593 + ], + [ + 45.5582, + 0.125103 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "SPOT-EDUGEO_PYR-PNG_WLD_WM", + "name": "GeoportailFrance.Spot-edugeo_pyr-png_wld_wm", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Spot5_pyr-jpeg_wld_wm": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.9023, + -2.10938 + ], + [ + 46.0732, + 5.09766 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "SPOT5_PYR-JPEG_WLD_WM", + "name": "GeoportailFrance.Spot5_pyr-jpeg_wld_wm", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Test_pbe_le_havre": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -89.0, + -180.0 + ], + [ + 89.0, + 180.0 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "TEST_PBE_LE_HAVRE", + "name": "GeoportailFrance.Test_pbe_le_havre", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Thr_Orthoimagery_Orthophotos": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.1533, + 0.0354912 + ], + [ + 49.6969, + 6.02353 + ] + ], + "min_zoom": 6, + "max_zoom": 21, + "format": "image/jpeg", + "style": "normal", + "variant": "THR.ORTHOIMAGERY.ORTHOPHOTOS", + "name": "GeoportailFrance.Thr_Orthoimagery_Orthophotos", + "TileMatrixSet": "PM_6_21", + "apikey": "your_api_key_here" + }, + "Tn_Roadtransportnetwork_Roadlink": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4969, + -63.9692 + ], + [ + 71.5841, + 55.9644 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "inspire_common:DEFAULT", + "variant": "TN.RoadTransportNetwork.RoadLink", + "name": "GeoportailFrance.Tn_Roadtransportnetwork_Roadlink", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Traces_Rando_Hivernale": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.1893, + 5.44835 + ], + [ + 46.4052, + 7.20036 + ] + ], + "min_zoom": 6, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "TRACES.RANDO.HIVERNALE", + "name": "GeoportailFrance.Traces_Rando_Hivernale", + "TileMatrixSet": "PM_6_16", + "apikey": "your_api_key_here" + }, + "Transportnetwork_Commontransportelements_Markerpost": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 10, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "TRANSPORTNETWORK.COMMONTRANSPORTELEMENTS.MARKERPOST", + "name": "GeoportailFrance.Transportnetwork_Commontransportelements_Markerpost", + "TileMatrixSet": "PM_10_18", + "apikey": "your_api_key_here" + }, + "Transportnetwork_Commontransportelements_Markerpost_visu": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "TRANSPORTNETWORK.COMMONTRANSPORTELEMENTS.MARKERPOST_VISU", + "name": "GeoportailFrance.Transportnetwork_Commontransportelements_Markerpost_visu", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Transportnetworks_Railways": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4969, + -63.9692 + ], + [ + 71.5841, + 55.9644 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "TRANSPORTNETWORKS.RAILWAYS", + "name": "GeoportailFrance.Transportnetworks_Railways", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Transportnetworks_Roads": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4969, + -63.9692 + ], + [ + 71.5841, + 55.9644 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "TRANSPORTNETWORKS.ROADS", + "name": "GeoportailFrance.Transportnetworks_Roads", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Transportnetworks_Roads_Direction": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 15, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "TRANSPORTNETWORKS.ROADS.DIRECTION", + "name": "GeoportailFrance.Transportnetworks_Roads_Direction", + "TileMatrixSet": "PM_15_18", + "apikey": "your_api_key_here" + }, + "Transportnetworks_Runways": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4969, + -63.9692 + ], + [ + 71.5841, + 55.9644 + ] + ], + "min_zoom": 6, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "TRANSPORTNETWORKS.RUNWAYS", + "name": "GeoportailFrance.Transportnetworks_Runways", + "TileMatrixSet": "PM_6_18", + "apikey": "your_api_key_here" + }, + "Transports_Drones_Restrictions": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 40.576, + -9.88147 + ], + [ + 51.4428, + 11.6781 + ] + ], + "min_zoom": 3, + "max_zoom": 15, + "format": "image/png", + "style": "normal", + "variant": "TRANSPORTS.DRONES.RESTRICTIONS", + "name": "GeoportailFrance.Transports_Drones_Restrictions", + "TileMatrixSet": "PM_3_15", + "apikey": "your_api_key_here" + }, + "Utilityandgovernmentalservices_All": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 71.5841, + 55.9259 + ] + ], + "min_zoom": 10, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "UTILITYANDGOVERNMENTALSERVICES.ALL", + "name": "GeoportailFrance.Utilityandgovernmentalservices_All", + "TileMatrixSet": "PM_10_18", + "apikey": "your_api_key_here" + }, + "Wmts_beziers-colombiers_2022110638503087": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.2771, + 3.08618 + ], + [ + 43.3849, + 3.23436 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "WMTS_BEZIERS-COLOMBIERS_2022110638503087", + "name": "GeoportailFrance.Wmts_beziers-colombiers_2022110638503087", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Hedge_Hedge": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.4756, + -63.3725 + ], + [ + 51.3121, + 55.9259 + ] + ], + "min_zoom": 7, + "max_zoom": 18, + "format": "image/png", + "style": "normal", + "variant": "hedge.hedge", + "name": "GeoportailFrance.Hedge_Hedge", + "TileMatrixSet": "PM_7_18", + "apikey": "your_api_key_here" + }, + "Hydro_ardennes_pyramide_raster_wmts": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 47.9409, + 1.99937 + ], + [ + 50.2587, + 5.87344 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/jpeg", + "style": "normal", + "variant": "hydro_ardennes_pyramide_raster_wmts", + "name": "GeoportailFrance.Hydro_ardennes_pyramide_raster_wmts", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + }, + "Orthophoto_1947_calvados": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.7508, + -1.16113 + ], + [ + 49.4308, + 0.447995 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "transparent", + "variant": "orthophoto_1947_calvados", + "name": "GeoportailFrance.Orthophoto_1947_calvados", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthophoto_1955_calvados": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.7517, + -1.15977 + ], + [ + 49.4299, + 0.446633 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "transparent", + "variant": "orthophoto_1955_calvados", + "name": "GeoportailFrance.Orthophoto_1955_calvados", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthophoto_1972_calvados": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.7508, + -1.16113 + ], + [ + 49.4308, + 0.447995 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "transparent", + "variant": "orthophoto_1972_calvados", + "name": "GeoportailFrance.Orthophoto_1972_calvados", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthophoto_1984_calvados": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.7508, + -1.16113 + ], + [ + 49.4308, + 0.447995 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "transparent", + "variant": "orthophoto_1984_calvados", + "name": "GeoportailFrance.Orthophoto_1984_calvados", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Orthophoto_1991_calvados": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 48.7508, + -1.16113 + ], + [ + 49.4308, + 0.447995 + ] + ], + "min_zoom": 0, + "max_zoom": 18, + "format": "image/png", + "style": "transparent", + "variant": "orthophoto_1991_calvados", + "name": "GeoportailFrance.Orthophoto_1991_calvados", + "TileMatrixSet": "PM_0_18", + "apikey": "your_api_key_here" + }, + "Pcrs_chantier_cd45_test032025_wmts": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 44.4357, + 1.41634 + ], + [ + 44.4632, + 1.45428 + ] + ], + "min_zoom": 0, + "max_zoom": 22, + "format": "image/jpeg", + "style": "normal", + "variant": "pcrs_chantier_cd45_test032025_wmts", + "name": "GeoportailFrance.Pcrs_chantier_cd45_test032025_wmts", + "TileMatrixSet": "2154_5cm_0_22", + "apikey": "your_api_key_here" + }, + "Testsrd-pcrs86-poitiers": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 46.5758, + 0.30613 + ], + [ + 46.5907, + 0.32753 + ] + ], + "min_zoom": 0, + "max_zoom": 10, + "format": "image/jpeg", + "style": "normal", + "variant": "testSRD-PCRS86-Poitiers", + "name": "GeoportailFrance.Testsrd-pcrs86-poitiers", + "TileMatrixSet": "PM_0_10", + "apikey": "your_api_key_here" + }, + "Test_mamp_echantillon_pcrs": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 43.3964, + 5.0246 + ], + [ + 43.4236, + 5.06254 + ] + ], + "min_zoom": 8, + "max_zoom": 21, + "format": "image/png", + "style": "normal", + "variant": "test_mamp_echantillon_pcrs", + "name": "GeoportailFrance.Test_mamp_echantillon_pcrs", + "TileMatrixSet": "2154_5cm_8_21", + "apikey": "your_api_key_here" + }, + "Tuto_scan1000_srd": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 41.2349, + 8.35477 + ], + [ + 43.0475, + 9.75281 + ] + ], + "min_zoom": 0, + "max_zoom": 10, + "format": "image/jpeg", + "style": "normal", + "variant": "tuto_scan1000_SRD", + "name": "GeoportailFrance.Tuto_scan1000_srd", + "TileMatrixSet": "PM_0_10", + "apikey": "your_api_key_here" + }, + "Zzz_nl_test_prevair_o3_chi_an_euro_dave_20241201_d_1": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + 29.9888, + -25.0 + ], + [ + 70.0, + 44.9977 + ] + ], + "min_zoom": 0, + "max_zoom": 6, + "format": "image/png", + "style": "normal", + "variant": "zzz_nl_test_prevair_O3_CHI_AN_EURO_DAVE_20241201_D_1", + "name": "GeoportailFrance.Zzz_nl_test_prevair_o3_chi_an_euro_dave_20241201_d_1", + "TileMatrixSet": "PM_0_6", + "apikey": "your_api_key_here" + }, + "Zzz_nl_test_reserve_biosphere": { + "url": "https://data.geopf.fr/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE={style}&TILEMATRIXSET={TileMatrixSet}&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}", + "html_attribution": "Geoportail France", + "attribution": "Geoportail France", + "bounds": [ + [ + -21.3768, + -61.5181 + ], + [ + 50.7622, + 55.8053 + ] + ], + "min_zoom": 0, + "max_zoom": 16, + "format": "image/png", + "style": "normal", + "variant": "zzz_nl_test_reserve_biosphere", + "name": "GeoportailFrance.Zzz_nl_test_reserve_biosphere", + "TileMatrixSet": "PM_0_16", + "apikey": "your_api_key_here" + } + }, + "OneMapSG": { + "Default": { + "url": "https://maps-{s}.onemap.sg/v3/{variant}/{z}/{x}/{y}.png", + "variant": "Default", + "min_zoom": 11, + "max_zoom": 18, + "bounds": [ + [ + 1.56073, + 104.11475 + ], + [ + 1.16, + 103.502 + ] + ], + "html_attribution": " New OneMap | Map data © contributors, Singapore Land Authority", + "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", + "name": "OneMapSG.Default" + }, + "Night": { + "url": "https://maps-{s}.onemap.sg/v3/{variant}/{z}/{x}/{y}.png", + "variant": "Night", + "min_zoom": 11, + "max_zoom": 18, + "bounds": [ + [ + 1.56073, + 104.11475 + ], + [ + 1.16, + 103.502 + ] + ], + "html_attribution": " New OneMap | Map data © contributors, Singapore Land Authority", + "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", + "name": "OneMapSG.Night" + }, + "Original": { + "url": "https://maps-{s}.onemap.sg/v3/{variant}/{z}/{x}/{y}.png", + "variant": "Original", + "min_zoom": 11, + "max_zoom": 18, + "bounds": [ + [ + 1.56073, + 104.11475 + ], + [ + 1.16, + 103.502 + ] + ], + "html_attribution": " New OneMap | Map data © contributors, Singapore Land Authority", + "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", + "name": "OneMapSG.Original" + }, + "Grey": { + "url": "https://maps-{s}.onemap.sg/v3/{variant}/{z}/{x}/{y}.png", + "variant": "Grey", + "min_zoom": 11, + "max_zoom": 18, + "bounds": [ + [ + 1.56073, + 104.11475 + ], + [ + 1.16, + 103.502 + ] + ], + "html_attribution": " New OneMap | Map data © contributors, Singapore Land Authority", + "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", + "name": "OneMapSG.Grey" + }, + "LandLot": { + "url": "https://maps-{s}.onemap.sg/v3/{variant}/{z}/{x}/{y}.png", + "variant": "LandLot", + "min_zoom": 11, + "max_zoom": 18, + "bounds": [ + [ + 1.56073, + 104.11475 + ], + [ + 1.16, + 103.502 + ] + ], + "html_attribution": " New OneMap | Map data © contributors, Singapore Land Authority", + "attribution": "![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority", + "name": "OneMapSG.LandLot" + } + }, + "USGS": { + "USTopo": { + "url": "https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/tile/{z}/{y}/{x}", + "max_zoom": 20, + "html_attribution": "Tiles courtesy of the U.S. Geological Survey", + "attribution": "Tiles courtesy of the U.S. Geological Survey", + "name": "USGS.USTopo" + }, + "USImagery": { + "url": "https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryOnly/MapServer/tile/{z}/{y}/{x}", + "max_zoom": 20, + "html_attribution": "Tiles courtesy of the U.S. Geological Survey", + "attribution": "Tiles courtesy of the U.S. Geological Survey", + "name": "USGS.USImagery" + }, + "USImageryTopo": { + "url": "https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryTopo/MapServer/tile/{z}/{y}/{x}", + "max_zoom": 20, + "html_attribution": "Tiles courtesy of the U.S. Geological Survey", + "attribution": "Tiles courtesy of the U.S. Geological Survey", + "name": "USGS.USImageryTopo" + } + }, + "WaymarkedTrails": { + "hiking": { + "url": "https://tile.waymarkedtrails.org/{variant}/{z}/{x}/{y}.png", + "max_zoom": 18, + "html_attribution": "Map data: © OpenStreetMap contributors | Map style: © waymarkedtrails.org (CC-BY-SA)", + "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", + "variant": "hiking", + "name": "WaymarkedTrails.hiking" + }, + "cycling": { + "url": "https://tile.waymarkedtrails.org/{variant}/{z}/{x}/{y}.png", + "max_zoom": 18, + "html_attribution": "Map data: © OpenStreetMap contributors | Map style: © waymarkedtrails.org (CC-BY-SA)", + "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", + "variant": "cycling", + "name": "WaymarkedTrails.cycling" + }, + "mtb": { + "url": "https://tile.waymarkedtrails.org/{variant}/{z}/{x}/{y}.png", + "max_zoom": 18, + "html_attribution": "Map data: © OpenStreetMap contributors | Map style: © waymarkedtrails.org (CC-BY-SA)", + "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", + "variant": "mtb", + "name": "WaymarkedTrails.mtb" + }, + "slopes": { + "url": "https://tile.waymarkedtrails.org/{variant}/{z}/{x}/{y}.png", + "max_zoom": 18, + "html_attribution": "Map data: © OpenStreetMap contributors | Map style: © waymarkedtrails.org (CC-BY-SA)", + "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", + "variant": "slopes", + "name": "WaymarkedTrails.slopes" + }, + "riding": { + "url": "https://tile.waymarkedtrails.org/{variant}/{z}/{x}/{y}.png", + "max_zoom": 18, + "html_attribution": "Map data: © OpenStreetMap contributors | Map style: © waymarkedtrails.org (CC-BY-SA)", + "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", + "variant": "riding", + "name": "WaymarkedTrails.riding" + }, + "skating": { + "url": "https://tile.waymarkedtrails.org/{variant}/{z}/{x}/{y}.png", + "max_zoom": 18, + "html_attribution": "Map data: © OpenStreetMap contributors | Map style: © waymarkedtrails.org (CC-BY-SA)", + "attribution": "Map data: (C) OpenStreetMap contributors | Map style: (C) waymarkedtrails.org (CC-BY-SA)", + "variant": "skating", + "name": "WaymarkedTrails.skating" + } + }, + "OpenAIP": { + "url": "https://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.{ext}", + "html_attribution": "openAIP Data (CC-BY-NC-SA)", + "attribution": "openAIP Data (CC-BY-NC-SA)", + "ext": "png", + "min_zoom": 4, + "max_zoom": 14, + "tms": true, + "detectRetina": true, + "subdomains": "12", + "name": "OpenAIP" + }, + "OpenSnowMap": { + "pistes": { + "url": "https://tiles.opensnowmap.org/{variant}/{z}/{x}/{y}.png", + "min_zoom": 9, + "max_zoom": 18, + "html_attribution": "Map data: © OpenStreetMap contributors & ODbL, © www.opensnowmap.org CC-BY-SA", + "attribution": "Map data: (C) OpenStreetMap contributors & ODbL, (C) www.opensnowmap.org CC-BY-SA", + "variant": "pistes", + "name": "OpenSnowMap.pistes" + } + }, + "AzureMaps": { + "MicrosoftImagery": { + "url": "https://atlas.microsoft.com/map/tile?api-version={apiVersion}&tilesetId={variant}&x={x}&y={y}&zoom={z}&language={language}&subscription-key={subscriptionKey}", + "html_attribution": "See https://docs.microsoft.com/en-us/rest/api/maps/render-v2/get-map-tile for details.", + "attribution": "See https://docs.microsoft.com/en-us/rest/api/maps/render-v2/get-map-tile for details.", + "apiVersion": "2.0", + "variant": "microsoft.imagery", + "subscriptionKey": "", + "language": "en-US", + "name": "AzureMaps.MicrosoftImagery" + }, + "MicrosoftBaseDarkGrey": { + "url": "https://atlas.microsoft.com/map/tile?api-version={apiVersion}&tilesetId={variant}&x={x}&y={y}&zoom={z}&language={language}&subscription-key={subscriptionKey}", + "html_attribution": "See https://docs.microsoft.com/en-us/rest/api/maps/render-v2/get-map-tile for details.", + "attribution": "See https://docs.microsoft.com/en-us/rest/api/maps/render-v2/get-map-tile for details.", + "apiVersion": "2.0", + "variant": "microsoft.base.darkgrey", + "subscriptionKey": "", + "language": "en-US", + "name": "AzureMaps.MicrosoftBaseDarkGrey" + }, + "MicrosoftBaseRoad": { + "url": "https://atlas.microsoft.com/map/tile?api-version={apiVersion}&tilesetId={variant}&x={x}&y={y}&zoom={z}&language={language}&subscription-key={subscriptionKey}", + "html_attribution": "See https://docs.microsoft.com/en-us/rest/api/maps/render-v2/get-map-tile for details.", + "attribution": "See https://docs.microsoft.com/en-us/rest/api/maps/render-v2/get-map-tile for details.", + "apiVersion": "2.0", + "variant": "microsoft.base.road", + "subscriptionKey": "", + "language": "en-US", + "name": "AzureMaps.MicrosoftBaseRoad" + }, + "MicrosoftBaseHybridRoad": { + "url": "https://atlas.microsoft.com/map/tile?api-version={apiVersion}&tilesetId={variant}&x={x}&y={y}&zoom={z}&language={language}&subscription-key={subscriptionKey}", + "html_attribution": "See https://docs.microsoft.com/en-us/rest/api/maps/render-v2/get-map-tile for details.", + "attribution": "See https://docs.microsoft.com/en-us/rest/api/maps/render-v2/get-map-tile for details.", + "apiVersion": "2.0", + "variant": "microsoft.base.hybrid.road", + "subscriptionKey": "", + "language": "en-US", + "name": "AzureMaps.MicrosoftBaseHybridRoad" + }, + "MicrosoftTerraMain": { + "url": "https://atlas.microsoft.com/map/tile?api-version={apiVersion}&tilesetId={variant}&x={x}&y={y}&zoom={z}&language={language}&subscription-key={subscriptionKey}", + "html_attribution": "See https://docs.microsoft.com/en-us/rest/api/maps/render-v2/get-map-tile for details.", + "attribution": "See https://docs.microsoft.com/en-us/rest/api/maps/render-v2/get-map-tile for details.", + "apiVersion": "2.0", + "variant": "microsoft.terra.main", + "subscriptionKey": "", + "language": "en-US", + "name": "AzureMaps.MicrosoftTerraMain" + }, + "MicrosoftWeatherInfraredMain": { + "url": "https://atlas.microsoft.com/map/tile?api-version={apiVersion}&tilesetId={variant}&x={x}&y={y}&zoom={z}&timeStamp={timeStamp}&language={language}&subscription-key={subscriptionKey}", + "html_attribution": "See https://docs.microsoft.com/en-us/rest/api/maps/render-v2/get-map-tile#uri-parameters for details.", + "attribution": "See https://docs.microsoft.com/en-us/rest/api/maps/render-v2/get-map-tile#uri-parameters for details.", + "apiVersion": "2.0", + "variant": "microsoft.weather.infrared.main", + "subscriptionKey": "", + "language": "en-US", + "timeStamp": "2021-05-08T09:03:00Z", + "name": "AzureMaps.MicrosoftWeatherInfraredMain" + }, + "MicrosoftWeatherRadarMain": { + "url": "https://atlas.microsoft.com/map/tile?api-version={apiVersion}&tilesetId={variant}&x={x}&y={y}&zoom={z}&timeStamp={timeStamp}&language={language}&subscription-key={subscriptionKey}", + "html_attribution": "See https://docs.microsoft.com/en-us/rest/api/maps/render-v2/get-map-tile#uri-parameters for details.", + "attribution": "See https://docs.microsoft.com/en-us/rest/api/maps/render-v2/get-map-tile#uri-parameters for details.", + "apiVersion": "2.0", + "variant": "microsoft.weather.radar.main", + "subscriptionKey": "", + "language": "en-US", + "timeStamp": "2021-05-08T09:03:00Z", + "name": "AzureMaps.MicrosoftWeatherRadarMain" + } + }, + "SwissFederalGeoportal": { + "NationalMapColor": { + "url": "https://wmts.geo.admin.ch/1.0.0/ch.swisstopo.pixelkarte-farbe/default/current/3857/{z}/{x}/{y}.jpeg", + "html_attribution": "swisstopo", + "attribution": "\u00a9 swisstopo", + "bounds": [ + [ + 45.398181, + 5.140242 + ], + [ + 48.230651, + 11.47757 + ] + ], + "min_zoom": 2, + "max_zoom": 18, + "name": "SwissFederalGeoportal.NationalMapColor" + }, + "NationalMapGrey": { + "url": "https://wmts.geo.admin.ch/1.0.0/ch.swisstopo.pixelkarte-grau/default/current/3857/{z}/{x}/{y}.jpeg", + "html_attribution": "swisstopo", + "attribution": "\u00a9 swisstopo", + "bounds": [ + [ + 45.398181, + 5.140242 + ], + [ + 48.230651, + 11.47757 + ] + ], + "min_zoom": 2, + "max_zoom": 18, + "name": "SwissFederalGeoportal.NationalMapGrey" + }, + "SWISSIMAGE": { + "url": "https://wmts.geo.admin.ch/1.0.0/ch.swisstopo.swissimage/default/current/3857/{z}/{x}/{y}.jpeg", + "html_attribution": "swisstopo", + "attribution": "\u00a9 swisstopo", + "bounds": [ + [ + 45.398181, + 5.140242 + ], + [ + 48.230651, + 11.47757 + ] + ], + "min_zoom": 2, + "max_zoom": 19, + "name": "SwissFederalGeoportal.SWISSIMAGE" + }, + "JourneyThroughTime": { + "url": "https://wmts.geo.admin.ch/1.0.0/ch.swisstopo.zeitreihen/default/{time}/3857/{z}/{x}/{y}.png", + "html_attribution": "swisstopo", + "attribution": "\u00a9 swisstopo", + "bounds": [ + [ + 45.398181, + 5.140242 + ], + [ + 48.230651, + 11.47757 + ] + ], + "min_zoom": 2, + "max_zoom": 18, + "time": 18641231, + "name": "SwissFederalGeoportal.JourneyThroughTime" + } + }, + "TopPlusOpen": { + "Color": { + "url": "http://sgx.geodatenzentrum.de/wmts_topplus_open/tile/1.0.0/{variant}/default/WEBMERCATOR/{z}/{y}/{x}.png", + "max_zoom": 18, + "html_attribution": "Map data: © dl-de/by-2-0", + "attribution": "Map data: (C) dl-de/by-2-0", + "variant": "web", + "name": "TopPlusOpen.Color" + }, + "Grey": { + "url": "http://sgx.geodatenzentrum.de/wmts_topplus_open/tile/1.0.0/{variant}/default/WEBMERCATOR/{z}/{y}/{x}.png", + "max_zoom": 18, + "html_attribution": "Map data: © dl-de/by-2-0", + "attribution": "Map data: (C) dl-de/by-2-0", + "variant": "web_grau", + "name": "TopPlusOpen.Grey" + } + }, + "Gaode": { + "Normal": { + "url": "http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}", + "max_zoom": 19, + "attribution": "© Gaode.com", + "html_attribution": "© Gaode.com", + "name": "Gaode.Normal" + }, + "Satellite": { + "url": "http://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}", + "max_zoom": 19, + "attribution": "© Gaode.com", + "html_attribution": "© Gaode.com", + "name": "Gaode.Satellite" + } + }, + "Strava": { + "All": { + "url": "https://heatmap-external-a.strava.com/tiles/all/hot/{z}/{x}/{y}.png", + "max_zoom": 15, + "attribution": "Map tiles by Strava 2021", + "html_attribution": "Map tiles by Strava 2021", + "name": "Strava.All" + }, + "Ride": { + "url": "https://heatmap-external-a.strava.com/tiles/ride/hot/{z}/{x}/{y}.png", + "max_zoom": 15, + "attribution": "Map tiles by Strava 2021", + "html_attribution": "Map tiles by Strava 2021", + "name": "Strava.Ride" + }, + "Run": { + "url": "https://heatmap-external-a.strava.com/tiles/run/bluered/{z}/{x}/{y}.png", + "max_zoom": 15, + "attribution": "Map tiles by Strava 2021", + "html_attribution": "Map tiles by Strava 2021", + "name": "Strava.Run" + }, + "Water": { + "url": "https://heatmap-external-a.strava.com/tiles/water/blue/{z}/{x}/{y}.png", + "max_zoom": 15, + "attribution": "Map tiles by Strava 2021", + "html_attribution": "Map tiles by Strava 2021", + "name": "Strava.Water" + }, + "Winter": { + "url": "https://heatmap-external-a.strava.com/tiles/winter/hot/{z}/{x}/{y}.png", + "max_zoom": 15, + "attribution": "Map tiles by Strava 2021", + "html_attribution": "Map tiles by Strava 2021", + "name": "Strava.Winter" + } + }, + "OrdnanceSurvey": { + "Road": { + "url": "https://api.os.uk/maps/raster/v1/zxy/Road_3857/{z}/{x}/{y}.png?key={key}", + "html_attribution": "Contains OS data © Crown copyright and database right 2025", + "attribution": "Contains OS data (C) Crown copyright and database right 2025", + "key": "", + "min_zoom": 7, + "max_zoom": 16, + "max_zoom_premium": 20, + "bounds": [ + [ + 49.766807, + -9.496386 + ], + [ + 61.465189, + 3.634745 + ] + ], + "name": "OrdnanceSurvey.Road" + }, + "Road_27700": { + "url": "https://api.os.uk/maps/raster/v1/zxy/Road_27700/{z}/{x}/{y}.png?key={key}", + "html_attribution": "Contains OS data © Crown copyright and database right 2025", + "attribution": "Contains OS data (C) Crown copyright and database right 2025", + "key": "", + "crs": "EPSG:27700", + "min_zoom": 0, + "max_zoom": 9, + "max_zoom_premium": 13, + "bounds": [ + [ + 0, + 0 + ], + [ + 700000, + 1300000 + ] + ], + "name": "OrdnanceSurvey.Road_27700" + }, + "Outdoor": { + "url": "https://api.os.uk/maps/raster/v1/zxy/Outdoor_3857/{z}/{x}/{y}.png?key={key}", + "html_attribution": "Contains OS data © Crown copyright and database right 2025", + "attribution": "Contains OS data (C) Crown copyright and database right 2025", + "key": "", + "min_zoom": 7, + "max_zoom": 16, + "max_zoom_premium": 20, + "bounds": [ + [ + 49.766807, + -9.496386 + ], + [ + 61.465189, + 3.634745 + ] + ], + "name": "OrdnanceSurvey.Outdoor" + }, + "Outdoor_27700": { + "url": "https://api.os.uk/maps/raster/v1/zxy/Outdoor_27700/{z}/{x}/{y}.png?key={key}", + "html_attribution": "Contains OS data © Crown copyright and database right 2025", + "attribution": "Contains OS data (C) Crown copyright and database right 2025", + "key": "", + "crs": "EPSG:27700", + "min_zoom": 0, + "max_zoom": 9, + "max_zoom_premium": 13, + "bounds": [ + [ + 0, + 0 + ], + [ + 700000, + 1300000 + ] + ], + "name": "OrdnanceSurvey.Outdoor_27700" + }, + "Light": { + "url": "https://api.os.uk/maps/raster/v1/zxy/Light_3857/{z}/{x}/{y}.png?key={key}", + "html_attribution": "Contains OS data © Crown copyright and database right 2025", + "attribution": "Contains OS data (C) Crown copyright and database right 2025", + "key": "", + "min_zoom": 7, + "max_zoom": 16, + "max_zoom_premium": 20, + "bounds": [ + [ + 49.766807, + -9.496386 + ], + [ + 61.465189, + 3.634745 + ] + ], + "name": "OrdnanceSurvey.Light" + }, + "Light_27700": { + "url": "https://api.os.uk/maps/raster/v1/zxy/Light_27700/{z}/{x}/{y}.png?key={key}", + "html_attribution": "Contains OS data © Crown copyright and database right 2025", + "attribution": "Contains OS data (C) Crown copyright and database right 2025", + "key": "", + "crs": "EPSG:27700", + "min_zoom": 0, + "max_zoom": 9, + "max_zoom_premium": 13, + "bounds": [ + [ + 0, + 0 + ], + [ + 700000, + 1300000 + ] + ], + "name": "OrdnanceSurvey.Light_27700" + }, + "Leisure_27700": { + "url": "https://api.os.uk/maps/raster/v1/zxy/Leisure_27700/{z}/{x}/{y}.png?key={key}", + "html_attribution": "Contains OS data © Crown copyright and database right 2025", + "attribution": "Contains OS data (C) Crown copyright and database right 2025", + "key": "", + "crs": "EPSG:27700", + "min_zoom": 0, + "max_zoom": 5, + "max_zoom_premium": 9, + "bounds": [ + [ + 0, + 0 + ], + [ + 700000, + 1300000 + ] + ], + "name": "OrdnanceSurvey.Leisure_27700" + } + }, + "UN": { + "ClearMap": { + "url": "https://geoservices.un.org/arcgis/rest/services/ClearMap_WebTopo/MapServer/tile/{z}/{y}/{x}", + "name": "UN.ClearMap", + "html_attribution": "© United Nations contributors", + "attribution": "United Nations" + } + } +} \ No newline at end of file diff --git a/=0.1.3 b/=0.1.3 deleted file mode 100644 index f634798..0000000 --- a/=0.1.3 +++ /dev/null @@ -1,90 +0,0 @@ -Requirement already satisfied: sphinx in /opt/anaconda3/lib/python3.13/site-packages (7.4.7) -Requirement already satisfied: myst-parser in /opt/anaconda3/lib/python3.13/site-packages (3.0.1) -Requirement already satisfied: jupyter-book in /opt/anaconda3/lib/python3.13/site-packages (1.0.4.post1) -Requirement already satisfied: sphinx-book-theme in /opt/anaconda3/lib/python3.13/site-packages (1.1.4) -Requirement already satisfied: sphinx-togglebutton in /opt/anaconda3/lib/python3.13/site-packages (0.3.2) -Requirement already satisfied: sphinx-external-toc in /opt/anaconda3/lib/python3.13/site-packages (1.0.1) -Requirement already satisfied: sphinx-multitoc-numbering in /opt/anaconda3/lib/python3.13/site-packages (0.1.3) -Requirement already satisfied: sphinxcontrib-applehelp in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (2.0.0) -Requirement already satisfied: sphinxcontrib-devhelp in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (2.0.0) -Requirement already satisfied: sphinxcontrib-jsmath in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (1.0.1) -Requirement already satisfied: sphinxcontrib-htmlhelp>=2.0.0 in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (2.1.0) -Requirement already satisfied: sphinxcontrib-serializinghtml>=1.1.9 in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (2.0.0) -Requirement already satisfied: sphinxcontrib-qthelp in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (2.0.0) -Requirement already satisfied: Jinja2>=3.1 in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (3.1.6) -Requirement already satisfied: Pygments>=2.17 in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (2.19.1) -Requirement already satisfied: docutils<0.22,>=0.20 in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (0.21.2) -Requirement already satisfied: snowballstemmer>=2.2 in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (2.2.0) -Requirement already satisfied: babel>=2.13 in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (2.16.0) -Requirement already satisfied: alabaster~=0.7.14 in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (0.7.16) -Requirement already satisfied: imagesize>=1.3 in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (1.4.1) -Requirement already satisfied: requests>=2.30.0 in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (2.32.3) -Requirement already satisfied: packaging>=23.0 in /opt/anaconda3/lib/python3.13/site-packages (from sphinx) (24.2) -Requirement already satisfied: markdown-it-py~=3.0 in /opt/anaconda3/lib/python3.13/site-packages (from myst-parser) (3.0.0) -Requirement already satisfied: mdit-py-plugins~=0.4 in /opt/anaconda3/lib/python3.13/site-packages (from myst-parser) (0.4.2) -Requirement already satisfied: pyyaml in /opt/anaconda3/lib/python3.13/site-packages (from myst-parser) (6.0.2) -Requirement already satisfied: mdurl~=0.1 in /opt/anaconda3/lib/python3.13/site-packages (from markdown-it-py~=3.0->myst-parser) (0.1.0) -Requirement already satisfied: click<9,>=7.1 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-book) (7.1.2) -Requirement already satisfied: jsonschema<5 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-book) (3.2.0) -Requirement already satisfied: linkify-it-py<3,>=2 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-book) (2.0.3) -Requirement already satisfied: myst-nb~=1.0 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-book) (1.3.0) -Requirement already satisfied: sphinx-comments~=0.0 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-book) (0.0.3) -Requirement already satisfied: sphinx-copybutton~=0.5 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-book) (0.5.2) -Requirement already satisfied: sphinx-design~=0.6 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-book) (0.6.0) -Requirement already satisfied: sphinx-jupyterbook-latex~=1.0 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-book) (1.0.0) -Requirement already satisfied: sphinx-thebe~=0.3 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-book) (0.3.1) -Requirement already satisfied: sphinxcontrib-bibtex~=2.5 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-book) (2.6.5) -Requirement already satisfied: pydata-sphinx-theme==0.15.4 in /opt/anaconda3/lib/python3.13/site-packages (from sphinx-book-theme) (0.15.4) -Requirement already satisfied: beautifulsoup4 in /opt/anaconda3/lib/python3.13/site-packages (from pydata-sphinx-theme==0.15.4->sphinx-book-theme) (4.12.3) -Requirement already satisfied: accessible-pygments in /opt/anaconda3/lib/python3.13/site-packages (from pydata-sphinx-theme==0.15.4->sphinx-book-theme) (0.0.5) -Requirement already satisfied: typing-extensions in /opt/anaconda3/lib/python3.13/site-packages (from pydata-sphinx-theme==0.15.4->sphinx-book-theme) (4.12.2) -Requirement already satisfied: setuptools in /opt/anaconda3/lib/python3.13/site-packages (from sphinx-togglebutton) (72.1.0) -Requirement already satisfied: wheel in /opt/anaconda3/lib/python3.13/site-packages (from sphinx-togglebutton) (0.45.1) -Requirement already satisfied: attrs>=17.4.0 in /opt/anaconda3/lib/python3.13/site-packages (from jsonschema<5->jupyter-book) (21.4.0) -Requirement already satisfied: pyrsistent>=0.14.0 in /opt/anaconda3/lib/python3.13/site-packages (from jsonschema<5->jupyter-book) (0.20.0) -Requirement already satisfied: six>=1.11.0 in /opt/anaconda3/lib/python3.13/site-packages (from jsonschema<5->jupyter-book) (1.17.0) -Requirement already satisfied: uc-micro-py in /opt/anaconda3/lib/python3.13/site-packages (from linkify-it-py<3,>=2->jupyter-book) (1.0.1) -Requirement already satisfied: importlib_metadata in /opt/anaconda3/lib/python3.13/site-packages (from myst-nb~=1.0->jupyter-book) (8.5.0) -Requirement already satisfied: ipython in /opt/anaconda3/lib/python3.13/site-packages (from myst-nb~=1.0->jupyter-book) (8.30.0) -Requirement already satisfied: jupyter-cache>=0.5 in /opt/anaconda3/lib/python3.13/site-packages (from myst-nb~=1.0->jupyter-book) (1.0.1) -Requirement already satisfied: nbclient in /opt/anaconda3/lib/python3.13/site-packages (from myst-nb~=1.0->jupyter-book) (0.5.13) -Requirement already satisfied: nbformat>=5.0 in /opt/anaconda3/lib/python3.13/site-packages (from myst-nb~=1.0->jupyter-book) (5.10.4) -Requirement already satisfied: ipykernel in /opt/anaconda3/lib/python3.13/site-packages (from myst-nb~=1.0->jupyter-book) (6.29.5) -Requirement already satisfied: pybtex>=0.25 in /opt/anaconda3/lib/python3.13/site-packages (from sphinxcontrib-bibtex~=2.5->jupyter-book) (0.25.1) -Requirement already satisfied: pybtex-docutils>=1.0.0 in /opt/anaconda3/lib/python3.13/site-packages (from sphinxcontrib-bibtex~=2.5->jupyter-book) (1.0.3) -Requirement already satisfied: MarkupSafe>=2.0 in /opt/anaconda3/lib/python3.13/site-packages (from Jinja2>=3.1->sphinx) (3.0.2) -Requirement already satisfied: sqlalchemy<3,>=1.3.12 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-cache>=0.5->myst-nb~=1.0->jupyter-book) (1.4.54) -Requirement already satisfied: tabulate in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-cache>=0.5->myst-nb~=1.0->jupyter-book) (0.9.0) -Requirement already satisfied: traitlets>=5.0.0 in /opt/anaconda3/lib/python3.13/site-packages (from nbclient->myst-nb~=1.0->jupyter-book) (5.14.3) -Requirement already satisfied: jupyter-client>=6.1.5 in /opt/anaconda3/lib/python3.13/site-packages (from nbclient->myst-nb~=1.0->jupyter-book) (7.4.9) -Requirement already satisfied: nest-asyncio in /opt/anaconda3/lib/python3.13/site-packages (from nbclient->myst-nb~=1.0->jupyter-book) (1.6.0) -Requirement already satisfied: entrypoints in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-client>=6.1.5->nbclient->myst-nb~=1.0->jupyter-book) (0.4) -Requirement already satisfied: jupyter-core>=4.9.2 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-client>=6.1.5->nbclient->myst-nb~=1.0->jupyter-book) (5.7.2) -Requirement already satisfied: python-dateutil>=2.8.2 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-client>=6.1.5->nbclient->myst-nb~=1.0->jupyter-book) (2.9.0.post0) -Requirement already satisfied: pyzmq>=23.0 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-client>=6.1.5->nbclient->myst-nb~=1.0->jupyter-book) (26.2.0) -Requirement already satisfied: tornado>=6.2 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-client>=6.1.5->nbclient->myst-nb~=1.0->jupyter-book) (6.5.1) -Requirement already satisfied: platformdirs>=2.5 in /opt/anaconda3/lib/python3.13/site-packages (from jupyter-core>=4.9.2->jupyter-client>=6.1.5->nbclient->myst-nb~=1.0->jupyter-book) (4.3.7) -Requirement already satisfied: fastjsonschema>=2.15 in /opt/anaconda3/lib/python3.13/site-packages (from nbformat>=5.0->myst-nb~=1.0->jupyter-book) (2.20.0) -Requirement already satisfied: latexcodec>=1.0.4 in /opt/anaconda3/lib/python3.13/site-packages (from pybtex>=0.25->sphinxcontrib-bibtex~=2.5->jupyter-book) (3.0.1) -Requirement already satisfied: charset-normalizer<4,>=2 in /opt/anaconda3/lib/python3.13/site-packages (from requests>=2.30.0->sphinx) (3.3.2) -Requirement already satisfied: idna<4,>=2.5 in /opt/anaconda3/lib/python3.13/site-packages (from requests>=2.30.0->sphinx) (3.7) -Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/anaconda3/lib/python3.13/site-packages (from requests>=2.30.0->sphinx) (2.3.0) -Requirement already satisfied: certifi>=2017.4.17 in /opt/anaconda3/lib/python3.13/site-packages (from requests>=2.30.0->sphinx) (2025.4.26) -Requirement already satisfied: soupsieve>1.2 in /opt/anaconda3/lib/python3.13/site-packages (from beautifulsoup4->pydata-sphinx-theme==0.15.4->sphinx-book-theme) (2.5) -Requirement already satisfied: zipp>=3.20 in /opt/anaconda3/lib/python3.13/site-packages (from importlib_metadata->myst-nb~=1.0->jupyter-book) (3.21.0) -Requirement already satisfied: appnope in /opt/anaconda3/lib/python3.13/site-packages (from ipykernel->myst-nb~=1.0->jupyter-book) (0.1.3) -Requirement already satisfied: comm>=0.1.1 in /opt/anaconda3/lib/python3.13/site-packages (from ipykernel->myst-nb~=1.0->jupyter-book) (0.2.1) -Requirement already satisfied: debugpy>=1.6.5 in /opt/anaconda3/lib/python3.13/site-packages (from ipykernel->myst-nb~=1.0->jupyter-book) (1.8.11) -Requirement already satisfied: matplotlib-inline>=0.1 in /opt/anaconda3/lib/python3.13/site-packages (from ipykernel->myst-nb~=1.0->jupyter-book) (0.1.6) -Requirement already satisfied: psutil in /opt/anaconda3/lib/python3.13/site-packages (from ipykernel->myst-nb~=1.0->jupyter-book) (5.9.0) -Requirement already satisfied: decorator in /opt/anaconda3/lib/python3.13/site-packages (from ipython->myst-nb~=1.0->jupyter-book) (5.1.1) -Requirement already satisfied: jedi>=0.16 in /opt/anaconda3/lib/python3.13/site-packages (from ipython->myst-nb~=1.0->jupyter-book) (0.19.2) -Requirement already satisfied: prompt-toolkit<3.1.0,>=3.0.41 in /opt/anaconda3/lib/python3.13/site-packages (from ipython->myst-nb~=1.0->jupyter-book) (3.0.43) -Requirement already satisfied: stack-data in /opt/anaconda3/lib/python3.13/site-packages (from ipython->myst-nb~=1.0->jupyter-book) (0.2.0) -Requirement already satisfied: pexpect>4.3 in /opt/anaconda3/lib/python3.13/site-packages (from ipython->myst-nb~=1.0->jupyter-book) (4.8.0) -Requirement already satisfied: wcwidth in /opt/anaconda3/lib/python3.13/site-packages (from prompt-toolkit<3.1.0,>=3.0.41->ipython->myst-nb~=1.0->jupyter-book) (0.2.5) -Requirement already satisfied: parso<0.9.0,>=0.8.4 in /opt/anaconda3/lib/python3.13/site-packages (from jedi>=0.16->ipython->myst-nb~=1.0->jupyter-book) (0.8.4) -Requirement already satisfied: ptyprocess>=0.5 in /opt/anaconda3/lib/python3.13/site-packages (from pexpect>4.3->ipython->myst-nb~=1.0->jupyter-book) (0.7.0) -Requirement already satisfied: executing in /opt/anaconda3/lib/python3.13/site-packages (from stack-data->ipython->myst-nb~=1.0->jupyter-book) (0.8.3) -Requirement already satisfied: asttokens in /opt/anaconda3/lib/python3.13/site-packages (from stack-data->ipython->myst-nb~=1.0->jupyter-book) (3.0.0) -Requirement already satisfied: pure-eval in /opt/anaconda3/lib/python3.13/site-packages (from stack-data->ipython->myst-nb~=1.0->jupyter-book) (0.2.2) diff --git a/=1.0.0 b/=1.0.0 deleted file mode 100644 index e69de29..0000000 diff --git a/=1.0.1 b/=1.0.1 deleted file mode 100644 index e69de29..0000000 diff --git a/=2.0.0 b/=2.0.0 deleted file mode 100644 index e69de29..0000000 diff --git a/=7.2.6 b/=7.2.6 deleted file mode 100644 index e69de29..0000000 diff --git a/README.md b/README.md index 60373ee..42bb659 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,8 @@ -# Da**[View the full documentation website here](https://dmatekenya.github.io/AIMS-DSCBI/)**Science Capacity Building Initiative (DSCBI) +# Data Science Capacity Building Initiative (DSCBI) This repository provides information about the capacity building initiative, a collaboration between the African Institute for Mathematical Sciences (AIMS), the National Institute of Statistics of Rwanda (NISR), and [Cenfri](https://cenfri.org). The initiative aims to deliver data science training to staff from over 20 institutions that are part of Rwanda's National Statistical System (NSS). -**[View the full documentation website here](https://dmatekenya.github.io/AIMS-DSCBI/)** - This repository provides information about the capacity building initiative, a collaboration between the African Institute for Mathematical Sciences (AIMS), the National Institute of Statistics of Rwanda (NISR), and [Cenfri](https://cenfri.org). The initiative aims to deliver data science training to staff from over 20 institutions that are part of Rwanda’s National Statistical System (NSS). ## Course Modules diff --git a/docs/_config.yml b/docs/_config.yml index 723cb5b..334eb33 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,7 +1,6 @@ # Book settings title: Data Science Capacity Building Initiative author: Dunstan Matekenya -logo: images/logo-aims.png only_build_toc_files: true exclude_patterns: [_build, Thumbs.db, .DS_Store, "**.ipynb_checkpoints"] @@ -26,6 +25,14 @@ repository: html: home_page_in_navbar: false extra_navbar: "" + extra_footer: | +
+ AIMS Logo + NISR Logo + Cenfri Logo +
+ extra_css: + - _static/custom.css use_edit_page_button: true use_repository_button: true use_issues_button: true diff --git a/docs/_static/custom.css b/docs/_static/custom.css new file mode 100644 index 0000000..465815a --- /dev/null +++ b/docs/_static/custom.css @@ -0,0 +1,15 @@ +.navbar-logo-container { + display: flex; + justify-content: center; + align-items: center; + margin: 10px auto; + width: 100%; + gap: 20px; +} + +.navbar-logo { + max-height: 50px; + max-width: 100px; + margin: 5px; + display: inline-block; +} diff --git a/docs/_static/logo-aims.png b/docs/_static/logo-aims.png new file mode 100644 index 0000000..271c2f6 Binary files /dev/null and b/docs/_static/logo-aims.png differ diff --git a/docs/_static/logo-cenfri.png b/docs/_static/logo-cenfri.png new file mode 100644 index 0000000..87a7273 Binary files /dev/null and b/docs/_static/logo-cenfri.png differ diff --git a/docs/_static/logo-nisr.png b/docs/_static/logo-nisr.png new file mode 100644 index 0000000..6f99c57 Binary files /dev/null and b/docs/_static/logo-nisr.png differ diff --git a/docs/_toc.yml b/docs/_toc.yml index 4b2aa3c..1a63def 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -3,6 +3,7 @@ root: index parts: - caption: Course Requirements + numbered: false chapters: - file: course-requirements/learning-python.md - file: course-requirements/python-installation.md @@ -15,6 +16,7 @@ parts: - file: course-requirements/platforms.md - caption: Curriculum Overview + numbered: true chapters: - file: modules/module1_python_foundations.md - file: modules/module2_data_analysis.md @@ -35,10 +37,17 @@ parts: - file: notebooks/assignments/README.md title: Assignments sections: - - file: notebooks/assignments/mod1-assignment-1.ipynb + - file: notebooks/assignments/assignment-1.ipynb title: Assignment 1 - - file: notebooks/assignments/mod1-assignment-1-solutions.ipynb + - file: notebooks/assignments/assignment-1-solutions.ipynb title: Assignment 1 Solutions + - file: notebooks/assignments/assignment-2.ipynb + title: Assignment 2 + - file: notebooks/assignments/assignment-3.md + title: Assignment 3 + sections: + - file: notebooks/assignments/assignment-3-zonal-stats.ipynb + title: Geospatial Environment - file: notebooks/module-1/README.md title: Module 1 @@ -56,4 +65,12 @@ parts: title: Data Processing with Pandas - file: notebooks/module-2/03-stats-analysis-with-python.ipynb title: Statistical Analysis with Python - \ No newline at end of file + +- caption: Data Use Cases + chapters: + - file: projects.md + +- caption: Additional Resources + numbered: false + chapters: + - file: llms-and-chatbots-guide.md diff --git a/docs/course-requirements/github-workflow.md b/docs/course-requirements/github-workflow.md index 8fa2a1e..5a76f37 100644 --- a/docs/course-requirements/github-workflow.md +++ b/docs/course-requirements/github-workflow.md @@ -1,4 +1,4 @@ -# Student GitHub Workflow Instructions +# GitHub Workflow ## Overview This document provides step-by-step instructions for working with course materials using Git and GitHub. You'll learn essential version control skills while accessing course notebooks and submitting assignments. @@ -71,7 +71,7 @@ git push origin main ## Working with Course Materials ### Making Changes to Notebooks -1. **Work directly on notebooks** in the appropriate folders with VS Code +1. **Work directly on notebooks** in the appropriate folders in VS Code 2. **Save your work regularly** in Jupyter or your preferred editor 3. **Commit your changes frequently**: ```bash diff --git a/docs/images/logo-cenfri.png b/docs/images/logo-cenfri.png new file mode 100644 index 0000000..87a7273 Binary files /dev/null and b/docs/images/logo-cenfri.png differ diff --git a/docs/images/logo-nisr.png b/docs/images/logo-nisr.png new file mode 100644 index 0000000..6f99c57 Binary files /dev/null and b/docs/images/logo-nisr.png differ diff --git a/docs/images/open-weather-api.png b/docs/images/open-weather-api.png new file mode 100644 index 0000000..d6210f5 Binary files /dev/null and b/docs/images/open-weather-api.png differ diff --git a/docs/index.md b/docs/index.md index 094db1e..9e559b6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,10 @@ -# Data Science Capacity Building Initiative +# Data Science Capacity Building Initiative (DSCBI) + +
+ AIMS Logo + NISR Logo + Cenfri Logo +
This is the online documentation for the capacity building initiative, a collaboration between the African Institute for Mathematical Sciences (AIMS), the National Institute of Statistics of Rwanda (NISR), and [Cenfri](https://cenfri.org). The initiative aims to deliver data science training to staff from over 20 institutions that are part of Rwanda's National Statistical System (NSS). diff --git a/docs/llm-chatbots-guide.md b/docs/llm-chatbots-guide.md new file mode 100644 index 0000000..31110a1 --- /dev/null +++ b/docs/llm-chatbots-guide.md @@ -0,0 +1,344 @@ +# Building LLM Based Chatbots in Python +*A comprehensive guide for building LLM-based chatbots* + +## How to Use This Guide +This document provides a comprehensive list of resources and suggested learning sequence for developing the knowledge and skills needed to build LLM-based chatbots. You don't need to consume everything here - instead, start with the minimum resources from each phase to get a working foundation, then selectively add more advanced materials based on your project needs and interests. +The resources are organized by time investment (shortest first) so you can quickly identify what fits your schedule and learning goals. + +## Phase 1: LLMs and NLP Foundations + +### Core Concepts to Master +- **Traditional NLP vs. Modern LLMs**: Understanding the evolution from rule-based systems to transformer models +- **Transformer Architecture**: Attention mechanisms, encoders, decoders +- **Large Language Models**: Training process, fine-tuning, prompt engineering +- **Embeddings**: Vector representations, semantic similarity +- **Tokenization**: How text is processed by models + +### Learning Resources + +#### Quick Start (1-3 hours) +- **[Andrej Karpathy's "Intro to Large Language Models"](https://www.youtube.com/watch?v=zjkBMFhNj_g)** (1 hour) +- **["What are Embeddings?"](https://www.youtube.com/watch?v=wjZofJX0v4M)** (20 min) +- **[Hugging Face Transformers Quick Tour](https://huggingface.co/docs/transformers/quicktour)** (30 min) + +#### Medium Investment (4-10 hours) +- **[Hugging Face LLM Course - Chapters 1-3](https://huggingface.co/learn/nlp-course/chapter1/1)** (6-8 hours) +- **[Hugging Face LLM Course - Chapter 7](https://huggingface.co/learn/llm-course/chapter7/2)** (1-2 hours) + +## Phase 1.5: LLM Platforms & Model Landscape + +### Core Concepts to Master +- **Proprietary vs Open Source Models**: Understanding trade-offs between commercial and open models +- **Model Capabilities**: Text generation, reasoning, coding, multimodal features +- **API vs Local Deployment**: Cloud services vs running models locally +- **Model Sizes & Performance**: 7B, 13B, 70B+ parameter models and their use cases +- **Cost Considerations**: API pricing vs compute costs for local models + +### Learning Resources + +#### Quick Start (1-3 hours) +- **["LLM Comparison 2025" by AI Explained](https://www.helicone.ai/blog/the-complete-llm-model-comparison-guide)** (20 min) +- **[Hugging Face Model Hub Tour](https://huggingface.co/models)** (30 min) +- **[Ollama Model Library](https://ollama.com/library)** (15 min) + +#### Sign-up for APIs +- **[Setting up OpenAI API](https://platform.openai.com/docs/quickstart)** (30 min) +- **[Anthropic Claude API Setup](https://docs.anthropic.com/en/api/getting-started)** (30 min) +- **[Cohere API Quickstart](https://docs.cohere.com/docs/quickstart-tutorial)** (30 min) +- **[Ollama Installation & Model Download](https://ollama.com/)** (1 hour) + +### Major LLM Platforms Overview + +#### Proprietary/Commercial APIs +- **OpenAI**: GPT-4, GPT-3.5-turbo - Industry standard, excellent reasoning +- **Anthropic Claude**: Claude-3 family - Strong safety, long context windows +- **Cohere**: Command-R+ - Enterprise-focused, good for RAG applications +- **Google Gemini**: Multimodal capabilities, integrated with Google services + +#### Open Source Models (via Ollama/Hugging Face) +- **Meta Llama Family**: llama2, llama3.1 - Well-rounded, popular for fine-tuning +- **Mistral**: mistral-7b-instruct - Efficient, good performance-to-size ratio +- **Qwen**: Strong reasoning and multilingual capabilities +- **CodeLlama**: Specialized for code generation and understanding +- **Vicuna**: Fine-tuned from Llama, conversational +- **Phi-3**: Microsoft's small but capable models + +#### Specialized Models +- **Embedding Models**: sentence-transformers, OpenAI text-embedding-ada-002 +- **Code Models**: CodeLlama, StarCoder, CodeT5 +- **Multimodal**: LLaVA, GPT-4V, Claude-3 Vision + +### Decision Framework for Model Selection +- **Budget**: Free tier limits, API costs vs local compute +- **Use Case**: General chat, coding, reasoning, creative tasks +- **Privacy**: Cloud APIs vs local deployment +- **Performance**: Response quality vs speed requirements +- **Integration**: Existing tech stack compatibility + +--- + +## Phase 2: Prompt Engineering & Basic LLM Interaction +This is optional but still recommended for you to understand the basics of interacting with LLMs. + +### Core Concepts to Master +- **Prompt Engineering**: Crafting effective prompts for different tasks +- **Few-shot Learning**: Using examples to guide model behavior +- **System Messages**: Setting context and behavior guidelines +- **Temperature & Sampling**: Controlling randomness and creativity +- **API Integration**: Direct interaction with LLM APIs (OpenAI, Ollama, Hugging Face) + +### Learning Resources +#### Quick Start (1-3 hours) +- **["Prompt Engineering in 15 Minutes" by AI Explained](https://www.youtube.com/watch?v=dOxUroR57xs)** (15 min) +- **[OpenAI Prompt Engineering Guide](https://platform.openai.com/docs/guides/prompt-engineering)** (1 hour) +- **[Ollama Python Basic Tutorial](https://github.com/ollama/ollama-python)** (30 min) + +#### Medium Investment (4-8 hours) +- **[Anthropic's Prompt Engineering Guide](https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview)** (2-3 hours) +- **[DeepLearning.AI Prompt Engineering Course](https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/)** (4-6 hours) + +## Phase 3: RAG (Retrieval-Augmented Generation) Fundamentals + +### Core RAG Concepts +- **Vector Databases**: Storing and retrieving embeddings +- **Document Processing**: Chunking, preprocessing, metadata handling +- **Retrieval Strategies**: Semantic search, hybrid search, re-ranking +- **Context Window Management**: Optimizing retrieved content for LLM input + +### Learning Resources + +#### Quick Start (1-4 hours) +- **["RAG in 100 Seconds" by Fireship](https://www.youtube.com/watch?v=T-D1OfcDW1M)** (2 min) +- **[Simple RAG with Ollama Tutorial](https://python.langchain.com/docs/tutorials/local_rag/)** (1 hour) +- **[ChromaDB Quickstart](https://docs.trychroma.com/getting-started)** (30 min) + +#### Medium Investment (5-12 hours) +- **[LangChain RAG Tutorial](https://python.langchain.com/docs/tutorials/rag/)** (4-6 hours) +- **[Building RAG from Scratch by Greg Kamradt](https://www.youtube.com/watch?v=BrsocJb-fAo)** (3 hours) +- **[Weaviate RAG Tutorial](https://weaviate.io/developers/weaviate/tutorials/rag)** (2-3 hours) + +### Open Source LLM Integration +- **Ollama Models**: llama2, mistral, codellama, vicuna +- **Hugging Face Models**: microsoft/DialoGPT-medium, meta-llama/Llama-2-7b-chat-hf +- **[Local Model Setup](https://python.langchain.com/docs/integrations/llms/ollama)** + +--- + +## Phase 4: Tools and Frameworks by Complexity Level + +### No-Code Solutions +Perfect for rapid prototyping and non-technical stakeholders + +#### Quick Setup (15-30 minutes) +- **Ollama + Open WebUI**: Local chatbot interface +- **HuggingChat**: Free web-based interface for open source models +- **Chatbase**: Upload documents, get instant chatbot + +#### Medium Setup (1-2 hours) +- **Botpress**: Visual chatbot builder with NLU +- **Rasa X**: Open source conversational AI platform + +#### Pros & Cons +- ✅ Quick setup, no coding required +- ✅ Good for testing concepts +- ❌ Limited customization +- ❌ May have usage limits + +### Low-Code Solutions +Balance between ease of use and customization + +#### Quick Setup (30 minutes - 2 hours) +- **Flowise**: Visual node-based LLM orchestration +- **LangFlow**: Drag-and-drop RAG pipeline builder +- **n8n**: Workflow automation with LLM nodes + +#### Learning Resources +- **[Flowise Quickstart](https://docs.flowiseai.com/getting-started)** (30 min) +- **[LangFlow Tutorial](https://docs.langflow.org/)** (45 min) + +### Code-Based Frameworks (Python) +Maximum flexibility and customization + +#### Quick Start Options (2-4 hours) +- **[Streamlit + Ollama Tutorial](https://docs.streamlit.io/knowledge-base/tutorials/llm-quickstart)** +- **[Chainlit Quickstart](https://docs.chainlit.io/get-started/overview)** +- **[Gradio ChatInterface](https://gradio.app/docs/#chatinterface)** + +#### Medium Complexity (1-2 days) +- **[LangChain Python Tutorial](https://python.langchain.com/docs/get_started/)** +- **[LlamaIndex Python Starter](https://docs.llamaindex.ai/en/stable/getting_started/starter_example/)** +- **[Haystack Tutorial](https://haystack.deepset.ai/tutorials)** + +#### Advanced Frameworks (1+ weeks) +- **Custom RAG with ChromaDB + Ollama** +- **FastAPI + LangChain Backend** +- **Full-stack with Streamlit + Vector DB** + +### Open Source Model Recommendations +- **For Chatbots**: Llama-2-7B-Chat, Mistral-7B-Instruct, Vicuna-7B +- **For Embeddings**: sentence-transformers/all-MiniLM-L6-v2 +- **For Code**: CodeLlama-7B-Instruct + +--- + +## Phase 5: Frontend Development Options + +### Web-Based Interfaces (Time Investment Order) + +#### Rapid Prototyping (30 minutes - 2 hours) +- **Gradio ChatInterface** (30 min setup): + ```python + import gradio as gr + gr.ChatInterface(fn=your_chat_function).launch() + ``` +- **Streamlit Chat** (1 hour setup): + ```python + import streamlit as st + st.chat_input("Your message") + st.chat_message("assistant") + ``` + +#### Professional Interfaces (4-8 hours) +- **[Chainlit](https://docs.chainlit.io/get-started/overview)** (2-4 hours): Conversational UI specifically for LLM apps +- **Streamlit + Custom CSS** (4-6 hours): Enhanced styling and UX +- **FastAPI + Jinja2 Templates** (6-8 hours): Custom web interface + +#### Advanced Web Applications (1-2 weeks) +- **FastAPI + React**: Full-stack separation +- **Django + HTMX**: Python-heavy full-stack + +### Mobile & Messaging Platforms + +#### Quick Integration (2-4 hours) +- **Telegram Bot** with python-telegram-bot: + ```python + from telegram.ext import Application, MessageHandler + ``` +- **Discord Bot** with discord.py: + ```python + import discord + from discord.ext import commands + ``` + +#### Medium Integration (1-2 days) +- **WhatsApp via Twilio**: WhatsApp Business API integration +- **Slack Bolt Framework**: Slack app development + +### Deployment Options (Time Investment) +#### Instant Deploy (5-15 minutes) +- **Streamlit Community Cloud**: Free hosting for Streamlit apps +- **Hugging Face Spaces**: Free hosting for Gradio/Streamlit +- **Replit**: Online IDE with instant deployment + +#### Professional Deploy (2-6 hours) +- **Railway**: Simple Python app deployment +- **Render**: Docker-based deployment +- **DigitalOcean App Platform**: Managed deployment + +--- + +## Phase 6: Advanced Topics for Professional Applications + +### Evaluation & Testing (Time Investment Order) + +#### Quick Setup (1-2 hours) +- **Simple metrics**: Response time, relevance scoring +- **LangSmith Basic Setup**: LangChain monitoring + +#### Medium Investment (4-8 hours) +- **RAGAS Framework**: RAG evaluation metrics +- **Custom evaluation pipeline**: Automated testing + +### Security & Privacy (Time Investment Order) + +#### Essential (2-4 hours) +- **Input sanitization**: Prevent prompt injection +- **API key management**: Environment variables, secrets +- **Rate limiting**: Basic protection + +#### Professional (1-2 days) +- **Data encryption**: At rest and in transit +- **User authentication**: JWT, OAuth integration +- **GDPR compliance**: Data retention policies + +### Performance Optimization + +#### Quick Wins (2-4 hours) +- **Response streaming**: Real-time chat experience +- **Simple caching**: In-memory response caching +- **Model quantization**: Faster inference with Ollama + +#### Advanced (1+ weeks) +- **Vector database optimization**: Index tuning +- **Load balancing**: Multiple model instances +- **Advanced caching**: Redis, distributed caching + +--- + +## Recommended 8-12-Week Project Timeline + +### Phase 1 – Foundation & Setup (Weeks 1–2) +**Goal:** Understand basics of LLMs and set up tools. + +- **Intro to LLMs & Chatbots** + - Watch Karpathy's intro to LLMs + - Read Hugging Face *Course* chapters 1–3 (up to tokenization, transformers basics) +- **Environment Setup** + - Install Python, Conda/Poetry for environments + - Set up **Ollama** for local inference if needed + - Explore Streamlit "hello world" apps +- **Mini-Project:** Build a simple chatbot (no RAG) using Ollama + Streamlit + +### Phase 2 – Core NLP & RAG Concepts (Weeks 3–4) +**Goal:** Learn retrieval fundamentals and connect them to LLMs. + +- **RAG Fundamentals** + - Watch tutorial series on RAG (Hugging Face, LangChain docs) + - Learn embeddings: generate with `sentence-transformers` or Hugging Face +- **Document Handling** + - Create a pipeline to load and chunk PDFs/text docs + - Store embeddings in **ChromaDB** (free, lightweight option) +- **Mini-Project:** Build a basic retrieval + response system with LangChain + +### Phase 3 – Framework Integration (Weeks 5–6) +**Goal:** Move from "toy" scripts to structured apps. + +- **Choose a framework:** LangChain or LlamaIndex (start with LangChain for ecosystem support) +- **Add Conversation Memory:** Learn how to store chat history across turns +- **Improve Reliability:** Add error handling, logging, and configuration files +- **Mini-Project:** Interactive chatbot that remembers past queries + +### Phase 4 – Frontend Development (Weeks 7–8) +**Goal:** Create a usable interface for demonstration. + +- **UI Development** + - Build UI with Streamlit (or Chainlit for chatbot-style interface) +- **Features & Styling** + - Add buttons, input fields, and styled responses + - Basic UX: clear chat history, loading spinners, response formatting +- **Mini-Project:** A polished chatbot frontend that feels usable + +### Phase 5 – Advanced Features (Weeks 9–10) +**Goal:** Make the chatbot more robust and "demo-ready." + +- **Evaluation** + - Learn basic chatbot evaluation: answer relevance, latency, failure cases + - Add simple monitoring (response time logs, success/failure rates) +- **Security & Optimization** + - Add guardrails (prompt filtering, max token limits) + - Experiment with faster embedding models or smaller LLMs for efficiency + +### Phase 6 – Final Polish & Deployment (Weeks 11–12) +**Goal:** Package the chatbot for sharing and presentation. + +- **Documentation & Testing** + - Write a README with setup instructions + - Add inline code comments and notebook demos + - Test edge cases (empty docs, large docs, malformed input) +- **Deployment** + - Deploy Streamlit app to Streamlit Cloud (free) or Hugging Face Spaces + - Final debugging and presentation prep +- **Capstone Demo:** Present a fully working RAG-based chatbot with documents of choice (e.g., PDFs, reports, FAQs). + +--- + diff --git a/docs/project-docs/Agenda for August 18.docx b/docs/project-docs/Agenda for August 18.docx new file mode 100644 index 0000000..f02592c Binary files /dev/null and b/docs/project-docs/Agenda for August 18.docx differ diff --git a/docs/project-docs/nyagatare-report.docx b/docs/project-docs/nyagatare-report.docx new file mode 100644 index 0000000..213621f Binary files /dev/null and b/docs/project-docs/nyagatare-report.docx differ diff --git a/docs/projects.md b/docs/projects.md new file mode 100644 index 0000000..5ab14cc --- /dev/null +++ b/docs/projects.md @@ -0,0 +1,29 @@ +# Work Related Projects + +| | Institution | Members | Project title|Project Description | +|---|--------------|-----------------------------------------|-----|----| +|1|Ministry of Finance and Economic Planning | Andrew Mushokambere|Macro-economic dashboard| Creating a macroeconomic dashboard for better communication of key indicators like GDP, CPI, exchange rates, fiscal data, and debt.| +|2|Ministry of Trade and Industry |Aimable Iradukunda | A Data-Driven Approach to Industrial Price Monitoring in Rwanda |The project aims to monitor and analyze production, wholesale, and retail prices of key industrial products to ensure transparency, protect consumers, and provide data-driven insights for better economic planning and decision-making by the Ministry| +|3|Rwanda Basic Education Board |Aimable Sibomana |ICT Device Management Schools| The project will develop a digital system for monitoring ICT devices in schools, enabling real-time reporting, resource allocation, and decision-making| +|4|Rwanda Revenue Authority |Alleluia Mirelle,
Bertrand Cyiza,
Mediatrice Iradukunda |Data Discovery Chatbot| To create an NLP-powered chatbot that centralizes RRA’s data catalog, streamlines discovery, and guides users on access and usage| +|5|Ministry of Defence | Annonciata Ingabire |Optimized Defense Resource Allocation | A data-driven system to predict and prioritize defense resource allocation, reducing waste and improving operational effectiveness.| +|6|Ministry of Youth and ICT |Augustin Ndayambaje |Predictive Modeling of Youth Unemployment in Rwanda |A machine learning-based system to forecast youth unemployment, identify key drivers, and deliver data-driven policy recommendations through dashboards and APIs | +|7|Ministry of Justice | Charles Iyamuremye |Predictive Crime Mapping Using Machine Learning to Identify High-Risk Crime Locations |A GeoAI-enabled predictive crime mapping tool that forecasts hotspots, optimizes resource allocation, and provides interactive dashboards for law enforcement decision-making | +|8|Ministry of Environment,
Rwanda Environment Management Authority,
Rwanda Meteorology Agency |Clementine Nyiraneza,
Patrick Mupenzi,
Joselyn Ingabire |Predicting urban Air Quality in Kigali City using machine learning |An AI-powered air quality prediction system to enable data-driven environmental decisions and public health safeguards in Kigali | +|9|National Institute of Statistics of Rwanda | Denyse Uwimbabazi,
Beata Niyitegeka,
Monique Usabyimana,
Emmanuel Dusingizimana |Land cover classification using high resolution satelite images |An AI-powered satellite image processing pipeline for automated land cover mapping, enabling frequent updates and improved spatial analytics.| +|10|Gender Monitoring Office |Diane Mukakalisa |Interactive Gender Based Violence Monitoring Dashboard|To develop an interactive GBV monitoring dashboard that integrates and analyzes multi-source data to track trends, enhance policy responses, and improve victim support through real-time insights.| +|11|National Institute of Statistics of Rwanda (NISR)| Didier Gaga
Faustin Sharangabo
Muhoza Scovia
Juvenal Iraguha |Exploring the Geospatial Relationship Between Altitude and Child Stunting in Rwanda | A geospatial study identifying altitude-related stunting patterns to guide precision nutrition policies in Rwanda.| +|12|Ministry of ICT and Innovation | Docile Umurengezi,
Jean Pierre Ntukagwabire|Data Sharing & Privacy Bot | To develop an AI-powered chatbot that clarifies Rwanda's Data Sharing Policy and its connection to privacy laws, improving public understanding and implementation | +|13|Ministry of Infrastructure (MININFRA) |Sixbert Shema,
Emmanuel Kayitaba | Leveraging Data for Evidence-Based Infrastructure Needs Assessment & Planning | To develop a data-driven system for automated infrastructure gap analysis and evidence-based planning, ensuring equitable resource allocation across Rwanda's districts.| +|14|National Institute of Statistics of Rwanda (NISR)| Monique Usabyimana
Donath Nkundimana
Emmanuel Hanyurineza |Prioritizing Environmental and Climate Change Statistics in National Strategic Frameworks|To develop an integrated climate and environmental data platform that enhances real-time monitoring, forecasting, and policy integration for Rwanda's green development goals.| +|15|National Institute of Statistics of Rwanda (NISR) |Fidele Ngirinshuti
Ange Umuhoza,
Didier Gaga |Job Transitions and Employment Stability in Rwanda:A Panel Data Analysis Using Labour Force Surveys |To analyze job transition patterns and employment stability in Rwanda using panel data, providing evidence-based insights for targeted labor market policies and youth/women empowerment strategies| +|16|Rwanda Energy Group (REG)|Fidele Ntawumenyumunsi |Forecasting electricity demand and optimizing distribution in national grid.|To develop a predictive model for forecasting Rwanda's electricity demand at feeder level, enabling optimized grid management and preventing power outages.| +|17|Rwanda Biomedical Center |Hassan Mugabo |Natural Language Processing for Public Health Intelligence |To develop Rwanda-specific NLP models that extract actionable public health intelligence from EMR text, enabling real-time disease surveillance and data-driven healthcare decisions| +|18|Rwanda Agriculture Board |Jacques Munyemana | Predicting crop yield using ML models: case of maize in Rwanda | To develop a machine learning model that predicts maize yields in Rwanda using weather and agricultural input data, helping farmers and policymakers optimize crop production.| +|19|Rwanda Information Society Authority (RISA) |Janvier Niyitegeka
Geofrey Karenzi
Sylvia Nzaramba
Patrice Bimenyimana|AI-Policy Chatbot|To develop an AI-powered chatbot that simplifies access to ICT policies, enhances compliance, and supports Rwanda's digital governance through user-friendly policy explanations.| +|20|Ministry of Education |Abdoul Karim Munezero |Real-Time Education Data Monitoring and Quality Feedback System|To develop a real-time education data monitoring system that improves data accuracy, detects anomalies, and provides instant feedback to enhance decision-making in Rwanda's schools.| +|21|National Institute of Statistics of Rwanda (NISR) | Thomas Nsengiyumva
Kadjura Abdurahman Shema
Jean Bosco Dusabimana |Modernizing Rwanda’s Trade Statistics System:Enhancing Data Quality and Efficiency|To modernize Rwanda's trade statistics system by developing a Python-based automated pipeline that enhances data quality, efficiency, and reporting capabilities.| +|22 |WASAC Utility |Elisa Iradukunda |Analyzing the Impact of Customer Complaints Patterns on Operational Efficiency at WASAC |The project aims to analyze customer complaint patterns at WASAC to identify operational inefficiencies and provide data-driven solutions for improving water service delivery and customer satisfaction | +|23 |Rwanda Convention Bureau (RCB) |James Rushimisha |Quantifying the Economic Impact of MICE Events Using Data Science |The project aims to develop a data-driven framework to quantify the economic impact of MICE events in Rwanda, enabling evidence-based decision-making for RCB.| + + diff --git a/docs/test.html b/docs/test.html deleted file mode 100644 index 394c08d..0000000 --- a/docs/test.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - AIMS-DSCBI Test Page - - -

Test Page for AIMS-DSCBI

-

This is a test page to check if GitHub Pages is working correctly.

- - diff --git a/docs/~$agatare-report.docx b/docs/~$agatare-report.docx new file mode 100644 index 0000000..1e00f1b Binary files /dev/null and b/docs/~$agatare-report.docx differ diff --git a/docs/~$enda for August 18.docx b/docs/~$enda for August 18.docx new file mode 100644 index 0000000..29bd5ee Binary files /dev/null and b/docs/~$enda for August 18.docx differ diff --git a/first_api.py b/first_api.py new file mode 100644 index 0000000..6a7e926 --- /dev/null +++ b/first_api.py @@ -0,0 +1,251 @@ +import os +from typing import Optional, List +import pandas as pd +import psycopg2 +from fastapi import FastAPI, Query, Path, HTTPException +from dotenv import load_dotenv + +load_dotenv() + +app = FastAPI() + +DATA_PATH = "/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/data/tmp-db-data/cells.csv" + +# 1. Static endpoint +@app.get("/") +def read_root(): + return {"message": "Welcome to my first API!"} + +# 2. Path parameter endpoint +@app.get("/greet/{name}/{city}") +def greet_person(name: str, city: str): + return {"message": f"Hello {name} from {city}!"} + +# 3. Data-serving endpoint (Rwanda sample data) +@app.get("/rwanda") +def get_rwanda_data(): + sample_data = { + "capital": "Kigali", + "population_millions": 13.8, + "official_languages": ["Kinyarwanda", "English", "French"], + "currency": "Rwandan franc (RWF)", + "famous_for": [ + "Mountain gorillas", + "Land of a Thousand Hills", + "Clean and green capital city" + ] + } + return {"rwanda_info": sample_data} + +# Sample in-memory dataset +data = [ + { + "name": "Denise", + "age": 30, + "city": "Kigali", + "country": "Rwanda", + "marital_status": "Guess", + "children": 2 + }, + { + "name": "Donald", + "age": 20, + "city": "Kigali", + "country": "Rwanda", + "marital_status": "Happily Married", + "children": 0 + } +] + + +@app.get("/trainees") +def get_trainee_info( + name: str = Query(..., description="Person's name (required)"), + marital_status: Optional[bool] = Query(False, description="Include marital status"), + age: Optional[bool] = Query(False, description="Include age"), + children: Optional[bool] = Query(False, description="Include number of children") +): + """ + Return trainee info: + - Always return name, city, and country + - If marital_status=true, include marital_status + - If age=true, include age + """ + # Find the person + person = next((p for p in data if p["name"].lower() == name.lower()), None) + print(person) + if not person: + raise HTTPException(status_code=404, detail="Person not found") + + # Base response + response = { + "name": person["name"], + "city": person["city"], + "country": person["country"] + } + + # Add optional fields + if marital_status: + response["marital_status"] = person["marital_status"] + if age: + response["age"] = person["age"] + + if children: + response["number_of_children"] = person["children"] + + return {"Trainee-Info": response} + + +# ========================================================== +# EXERCISE-1 - EDIT trainees endpoint +# ========================================================= +# add children parameter (bool) to include number of children +# if children=true, include number_of_children in response +# access the app and see the results for yourself! +# http://localhost:8000/trainees?name=Denise&marital_status=true&age=true&children=true +# http://localhost:8000/trainees?name=Donald&marital_status=true&age=true&children=true + + +# ========================================================== +# RETURNING DATA -ALL CELLS FROM CSV +# ========================================================== + +@app.get("/cells") +def list_cells(): + df = pd.read_csv(DATA_PATH) + + dict_from_pandas = df.to_dict(orient="records") + + return dict_from_pandas + + +# ========================================================== +# RETURN CELLS BY PROVINCE - PATH PARAMETER +# ========================================================= +@app.get("/cells/province/{province_name}") +def get_cells_by_province_path(province_name: str): + """ + Filter cells by province using a PATH parameter + Example: + /cells/province/Kigali + """ + df = pd.read_csv(DATA_PATH) + + filtered = df[df["province_name"].str.lower() == province_name.lower()] + + return filtered.to_dict(orient="records") + +# ========================================================== +# RETURN CELLS BY PROVINCE - QUERY PARAMETER +# ========================================================= +@app.get("/cells-by-province") +def get_cells_by_province_query( + province_name: Optional[str] = Query(None, description="Optional province filter") +): + """ + Filter cells by province using a QUERY parameter + Example: + /cells-by-province?province_name=Kigali + /cells-by-province (returns all provinces if not specified) + """ + df = pd.read_csv(DATA_PATH) + if province_name: + df = df[df["province_name"].str.lower() == province_name.lower()] + + return df.to_dict(orient="records") + +# ACCESS THE APP AND SEE THE RESULTS FOR YOURSELF! +# http://localhost:8000/cells +# http://localhost:8000/cells/province/Kigali +# http://localhost:8000/cells-by-province?province_name=Kigali + + + +# ========================================================== +# EXERCISE-2 - RETURN POPULATION BY PROVINCE +# ========================================================= +# 1. Use Path parameter to get population by province +# 2. Use Query parameter to get population by province +# Hint: use similar logic as cells by province above + + +# ========================================================== +# RETURNING DATA WITH A DATA MODEL (PYDANTIC) +# ========================================================= +from pydantic import BaseModel +from typing import Optional, List + + +# ============================================================= +# DEFINE PYDANTIC MODEL FOR CELL WHICH MATCHES CSV STRUCTURE +# ============================================================= +class Cell(BaseModel): + cell_id: str + province_name: Optional[str] = None + district_name: Optional[str] = None + sector_name: Optional[str] = None + cell_name: Optional[str] = None + + +# ============================================================= +# DEFINE ENDPOINT TO RETURN CELLS USING THE DATA MODEL +# ============================================================= +@app.get("/cells-with-data-model", response_model=List[Cell]) +def list_cells(): + df = pd.read_csv(DATA_PATH) + return df.to_dict(orient="records") + + + + +# ========================================================== +# RETURNING DATA FROM POSTGRESQL DATABASE +# ========================================================= + +# ============================================================= +# Load environment variables from .env file +# ============================================================= +load_dotenv() + +# Get database connection details from environment variables +PGHOST = os.getenv("PGHOST") +PGPORT = os.getenv("PGPORT") +PGDATABASE = os.getenv("PGDATABASE") +PGUSER = os.getenv("PGUSER") +PGPASSWORD = os.getenv("PGPASSWORD") + + +# ============================================================= +# HELPER FUNCTION TO CONNECT AND QUERY +# ============================================================= +def run_query(sql: str, params: tuple = ()): + conn = psycopg2.connect( + host=PGHOST, + port=PGPORT, + dbname=PGDATABASE, + user=PGUSER, + password=PGPASSWORD, + ) + try: + df = pd.read_sql(sql, conn, params=params) + finally: + conn.close() + return df.to_dict(orient="records") + +# ============================================================= +# ENDPOINTS (NO DATA MODEL) +# ============================================================= +@app.get("/cells-db") +def list_cells(): + """Return all rows from cells table""" + sql = "SELECT * FROM cells" + return run_query(sql) + + + +# ============================================================ +# EXERCISE-3 - RETURN POPULATION BY PROVINCE FROM DATABASE +# ============================================================ +# 1. use Path parameter to get population by province from DB +# 2. name the endpoint /population/province/{province_name} + diff --git a/hello_kigali.py b/hello_kigali.py new file mode 100644 index 0000000..749bdae --- /dev/null +++ b/hello_kigali.py @@ -0,0 +1,63 @@ +from fastapi import FastAPI, Query, Path +from typing import Optional +from datetime import datetime + + + +# Create FastAPI application +app = FastAPI( + title="Hello World API", + description="A simple API to learn FastAPI basics", + version="1.0.0" +) + + +# ========================================================== +# BASIC ENDPOINT - NO PARAMETERS- WILL SHOW "HELLO WORLD!" +# ========================================================= +@app.get("/") +def read_root(): + """Welcome message - simplest possible endpoint""" + return {"message": "Welcome to Nyagatare"} + + +# =================================================== +# ENDPOINT WITH PATH PARAMETER +# =================================================== +# This means the URL includes a variable part (here: {name}) +# Example: calling /hello/Alice will pass "Alice" as the `name` argument +@app.get("/hello/{name}") +def say_hello(name: str): + """Say hello to a specific person""" + return {"message": f"Hello {name}!"} + + +# ====================================================== +# ENDPOINT WITH QUERY PARAMETERS +# ====================================================== +# Unlike path parameters, query parameters are passed after the "?" in the URL. +# Example: /greet?name=Alice&age=25&city=Kigali +# - "name" is required (Query(...)) +# - "age" is optional (defaults to None if not provided) +# - "city" is optional with a default value of "Unknown" +@app.get("/greet") +def greet_person( + name: str = Query(..., description="Person's name"), + age: Optional[int] = Query(None, description="Person's age"), + city: Optional[str] = Query("Kigali", description="Person's city") +): + """Greet a person with optional details""" + greeting = f"Hello {name}!" + + if age: + greeting += f" You are {age} years old." + + greeting += f" You're from {city}." + + return { + "greeting": greeting, + "name": name, + "age": age, + "city": city, + "timestamp": datetime.now().isoformat() + } \ No newline at end of file diff --git a/imghdr.py b/imghdr.py deleted file mode 100644 index d7327ef..0000000 --- a/imghdr.py +++ /dev/null @@ -1,59 +0,0 @@ -# Mock imghdr module for compatibility with Python 3.13 and older Sphinx versions - -def what(file, h=None): - """Dummy implementation that always returns None""" - return None - -def test_jpeg(h, f=None): - """Dummy implementation""" - return None - -def test_png(h, f=None): - """Dummy implementation""" - return None - -def test_gif(h, f=None): - """Dummy implementation""" - return None - -def test_tiff(h, f=None): - """Dummy implementation""" - return None - -def test_rgb(h, f=None): - """Dummy implementation""" - return None - -def test_pbm(h, f=None): - """Dummy implementation""" - return None - -def test_pgm(h, f=None): - """Dummy implementation""" - return None - -def test_ppm(h, f=None): - """Dummy implementation""" - return None - -def test_rast(h, f=None): - """Dummy implementation""" - return None - -def test_xbm(h, f=None): - """Dummy implementation""" - return None - -def test_bmp(h, f=None): - """Dummy implementation""" - return None - -def test_webp(h, f=None): - """Dummy implementation""" - return None - -def test_exr(h, f=None): - """Dummy implementation""" - return None - -tests = [] diff --git a/index.html b/index.html deleted file mode 100644 index 30021cd..0000000 --- a/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - AIMS-DSCBI - - - -

Redirecting to the Jupyter Book...

- - diff --git a/notebooks/assignments/mod1-assignment-1-solutions.ipynb b/notebooks/assignments/assignment-1-solutions.ipynb similarity index 65% rename from notebooks/assignments/mod1-assignment-1-solutions.ipynb rename to notebooks/assignments/assignment-1-solutions.ipynb index ec3cdcc..45bd771 100644 --- a/notebooks/assignments/mod1-assignment-1-solutions.ipynb +++ b/notebooks/assignments/assignment-1-solutions.ipynb @@ -5,7 +5,7 @@ "id": "2baaa681-e813-428b-9010-4508b7291011", "metadata": {}, "source": [ - "# Programming Assignment-1\n", + "# Solutions-Programming Assignment\n", "## Estimating Chichewa Speakers\n", "### Background\n", "This notebook provides statistics about the language of **Chichewa**. \n", @@ -40,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 13, "id": "a4c711fb-9980-4380-8d2d-52efec126354", "metadata": {}, "outputs": [], @@ -66,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 14, "id": "ba8273ba", "metadata": {}, "outputs": [], @@ -92,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 15, "id": "75745171-00ac-413f-9a16-478adde8220c", "metadata": { "jupyter": { @@ -146,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 16, "id": "1d0a1b4d-0d69-4551-8dad-621671df2e62", "metadata": {}, "outputs": [ @@ -184,7 +184,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 17, "id": "41676bac-8889-4ec3-9c5c-a88132e304d3", "metadata": { "jupyter": { @@ -223,10 +223,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "id": "f29a54e5-4e0a-4f46-9680-aab39315c440", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: '/Users/dmatekenya/Library/CloudStorage/GoogleDrive-dmatekenya@gmail.com/My Drive/TEACHING/AIMS-DSCBI/data/population/malawi-ea-population.csv'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[18], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# Get population by district for Malawi\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m df_pop_ea \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mread_csv(FILE_POP_MW)\n\u001b[1;32m 3\u001b[0m df_dist \u001b[38;5;241m=\u001b[39m df_pop_ea\u001b[38;5;241m.\u001b[39mgroupby(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mDIST_NAME\u001b[39m\u001b[38;5;124m'\u001b[39m)[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mTOTAL_POP\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39msum()\u001b[38;5;241m.\u001b[39mreset_index()\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1026\u001b[0m, in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[1;32m 1013\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[1;32m 1014\u001b[0m dialect,\n\u001b[1;32m 1015\u001b[0m delimiter,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1022\u001b[0m dtype_backend\u001b[38;5;241m=\u001b[39mdtype_backend,\n\u001b[1;32m 1023\u001b[0m )\n\u001b[1;32m 1024\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[0;32m-> 1026\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _read(filepath_or_buffer, kwds)\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:620\u001b[0m, in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 617\u001b[0m _validate_names(kwds\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[1;32m 619\u001b[0m \u001b[38;5;66;03m# Create the parser.\u001b[39;00m\n\u001b[0;32m--> 620\u001b[0m parser \u001b[38;5;241m=\u001b[39m TextFileReader(filepath_or_buffer, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwds)\n\u001b[1;32m 622\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chunksize \u001b[38;5;129;01mor\u001b[39;00m iterator:\n\u001b[1;32m 623\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parser\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1620\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 1617\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 1619\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles: IOHandles \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m-> 1620\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_make_engine(f, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mengine)\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1880\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[0;34m(self, f, engine)\u001b[0m\n\u001b[1;32m 1878\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m mode:\n\u001b[1;32m 1879\u001b[0m mode \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m-> 1880\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;241m=\u001b[39m get_handle(\n\u001b[1;32m 1881\u001b[0m f,\n\u001b[1;32m 1882\u001b[0m mode,\n\u001b[1;32m 1883\u001b[0m encoding\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mencoding\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[1;32m 1884\u001b[0m compression\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcompression\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[1;32m 1885\u001b[0m memory_map\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmemory_map\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mFalse\u001b[39;00m),\n\u001b[1;32m 1886\u001b[0m is_text\u001b[38;5;241m=\u001b[39mis_text,\n\u001b[1;32m 1887\u001b[0m errors\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mencoding_errors\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstrict\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[1;32m 1888\u001b[0m storage_options\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstorage_options\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[1;32m 1889\u001b[0m )\n\u001b[1;32m 1890\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 1891\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles\u001b[38;5;241m.\u001b[39mhandle\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.13/site-packages/pandas/io/common.py:873\u001b[0m, in \u001b[0;36mget_handle\u001b[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[1;32m 868\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(handle, \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m 869\u001b[0m \u001b[38;5;66;03m# Check whether the filename is to be opened in binary mode.\u001b[39;00m\n\u001b[1;32m 870\u001b[0m \u001b[38;5;66;03m# Binary mode does not support 'encoding' and 'newline'.\u001b[39;00m\n\u001b[1;32m 871\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mencoding \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mmode:\n\u001b[1;32m 872\u001b[0m \u001b[38;5;66;03m# Encoding\u001b[39;00m\n\u001b[0;32m--> 873\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(\n\u001b[1;32m 874\u001b[0m handle,\n\u001b[1;32m 875\u001b[0m ioargs\u001b[38;5;241m.\u001b[39mmode,\n\u001b[1;32m 876\u001b[0m encoding\u001b[38;5;241m=\u001b[39mioargs\u001b[38;5;241m.\u001b[39mencoding,\n\u001b[1;32m 877\u001b[0m errors\u001b[38;5;241m=\u001b[39merrors,\n\u001b[1;32m 878\u001b[0m newline\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 879\u001b[0m )\n\u001b[1;32m 880\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 881\u001b[0m \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[1;32m 882\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(handle, ioargs\u001b[38;5;241m.\u001b[39mmode)\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/Users/dmatekenya/Library/CloudStorage/GoogleDrive-dmatekenya@gmail.com/My Drive/TEACHING/AIMS-DSCBI/data/population/malawi-ea-population.csv'" + ] + } + ], "source": [ " # Get population by district for Malawi\n", " df_pop_ea = pd.read_csv(FILE_POP_MW)\n", @@ -235,7 +252,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": null, "id": "d2bc244a", "metadata": {}, "outputs": [ @@ -387,7 +404,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": null, "id": "b59c10a9", "metadata": {}, "outputs": [ @@ -430,7 +447,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.7" + "version": "3.13.5" } }, "nbformat": 4, diff --git a/notebooks/assignments/mod1-assignment-1.ipynb b/notebooks/assignments/assignment-1.ipynb similarity index 100% rename from notebooks/assignments/mod1-assignment-1.ipynb rename to notebooks/assignments/assignment-1.ipynb diff --git a/notebooks/assignments/assignment-2-solutions.ipynb b/notebooks/assignments/assignment-2-solutions.ipynb new file mode 100644 index 0000000..efc2070 --- /dev/null +++ b/notebooks/assignments/assignment-2-solutions.ipynb @@ -0,0 +1,3087 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2baaa681-e813-428b-9010-4508b7291011", + "metadata": {}, + "source": [ + "# Programming Assignment-2\n", + "The goal of this assingment is to allow you to practice several the following things in Python:\n", + "1. Perfoming typical data processing (or preprocessing if you prefer). This includes all the typical data wraning such as creating news variables, combining several datasets and more \n", + "2. Running explolatory data analysis including basic plotting of variables \n", + "3. Perfoming basic inferential statisticals using statsmodels and scipy to run hypythesis testing and build simple statistial or econometric models.\n", + "\n", + "## Datasets \n", + "For this assignment, you will use the following datasets:\n", + "### Rwanda Health Indicators\n", + "The Excel file was generated by combining multiple CSV files, each containing data on different health indicators for Rwanda, So that each sheet in the file represent one such indicator. See below some of the input files which were used:\n", + "- `access-to-health-care_subnational_rwa`\n", + "- `child-mortality-rates_subnational_rwa`\n", + "- `dhs-mobile_subnational_rwa`\n", + "\n", + "You can download the dataset from [here](https://docs.google.com/spreadsheets/d/1uvTQYS22VfXXo1Hwkm1frFx_bKkLQkcf/edit?usp=share_link&ouid=113302179168925233984&rtpof=true&sd=true).\n", + "### Nights lights Data\n", + "- Please download it [here](https://drive.google.com/file/d/1f_4fiqxIejly0YmC088s9bxOfrABv9Sz/view?usp=sharing) and check the documentation in the cells below. \n", + "\n", + "### Popupation Dataset\n", + "- Please download it [here](https://drive.google.com/file/d/1FWEFGdN-xDuFH1jmt0hr4F8Xc3Y5XzvB/view?usp=share_link) and check the documentation and metadata in the class notebooks.\n", + "\n", + "\n", + "## Submission Guidelines \n", + "- Please guidelines and complete all steps in the [GitHub Workflow](https://dmatekenya.github.io/AIMS-DSCBI/course-requirements/github-workflow.html)\n", + "- Once you have completed your assignment, push chanegs to your repository.\n", + "- Send a link (copy from within GitHub) to your notebook to the tutors/teaching assistants\n" + ] + }, + { + "cell_type": "markdown", + "id": "1a0961aa", + "metadata": {}, + "source": [ + "# Import Required Packages" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "30d3cb64", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "import pandas as pd\n", + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "import seaborn as sns\n", + "import statsmodels.api as sm" + ] + }, + { + "cell_type": "markdown", + "id": "cbb0234e", + "metadata": {}, + "source": [ + "# Setup Input Folders\n", + "\n", + "As usual, it is good practice to set up input folders using the [`pathlib`](https://docs.python.org/3/library/pathlib.html) package. In this section, make sure to define the folders where your data is stored on your machine.\n", + "\n", + "I find it helpful to set up the working directory and input data folders right at the start of the notebook. To keep things organized, I use the naming convention: `FILE_{NAME}` for files and `DIR_{NAME}` for folders. We use capital letters because these are global variables that will be referenced throughout the notebook.\n", + "\n", + "We'll be using the [`pathlib`](https://docs.python.org/3/library/pathlib.html) library, which offers several advantages over traditional string-based path handling:\n", + "\n", + "- **Cross-platform compatibility** - automatically handles path separators (`/` vs `\\`) across different operating systems\n", + "- **Object-oriented approach** - paths are objects with useful methods rather than strings\n", + "- **Intuitive syntax** - use `/` operator to join paths naturally: `parent_dir / \"subfolder\" / \"file.txt\"`\n", + "- **Built-in path operations** - methods like `.exists()`, `.is_file()`, `.parent`, `.stem`, and `.suffix`\n", + "- **Safer path manipulation** - reduces errors from manual string concatenation and splitting\n", + "\n", + "This is the recommended approach for managing file paths in modern Python development.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ba8273ba", + "metadata": {}, + "outputs": [], + "source": [ + "# Uncomment the following lines and add your code to define the directories and files\n", + "DIR_DATA = Path.cwd().parents[1].joinpath(\"data\")\n", + "FILE_EXCEL = DIR_DATA/\"rwanda/RW-Health-Data.xlsx\"\n", + "\n", + "# Population by enumeration area (EA) for Rwanda\n", + "FILE_CELL_POP_RW = DIR_DATA/\"population-demography/rwa-cell-pop.csv\"\n", + "\n", + "# Nightlight data for Rwanda\n", + "FILE_CELL_NTL_RW = DIR_DATA/\"ntl/cell-ntl-2015-2020-2024.csv\"\n" + ] + }, + { + "cell_type": "markdown", + "id": "e49528b3", + "metadata": {}, + "source": [ + "# Part 1: Processing Excel Files [40 Points]\n", + "The primary goal is to preprocess an [Excel file](https://docs.google.com/spreadsheets/d/1uvTQYS22VfXXo1Hwkm1frFx_bKkLQkcf/edit?usp=share_link&ouid=113302179168925233984&rtpof=true&sd=true) with multiple sheets into a unified CSV dataset that consolidates multiple indicators. Having all indicators in a single file at the same analytical unit (national, subnational) is more efficient than managing separate files and enables easier cross-indicator analysis.\n", + "\n", + "## Task 1: Generate National-Level Summaries\n", + "\n", + "For each indicator, compute a single national-level value using appropriate aggregation functions such as **mean**, **sum** or **count**. For this one, all available indicators can be summarized at national level, so we will have a CSV file with one row and \n", + "\n", + "### Expected Output Structure\n", + "1. **DataFrame display** in Jupyter Notebook\n", + "2. **CSV file** with columns:\n", + "- `indicator_name`: Name of the indicator\n", + "- `aggregated_value`: Computed national value\n", + "- `indicator_year`: Survey year or something similar\n", + "- `survey_name`: Name of the survey where information is coming from\n", + "- `aggregation_method`: Statistical method used (optional)\n", + "\n", + "## Task 2: Subnational-Level Indicator Dataset\n", + "\n", + "Create a merged dataset for indicators with subnational data (ADM2/ADM3 levels), ensuring spatial alignment and consistent administrative boundaries.\n", + "\n", + "### Expected Output Structure\n", + " - `indicator_name`: Name of the indicator\n", + " - `aggregated_value`: Computed national value\n", + " - `indicator_year`: Survey year or something similar\n", + " - `survey_name`: Name of the survey where information is coming from\n", + " - `aggregation_method`: Statistical method used (optional)\n", + "\n", + "This structure enables both single-indicator and multi-indicator analysis at the subnational level." + ] + }, + { + "cell_type": "markdown", + "id": "8fc2d99d", + "metadata": {}, + "source": [ + "## Task-1: National Level Indicators \n", + "The process to generate national summaries is fairly straigtfoward because all we need is to generate naitonal averages for each indicator. However, for the processing, we need to make sure that for each indicator, we aggregate values from the same year. This is the process I follow:\n", + "\n", + "This process extracts national-level health indicators from an Excel file containing multiple sheets, each representing a different indicator. For each sheet, it removes the first row (which does not contain data), keeps only the relevant columns, and calculates the national average for each indicator and survey year. The results from all sheets are combined into a single summary table, which is then saved as a CSV file for further analysis. This approach ensures that all national-level indicator values are consistently aggregated and organized in one place.\n", + "\n", + "To make our code neat,we define a function which does the processing above and saves a CSV file." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "071f49a4", + "metadata": {}, + "outputs": [], + "source": [ + "# =====================================================\n", + "# LOAD EXCEL FILE AND CHECK SHEET NAMES\n", + "# ======================================================\n", + "# Get all sheet names\n", + "sheet_names = pd.ExcelFile(FILE_EXCEL).sheet_names\n", + "\n", + "# After manually reviewing columns, we only keep these \n", + "# columns\n", + "COLS_TO_KEEP = ['CountryName', 'ISO3', 'Location', 'Indicator', 'Value',\n", + " 'SurveyYear', 'SurveyId','SurveyYearLabel']\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "45c11551", + "metadata": {}, + "outputs": [], + "source": [ + "def extract_national_indicators(excel_path):\n", + " \"\"\"\n", + " Extract national level indicators from an Excel file with multiple sheets.\n", + " \n", + " Parameters:\n", + " -----------\n", + " excel_path : Path or str\n", + " Path to the Excel file containing health indicator data\n", + " \n", + " Returns:\n", + " --------\n", + " pandas.DataFrame\n", + " DataFrame containing national level indicators\n", + " \"\"\"\n", + " # Get all sheet names\n", + " sheet_names = pd.ExcelFile(excel_path).sheet_names\n", + " \n", + " # Initialize a list to store national level indicators\n", + " national_indicators = []\n", + "\n", + " # Loop through each sheet\n", + " for sheet in sheet_names:\n", + " # Read the sheet\n", + " df = pd.read_excel(excel_path, sheet_name=sheet)\n", + "\n", + " # Drop the first row (which typically contains metadata) and reset index\n", + " df = df.iloc[1:].reset_index(drop=True)\n", + " \n", + " # Keep only the specified columns if they exist\n", + " if all(col in df.columns for col in COLS_TO_KEEP):\n", + " df = df[COLS_TO_KEEP]\n", + " else:\n", + " # Skip sheets that don't have the expected columns\n", + " print(f\"Skipping sheet {sheet} due to missing expected columns\")\n", + " continue\n", + " \n", + " # Convert Value column to numeric (will convert errors to NaN)\n", + " df['Value'] = pd.to_numeric(df['Value'], errors='coerce')\n", + " \n", + " # Group by Indicator and SurveyYear to calculate national averages\n", + " grouped = df.groupby(['Indicator', 'SurveyYear']).agg({\n", + " 'Value': 'mean',\n", + " 'SurveyId': 'first',\n", + " 'SurveyYearLabel': 'first'\n", + " }).reset_index()\n", + " \n", + " # Add the national indicators to our list\n", + " for _, row in grouped.iterrows():\n", + " national_indicators.append({\n", + " 'indicator_name': row['Indicator'],\n", + " 'aggregated_value': row['Value'],\n", + " 'indicator_year': row['SurveyYear'],\n", + " 'survey_name': row['SurveyId'],\n", + " 'survey_year_label': row['SurveyYearLabel'],\n", + " 'aggregation_method': 'mean',\n", + " 'source_sheet': sheet\n", + " })\n", + "\n", + " # Create a DataFrame from the list\n", + " national_df = pd.DataFrame(national_indicators)\n", + " \n", + " return national_df" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "397da317", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total national indicators created: 1850\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
indicator_nameaggregated_valueindicator_yearsurvey_namesurvey_year_labelaggregation_methodsource_sheet
0Accepting attitudes towards those living with ...48.6600002005RW2005DHS2005meandhs-mobile_subnational_rwa
1Accepting attitudes towards those living with ...64.2600002010RW2010DHS2010meandhs-mobile_subnational_rwa
2Accepting attitudes towards those living with ...62.8200002015RW2015DHS2014-15meandhs-mobile_subnational_rwa
3Accepting attitudes towards those living with ...47.5200002005RW2005DHS2005meandhs-mobile_subnational_rwa
4Accepting attitudes towards those living with ...52.8400002010RW2010DHS2010meandhs-mobile_subnational_rwa
5Accepting attitudes towards those living with ...49.2600002015RW2015DHS2014-15meandhs-mobile_subnational_rwa
6Antenatal care from a skilled provider93.6880951992RW1992DHS1992meandhs-mobile_subnational_rwa
7Antenatal care from a skilled provider92.3980392000RW2000DHS2000meandhs-mobile_subnational_rwa
8Antenatal care from a skilled provider94.3133332005RW2005DHS2005meandhs-mobile_subnational_rwa
9Antenatal care from a skilled provider95.9133332008RW2008DHS2007-08meandhs-mobile_subnational_rwa
\n", + "
" + ], + "text/plain": [ + " indicator_name aggregated_value \\\n", + "0 Accepting attitudes towards those living with ... 48.660000 \n", + "1 Accepting attitudes towards those living with ... 64.260000 \n", + "2 Accepting attitudes towards those living with ... 62.820000 \n", + "3 Accepting attitudes towards those living with ... 47.520000 \n", + "4 Accepting attitudes towards those living with ... 52.840000 \n", + "5 Accepting attitudes towards those living with ... 49.260000 \n", + "6 Antenatal care from a skilled provider 93.688095 \n", + "7 Antenatal care from a skilled provider 92.398039 \n", + "8 Antenatal care from a skilled provider 94.313333 \n", + "9 Antenatal care from a skilled provider 95.913333 \n", + "\n", + " indicator_year survey_name survey_year_label aggregation_method \\\n", + "0 2005 RW2005DHS 2005 mean \n", + "1 2010 RW2010DHS 2010 mean \n", + "2 2015 RW2015DHS 2014-15 mean \n", + "3 2005 RW2005DHS 2005 mean \n", + "4 2010 RW2010DHS 2010 mean \n", + "5 2015 RW2015DHS 2014-15 mean \n", + "6 1992 RW1992DHS 1992 mean \n", + "7 2000 RW2000DHS 2000 mean \n", + "8 2005 RW2005DHS 2005 mean \n", + "9 2008 RW2008DHS 2007-08 mean \n", + "\n", + " source_sheet \n", + "0 dhs-mobile_subnational_rwa \n", + "1 dhs-mobile_subnational_rwa \n", + "2 dhs-mobile_subnational_rwa \n", + "3 dhs-mobile_subnational_rwa \n", + "4 dhs-mobile_subnational_rwa \n", + "5 dhs-mobile_subnational_rwa \n", + "6 dhs-mobile_subnational_rwa \n", + "7 dhs-mobile_subnational_rwa \n", + "8 dhs-mobile_subnational_rwa \n", + "9 dhs-mobile_subnational_rwa " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saved national indicators to /Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/data/rwanda/national_indicators.csv\n" + ] + } + ], + "source": [ + "# ==========================================================\n", + "# CALL THE FUNCTION\n", + "# ==========================================================\n", + "# Extract the national indicators\n", + "df_rw = extract_national_indicators(FILE_EXCEL)\n", + "\n", + "# Display the first few rows\n", + "print(f\"Total national indicators created: {len(df_rw)}\")\n", + "display(df_rw.head(10))\n", + "\n", + "# Save to CSV\n", + "output_path = DIR_DATA / \"rwanda/national_indicators.csv\"\n", + "df_rw.to_csv(output_path, index=False)\n", + "print(f\"Saved national indicators to {output_path}\")" + ] + }, + { + "cell_type": "markdown", + "id": "f4cf1f37", + "metadata": {}, + "source": [ + "
\n", + "

📝 Marking Notes for Part-1-Task-1

\n", + "
    \n", + "
  • Total Points: 15
  • \n", + "
  • You can decide how to assign points
  • \n", + "
  • Someone gets full points if they have code and they have displayed the dataframe above in their notebook
  • \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "14a63a14", + "metadata": {}, + "source": [ + "## Task-2: Subnational Indicators\n", + "\n", + "To create a comprehensive subnational indicator dataset, we first need to understand which indicators are available at the district (ADM2) level. Rwanda has 30 districts, so we'll focus on sheets that contain data with approximately this number of unique locations.\n", + "\n", + "Our approach involves:\n", + "\n", + "1. Examining the data structure to identify which indicators are available at district level\n", + "2. Extracting these indicators while preserving their spatial and temporal context\n", + "3. Standardizing the district names to ensure consistent spatial referencing\n", + "4. Creating a unified dataset that allows for both single-indicator and cross-indicator analysis\n", + "\n", + "This process is more complex than the national-level aggregation because we need to maintain the spatial dimension and ensure proper alignment across indicators collected in different years or from different surveys. The function below implements this extraction logic, filtering for sheets that contain district-level data.\n", + "\n", + "For manual inspection of variables, I used something like this:\n", + "```sheet_names = pd.ExcelFile(FILE_EXCEL).sheet_names\n", + "df = pd.read_excel(FILE_EXCEL, sheet_name=sheet_names[0])\n", + "\n", + "# Pick indicator to work with \n", + "df_indicator = df.query('Indicator == \"Women who want no more children\"')\n", + "yrs = df_indicator.SurveyYear.unique()\n", + "\n", + "# Unique Locations for each survey year\n", + "locations = {yr: len(df_indicator.query('SurveyYear == @yr').Location.unique()) for yr in yrs} \n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d08b7742", + "metadata": {}, + "outputs": [], + "source": [ + "def extract_adm2_indicators(excel_path):\n", + " \"\"\"\n", + " Extract indicators available at ADM2 (district) level from an Excel file with multiple sheets.\n", + " This function checks for district-level granularity at the indicator and year level,\n", + " rather than just at the sheet level.\n", + "\n", + " Parameters:\n", + " -----------\n", + " excel_path : Path or str\n", + " Path to the Excel file containing health indicator data\n", + "\n", + " Returns:\n", + " --------\n", + " pandas.DataFrame\n", + " DataFrame containing ADM2-level indicators\n", + " \"\"\"\n", + " # Get all sheet names\n", + " sheet_names = pd.ExcelFile(excel_path).sheet_names\n", + "\n", + " # Initialize a list to store ADM2 indicators\n", + " adm2_indicators = []\n", + "\n", + " # Loop through each sheet\n", + " for sheet in sheet_names:\n", + " try:\n", + " # Read the sheet\n", + " df = pd.read_excel(excel_path, sheet_name=sheet)\n", + "\n", + " # Drop the first row (which typically contains metadata) and reset index\n", + " df = df.iloc[1:].reset_index(drop=True)\n", + "\n", + " # Keep only the specified columns if they exist\n", + " if all(col in df.columns for col in COLS_TO_KEEP):\n", + " df = df[COLS_TO_KEEP]\n", + " else:\n", + " print(f\"Skipping sheet {sheet} due to missing expected columns\")\n", + " continue\n", + "\n", + " # Convert Value column to numeric\n", + " df['Value'] = pd.to_numeric(df['Value'], errors='coerce')\n", + "\n", + " # Process by indicator and year combination to check for district-level data\n", + " for (indicator, year), group in df.groupby(['Indicator', 'SurveyYear']):\n", + " unique_locs = group['Location'].dropna().unique()\n", + " \n", + " # Check if this indicator-year combination has district-level data\n", + " # Rwanda has 30 districts, but we'll accept 6-35 to account for potential changes\n", + " # or different naming conventions\n", + " if 6 <= len(unique_locs) <= 35:\n", + " # Group by Location to get district-level means\n", + " for _, row in group.groupby('Location').agg({\n", + " 'Value': 'mean',\n", + " 'SurveyId': 'first',\n", + " 'SurveyYearLabel': 'first'\n", + " }).reset_index().iterrows():\n", + " adm2_indicators.append({\n", + " 'indicator_name': indicator,\n", + " 'district': row['Location'],\n", + " 'aggregated_value': row['Value'],\n", + " 'indicator_year': year,\n", + " 'survey_name': row['SurveyId'],\n", + " 'survey_year_label': row['SurveyYearLabel'],\n", + " 'aggregation_method': 'mean',\n", + " 'source_sheet': sheet\n", + " })\n", + " else:\n", + " print(f\"Skipping indicator '{indicator}' for year {year} - not at district level (found {len(unique_locs)} unique locations)\")\n", + " \n", + " except Exception as e:\n", + " print(f\"Error processing sheet {sheet}: {e}\")\n", + "\n", + " # Create a DataFrame from the list\n", + " adm2_df = pd.DataFrame(adm2_indicators)\n", + " \n", + " # Add district count per indicator-year combination for validation\n", + " if not adm2_df.empty:\n", + " district_counts = adm2_df.groupby(['indicator_name', 'indicator_year']).size().reset_index(name='district_count')\n", + " print(f\"Created dataset with {len(adm2_df)} rows across {len(district_counts)} indicator-year combinations\")\n", + " else:\n", + " print(\"No district-level indicators found\")\n", + "\n", + " return adm2_df" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "01e15268", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Skipping indicator 'Accepting attitudes towards those living with HIV - Composite of 4 components [Men]' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Accepting attitudes towards those living with HIV - Composite of 4 components [Men]' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Accepting attitudes towards those living with HIV - Composite of 4 components [Men]' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Accepting attitudes towards those living with HIV - Composite of 4 components [Women]' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Accepting attitudes towards those living with HIV - Composite of 4 components [Women]' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Accepting attitudes towards those living with HIV - Composite of 4 components [Women]' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care from a skilled provider' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care from a skilled provider' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care from a skilled provider' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care from a skilled provider' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care from a skilled provider' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care from a skilled provider' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care from a skilled provider' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal visits for pregnancy: 4+ visits' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal visits for pregnancy: 4+ visits' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal visits for pregnancy: 4+ visits' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal visits for pregnancy: 4+ visits' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal visits for pregnancy: 4+ visits' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery from a skilled provider' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery from a skilled provider' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery from a skilled provider' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery from a skilled provider' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery from a skilled provider' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'BCG vaccination received' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'BCG vaccination received' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'BCG vaccination received' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'BCG vaccination received' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'BCG vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Breastfed children 6-23 months fed both 4+ food groups and the minimum meal frequency' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Breastfed children 6-23 months fed both 4+ food groups and the minimum meal frequency' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Breastfed children 6-23 months fed both 4+ food groups and the minimum meal frequency' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child mortality rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child mortality rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child mortality rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child mortality rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child mortality rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children 6-23 months that consumed foods rich in iron in the last 24 hours' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children 6-23 months that consumed foods rich in iron in the last 24 hours' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children 6-23 months that consumed foods rich in iron in the last 24 hours' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children 6-23 months that consumed foods rich in vitamin A in the last 24 hours' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children 6-23 months that consumed foods rich in vitamin A in the last 24 hours' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children 6-23 months that consumed foods rich in vitamin A in the last 24 hours' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children 6-23 months with 3 IYCF practices' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children 6-23 months with 3 IYCF practices' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children 6-23 months with 3 IYCF practices' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children consuming vitamin A supplements' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children consuming vitamin A supplements' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children consuming vitamin A supplements' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children consuming vitamin A supplements' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children registered' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children registered' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children registered' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children registered' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children stunted' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children stunted' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children stunted' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children stunted' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children under 5 who slept under an insecticide-treated net (ITN)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children under 5 who slept under an insecticide-treated net (ITN)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children under 5 who slept under an insecticide-treated net (ITN)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children under 5 who slept under an insecticide-treated net (ITN)' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children under 5 who slept under an insecticide-treated net (ITN)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children under 5 who slept under an insecticide-treated net (ITN)' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children under 5 who slept under an insecticide-treated net (ITN)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children underweight' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children underweight' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children underweight' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children underweight' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children wasted' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children wasted' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children wasted' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children wasted' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children who took any ACT' for year 2010 - not at district level (found 3 unique locations)\n", + "Skipping indicator 'Children who took any ACT' for year 2013 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Children who took any ACT' for year 2015 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Children who took any ACT' for year 2017 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Children who took any ACT' for year 2019 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2019 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Children with any anemia' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with any anemia' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with any anemia' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with any anemia' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with any anemia' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with diarrhea' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with diarrhea' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with diarrhea' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with diarrhea' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with diarrhea' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever for whom advice or treatment was sought' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever for whom advice or treatment was sought' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever for whom advice or treatment was sought' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever for whom advice or treatment was sought' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever for whom advice or treatment was sought' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever for whom advice or treatment was sought' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever for whom advice or treatment was sought' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever in the last two weeks' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever in the last two weeks' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever in the last two weeks' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever in the last two weeks' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever in the last two weeks' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever in the last two weeks' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever in the last two weeks' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever who had blood taken from a finger or heel for testing' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever who had blood taken from a finger or heel for testing' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever who had blood taken from a finger or heel for testing' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever who had blood taken from a finger or heel for testing' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever who had blood taken from a finger or heel for testing' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with hemoglobin lower than 8.0 g/dl' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with hemoglobin lower than 8.0 g/dl' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with hemoglobin lower than 8.0 g/dl' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with hemoglobin lower than 8.0 g/dl' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with hemoglobin lower than 8.0 g/dl' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Comprehensive correct knowledge about AIDS [Men]' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Comprehensive correct knowledge about AIDS [Men]' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Comprehensive correct knowledge about AIDS [Men]' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Comprehensive correct knowledge about AIDS [Men]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Comprehensive correct knowledge about AIDS [Women]' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Comprehensive correct knowledge about AIDS [Women]' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Comprehensive correct knowledge about AIDS [Women]' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Comprehensive correct knowledge about AIDS [Women]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Condom use during higher-risk sex (with multiple partners) [Men]' for year 2005 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Condom use during higher-risk sex (with multiple partners) [Men]' for year 2010 - not at district level (found 4 unique locations)\n", + "Skipping indicator 'Condom use during higher-risk sex (with multiple partners) [Men]' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Condom use during higher-risk sex (with multiple partners) [Men]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Condom use during higher-risk sex (with multiple partners) [Women]' for year 2015 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Condom use during higher-risk sex (with multiple partners) [Women]' for year 2019 - not at district level (found 4 unique locations)\n", + "Skipping indicator 'DPT 3 vaccination received' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 3 vaccination received' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 3 vaccination received' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 3 vaccination received' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 3 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Delivery by cesarean section' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Delivery by cesarean section' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Delivery by cesarean section' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Delivery by cesarean section' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied by modern methods' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied by modern methods' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied by modern methods' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied by modern methods' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied by modern methods' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Ever experienced physical violence since age 15' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Ever experienced physical violence since age 15' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Ever experienced physical violence since age 15' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Ever experienced physical violence since age 15' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Feeding practices during diarrhea: Continued feeding, and ORT and/or increased fluids' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Feeding practices during diarrhea: Continued feeding, and ORT and/or increased fluids' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Feeding practices during diarrhea: Continued feeding, and ORT and/or increased fluids' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Feeding practices during diarrhea: Continued feeding, and ORT and/or increased fluids' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Feeding practices during diarrhea: Continued feeding, and ORT and/or increased fluids' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Feeding practices during diarrhea: ORT and continued feeding' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Feeding practices during diarrhea: ORT and continued feeding' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Feeding practices during diarrhea: ORT and continued feeding' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Feeding practices during diarrhea: ORT and continued feeding' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Feeding practices during diarrhea: ORT and continued feeding' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Gender parity index for net primary school attendance' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Gender parity index for net primary school attendance' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Gender parity index for net primary school attendance' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Gender parity index for net secondary school attendance' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Gender parity index for net secondary school attendance' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Gender parity index for net secondary school attendance' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'General fertility rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'General fertility rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'General fertility rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'General fertility rate' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'General fertility rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'General fertility rate' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'General fertility rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among general population' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among general population' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among general population' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among men' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among men' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among men' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among women' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among women' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among women' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with at least one insecticide-treated mosquito net (ITN)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with at least one insecticide-treated mosquito net (ITN)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with at least one insecticide-treated mosquito net (ITN)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with at least one insecticide-treated mosquito net (ITN)' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with at least one insecticide-treated mosquito net (ITN)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with at least one insecticide-treated mosquito net (ITN)' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with at least one insecticide-treated mosquito net (ITN)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with at least one insecticide-treated mosquito net (ITN) for every two persons who stayed in the household the previous night' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with at least one insecticide-treated mosquito net (ITN) for every two persons who stayed in the household the previous night' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with at least one insecticide-treated mosquito net (ITN) for every two persons who stayed in the household the previous night' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with at least one insecticide-treated mosquito net (ITN) for every two persons who stayed in the household the previous night' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with at least one insecticide-treated mosquito net (ITN) for every two persons who stayed in the household the previous night' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with at least one insecticide-treated mosquito net (ITN) for every two persons who stayed in the household the previous night' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with at least one insecticide-treated mosquito net (ITN) for every two persons who stayed in the household the previous night' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with electricity' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with electricity' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with electricity' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with electricity' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with electricity' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with electricity' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with electricity' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with iodized salt' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with iodized salt' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with iodized salt' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of prevention of mother to child transmission of HIV [Men]' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of prevention of mother to child transmission of HIV [Men]' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of prevention of mother to child transmission of HIV [Men]' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of prevention of mother to child transmission of HIV [Men]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of prevention of mother to child transmission of HIV [Women]' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of prevention of mother to child transmission of HIV [Women]' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of prevention of mother to child transmission of HIV [Women]' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of prevention of mother to child transmission of HIV [Women]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Malaria prevalence according to RDT' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Malaria prevalence according to RDT' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Malaria prevalence according to RDT' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Malaria prevalence according to RDT' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Malaria prevalence according to microscopy' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Malaria prevalence according to microscopy' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Malaria prevalence according to microscopy' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Malaria prevalence according to microscopy' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any method of contraception' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any method of contraception' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any method of contraception' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any method of contraception' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any method of contraception' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any modern method of contraception' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any modern method of contraception' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any modern method of contraception' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any modern method of contraception' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any modern method of contraception' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean Body Mass Index (BMI) for women' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean Body Mass Index (BMI) for women' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean Body Mass Index (BMI) for women' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean Body Mass Index (BMI) for women' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean ideal number of children for all women' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean ideal number of children for all women' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean ideal number of children for all women' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean ideal number of children for all women' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean ideal number of children for all women' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Measles vaccination received' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Measles vaccination received' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Measles vaccination received' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Measles vaccination received' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Measles vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first birth for women age 25-49' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first birth for women age 25-49' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first birth for women age 25-49' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first birth for women age 25-49' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first birth for women age 25-49' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 25-49(54,59)' for year 2005 - not at district level (found 3 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 25-49(54,59)' for year 2010 - not at district level (found 3 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 25-49(54,59)' for year 2015 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 25-49(54,59)' for year 2019 - not at district level (found 1 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Women]: 25-49' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Women]: 25-49' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Women]: 25-49' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Women]: 25-49' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 25-49(54,59)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 25-49(54,59)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 25-49(54,59)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 25-49(54,59)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Women]: 25-49' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Women]: 25-49' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Women]: 25-49' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Women]: 25-49' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of any breastfeeding' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of any breastfeeding' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of any breastfeeding' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of any breastfeeding' for year 2015 - not at district level (found 4 unique locations)\n", + "Skipping indicator 'Median duration of any breastfeeding' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of exclusive breastfeeding' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of exclusive breastfeeding' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of exclusive breastfeeding' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of exclusive breastfeeding' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of predominant breastfeeding' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of predominant breastfeeding' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of predominant breastfeeding' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of predominant breastfeeding' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men circumcised' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men circumcised' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men circumcised' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men circumcised' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men circumcised' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men receiving an HIV test and receiving test results in the last 12 months' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men receiving an HIV test and receiving test results in the last 12 months' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men receiving an HIV test and receiving test results in the last 12 months' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men receiving an HIV test and receiving test results in the last 12 months' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men reporting an STI, genital dicharge, or a sore or ulcer' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men reporting an STI, genital dicharge, or a sore or ulcer' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men reporting an STI, genital dicharge, or a sore or ulcer' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men reporting an STI, genital dicharge, or a sore or ulcer' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men who are literate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men who are literate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men who are literate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men who are literate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men who smoke cigarettes' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men who smoke cigarettes' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men who smoke cigarettes' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men who smoke cigarettes' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men with no education' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men with no education' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men with no education' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men with no education' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men with no education' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men with secondary or higher education' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men with secondary or higher education' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men with secondary or higher education' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men with secondary or higher education' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men with secondary or higher education' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mother's first postnatal checkup in the first two days after birth' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mother's first postnatal checkup in the first two days after birth' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mother's first postnatal checkup in the first two days after birth' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Neonatal mortality rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Neonatal mortality rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Neonatal mortality rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Neonatal mortality rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Neonatal mortality rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Newborn's first postnatal checkup in the first two days after birth' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Newborn's first postnatal checkup in the first two days after birth' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Newborn's first postnatal checkup in the first two days after birth' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Non-breastfed children 6-23 months with 3 IYCF practices' for year 2010 - not at district level (found 4 unique locations)\n", + "Skipping indicator 'Non-breastfed children 6-23 months with 3 IYCF practices' for year 2015 - not at district level (found 4 unique locations)\n", + "Skipping indicator 'Non-breastfed children 6-23 months with 3 IYCF practices' for year 2019 - not at district level (found 4 unique locations)\n", + "Skipping indicator 'Persons with access to an insecticide-treated mosquito net (ITN)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Persons with access to an insecticide-treated mosquito net (ITN)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Persons with access to an insecticide-treated mosquito net (ITN)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Persons with access to an insecticide-treated mosquito net (ITN)' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Persons with access to an insecticide-treated mosquito net (ITN)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Persons with access to an insecticide-treated mosquito net (ITN)' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Persons with access to an insecticide-treated mosquito net (ITN)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Physical or sexual violence committed by husband/partner' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Physical or sexual violence committed by husband/partner' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Physical or sexual violence committed by husband/partner' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Physical or sexual violence committed by husband/partner' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Physical or sexual violence committed by husband/partner in last 12 months' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Physical or sexual violence committed by husband/partner in last 12 months' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Physical or sexual violence committed by husband/partner in last 12 months' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Physical or sexual violence committed by husband/partner in last 12 months' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 3 vaccination received' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 3 vaccination received' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 3 vaccination received' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 3 vaccination received' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 3 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using an improved water source' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using an improved water source' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using an improved water source' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using an improved water source' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using an improved water source' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using an improved water source' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using an improved water source' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population who slept under an insecticide-treated mosquito net (ITN) last night' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population who slept under an insecticide-treated mosquito net (ITN) last night' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population who slept under an insecticide-treated mosquito net (ITN) last night' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population who slept under an insecticide-treated mosquito net (ITN) last night' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population who slept under an insecticide-treated mosquito net (ITN) last night' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population who slept under an insecticide-treated mosquito net (ITN) last night' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population who slept under an insecticide-treated mosquito net (ITN) last night' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an improved sanitation facility' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an improved sanitation facility' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an improved sanitation facility' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an improved sanitation facility' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an improved sanitation facility' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an improved sanitation facility' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an improved sanitation facility' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Postneonatal mortality rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Postneonatal mortality rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Postneonatal mortality rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Postneonatal mortality rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Postneonatal mortality rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Pregnant women who slept under an insecticide-treated net (ITN)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Pregnant women who slept under an insecticide-treated net (ITN)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Pregnant women who slept under an insecticide-treated net (ITN)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Pregnant women who slept under an insecticide-treated net (ITN)' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Pregnant women who slept under an insecticide-treated net (ITN)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Pregnant women who slept under an insecticide-treated net (ITN)' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Pregnant women who slept under an insecticide-treated net (ITN)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Prevalence of orphanhood: children under 18 who are orphans - mother, father or both dead' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Prevalence of orphanhood: children under 18 who are orphans - mother, father or both dead' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Prevalence of orphanhood: children under 18 who are orphans - mother, father or both dead' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Prevalence of orphanhood: children under 18 who are orphans - mother, father or both dead' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'SP/Fansidar 3+ doses during pregnancy' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'SP/Fansidar 3+ doses during pregnancy' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Tetanus protection at birth' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Tetanus protection at birth' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Tetanus protection at birth' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Tetanus protection at birth' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total wanted fertility rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total wanted fertility rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total wanted fertility rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total wanted fertility rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total wanted fertility rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Unmet need for family planning' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Unmet need for family planning' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Unmet need for family planning' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Unmet need for family planning' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Unmet need for family planning' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Wife beating justified for at least one specific reason [Men]' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Wife beating justified for at least one specific reason [Men]' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Wife beating justified for at least one specific reason [Men]' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Wife beating justified for at least one specific reason [Men]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Wife beating justified for at least one specific reason [Women]' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Wife beating justified for at least one specific reason [Women]' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Wife beating justified for at least one specific reason [Women]' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Wife beating justified for at least one specific reason [Women]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women receiving an HIV test and receiving test results in the last 12 months' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women receiving an HIV test and receiving test results in the last 12 months' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women receiving an HIV test and receiving test results in the last 12 months' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women receiving an HIV test and receiving test results in the last 12 months' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women reporting an STI, genital dicharge, or a sore or ulcer' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women reporting an STI, genital dicharge, or a sore or ulcer' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women reporting an STI, genital dicharge, or a sore or ulcer' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women reporting an STI, genital dicharge, or a sore or ulcer' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are literate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are literate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are literate' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are literate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are literate' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are literate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are overweight or obese according to BMI (>=25.0)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are overweight or obese according to BMI (>=25.0)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are overweight or obese according to BMI (>=25.0)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are overweight or obese according to BMI (>=25.0)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are thin according to BMI (<18.5)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are thin according to BMI (<18.5)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are thin according to BMI (<18.5)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are thin according to BMI (<18.5)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who decide themselves how their earnings are used' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who decide themselves how their earnings are used' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who decide themselves how their earnings are used' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who decide themselves how their earnings are used' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who ever experienced sexual violence' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who ever experienced sexual violence' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who ever experienced sexual violence' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who ever experienced sexual violence' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who smoke cigarettes' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who smoke cigarettes' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who smoke cigarettes' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who smoke cigarettes' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who want no more children' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who want no more children' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who want no more children' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who want no more children' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who want no more children' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with any anemia' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with any anemia' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with any anemia' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with any anemia' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with any anemia' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with no education' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with no education' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with no education' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with no education' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with no education' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with no education' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with no education' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with secondary or higher education' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with secondary or higher education' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with secondary or higher education' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with secondary or higher education' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with secondary or higher education' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with secondary or higher education' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with secondary or higher education' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care from a skilled provider' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care from a skilled provider' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care from a skilled provider' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care from a skilled provider' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care from a skilled provider' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care from a skilled provider' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care from a skilled provider' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Auxiliary nurse/midwife' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Auxiliary nurse/midwife' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Auxiliary nurse/midwife' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Auxiliary nurse/midwife' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Auxiliary nurse/midwife' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Doctor' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Doctor' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Doctor' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Doctor' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Doctor' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Doctor' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Doctor' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Missing ' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Missing ' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Missing ' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Missing ' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Missing ' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Nurse/midwife' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Nurse/midwife' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Nurse/midwife' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Nurse/midwife' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Nurse/midwife' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Nurse/midwife' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Nurse/midwife' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Other' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Other' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Other' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Other' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Other health worker' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Traditional birth attendant' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Traditional birth attendant' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Traditional birth attendant' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care provider: Traditional birth attendant' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care: Total' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care: Total' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care: Total' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care: Total' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care: Total' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care: Total' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Antenatal care: Total' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery from a skilled provider' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery from a skilled provider' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery from a skilled provider' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery from a skilled provider' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery from a skilled provider' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Auxiliary nurse/midwife' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Auxiliary nurse/midwife' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Auxiliary nurse/midwife' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Auxiliary nurse/midwife' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Doctor' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Doctor' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Doctor' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Doctor' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Doctor' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: No one' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: No one' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: No one' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: No one' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: No one' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Nurse/midwife' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Nurse/midwife' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Nurse/midwife' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Nurse/midwife' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Nurse/midwife' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Other health worker' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Other health worker' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Relative or other' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Relative or other' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Relative or other' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Relative or other' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Relative or other' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Total' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Total' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Total' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Total' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Total' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Traditional birth attendant' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Traditional birth attendant' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Traditional birth attendant' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Traditional birth attendant' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: Traditional birth attendant' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: don't know or missing' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: don't know or missing' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: don't know or missing' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Assistance during delivery: don't know or missing' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child took antibiotic drugs for fever' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child took antibiotic drugs for fever' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child took antibiotic drugs for fever' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child took antibiotic drugs for fever' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child took antibiotic drugs for fever' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child took antibiotic drugs for fever' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child took antimalarial drugs for fever' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child took antimalarial drugs for fever' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child took antimalarial drugs for fever' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child took antimalarial drugs for fever' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child took antimalarial drugs for fever' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child took antimalarial drugs for fever' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child took antimalarial drugs for fever' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2019 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Children with fever for whom advice or treatment was sought' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever for whom advice or treatment was sought' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever for whom advice or treatment was sought' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever for whom advice or treatment was sought' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever for whom advice or treatment was sought' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever for whom advice or treatment was sought' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with fever for whom advice or treatment was sought' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI who received antibiotics' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI who received antibiotics' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI who received antibiotics' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI who received antibiotics' for year 2019 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Delivery by cesarean section' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Delivery by cesarean section' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Delivery by cesarean section' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Delivery by cesarean section' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No antenatal care' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No antenatal care' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No antenatal care' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No antenatal care' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No antenatal care' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No antenatal care' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No antenatal care' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No postnatal checkup for mother within first two days of birth' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No postnatal checkup for mother within first two days of birth' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No postnatal checkup for mother within first two days of birth' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No postnatal checkup for newborn within first two days of birth' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No postnatal checkup for newborn within first two days of birth' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No postnatal checkup for newborn within first two days of birth' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years (unweighted)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years (unweighted)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years (unweighted)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years (unweighted)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years (unweighted)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with fever in the last two weeks' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with fever in the last two weeks' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with fever in the last two weeks' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with fever in the last two weeks' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with fever in the last two weeks' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with fever in the last two weeks' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with fever in the last two weeks' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with fever in the last two weeks (unweighted)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with fever in the last two weeks (unweighted)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with fever in the last two weeks (unweighted)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with fever in the last two weeks (unweighted)' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with fever in the last two weeks (unweighted)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with fever in the last two weeks (unweighted)' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with fever in the last two weeks (unweighted)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years' for year 2019 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years (unweighted)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years (unweighted)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years (unweighted)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years (unweighted)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years (unweighted)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of live births (or stillbirths) in the last two (or three/five) years' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of live births (or stillbirths) in the last two (or three/five) years' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of live births (or stillbirths) in the last two (or three/five) years' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of live births (or stillbirths) in the last two (or three/five) years' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of live births (or stillbirths) in the last two (or three/five) years' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of live births (or stillbirths) in the last two (or three/five) years (unweighted)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of live births (or stillbirths) in the last two (or three/five) years (unweighted)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of live births (or stillbirths) in the last two (or three/five) years (unweighted)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of live births (or stillbirths) in the last two (or three/five) years (unweighted)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of live births (or stillbirths) in the last two (or three/five) years (unweighted)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of mothers' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of mothers' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of mothers' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of mothers (unweighted)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of mothers (unweighted)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of mothers (unweighted)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of newborns' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of newborns' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of newborns' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of newborns (unweighted)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of newborns (unweighted)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of newborns (unweighted)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women with a live birth (or stillbirth) in the last two (or three/five) years' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women with a live birth (or stillbirth) in the last two (or three/five) years' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women with a live birth (or stillbirth) in the last two (or three/five) years' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women with a live birth (or stillbirth) in the last two (or three/five) years' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women with a live birth (or stillbirth) in the last two (or three/five) years' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women with a live birth (or stillbirth) in the last two (or three/five) years' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women with a live birth (or stillbirth) in the last two (or three/five) years' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women with a live birth (or stillbirth) in the last two (or three/five) years (unweighted)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women with a live birth (or stillbirth) in the last two (or three/five) years (unweighted)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women with a live birth (or stillbirth) in the last two (or three/five) years (unweighted)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women with a live birth (or stillbirth) in the last two (or three/five) years (unweighted)' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women with a live birth (or stillbirth) in the last two (or three/five) years (unweighted)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women with a live birth (or stillbirth) in the last two (or three/five) years (unweighted)' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women with a live birth (or stillbirth) in the last two (or three/five) years (unweighted)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: At home' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: At home' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: At home' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: At home' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: At home' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Other' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Other' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Other' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Other' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Other' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Private sector' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Private sector' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Private sector' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Private sector' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Private sector' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Public sector' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Public sector' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Public sector' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Public sector' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Public sector' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Total' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Total' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Total' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Total' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Total' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: don't know or missing' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: don't know or missing' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: don't know or missing' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: don't know or missing' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of mothers' first postnatal checkup: Auxiliary nurse/midwife' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of mothers' first postnatal checkup: Auxiliary nurse/midwife' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of mothers' first postnatal checkup: Auxiliary nurse/midwife' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of mothers' first postnatal checkup: Community health worker' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of mothers' first postnatal checkup: Community health worker' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of mothers' first postnatal checkup: Doctor/nurse/midwife' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of mothers' first postnatal checkup: Doctor/nurse/midwife' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of mothers' first postnatal checkup: Doctor/nurse/midwife' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of mothers' first postnatal checkup: Other health worker' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of mothers' first postnatal checkup: Total' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of mothers' first postnatal checkup: Total' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of mothers' first postnatal checkup: Total' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of newborns' first postnatal checkup: Auxiliary nurse/midwife' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of newborns' first postnatal checkup: Auxiliary nurse/midwife' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of newborns' first postnatal checkup: Auxiliary nurse/midwife' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of newborns' first postnatal checkup: Community health worker' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of newborns' first postnatal checkup: Community health worker' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of newborns' first postnatal checkup: Doctor/nurse/midwife' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of newborns' first postnatal checkup: Doctor/nurse/midwife' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of newborns' first postnatal checkup: Doctor/nurse/midwife' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of newborns' first postnatal checkup: Other health worker' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of newborns' first postnatal checkup: Total' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of newborns' first postnatal checkup: Total' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of newborns' first postnatal checkup: Total' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of newborns' first postnatal checkup: Traditional birth attendant' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Provider of newborns' first postnatal checkup: Traditional birth attendant' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Advice or treatment was sought' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Advice or treatment was sought' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Advice or treatment was sought' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Advice or treatment was sought' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Advice or treatment was sought' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Antibiotics' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Antibiotics' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Antibiotics' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Antibiotics' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Antimotility drugs' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Antimotility drugs' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Antimotility drugs' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Antimotility drugs' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Home remedy - other' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Home remedy - other' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Home remedy - other' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Home remedy - other' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Home remedy - other' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Increased fluids' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Increased fluids' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Increased fluids' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Increased fluids' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Increased fluids' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Injection' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Injection' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Injection' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Injection' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Intravenous solution' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Intravenous solution' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Intravenous solution' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Intravenous solution' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: No ORS, RHF or increased fluids' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: No ORS, RHF or increased fluids' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: No ORS, RHF or increased fluids' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: No ORS, RHF or increased fluids' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: No ORS, RHF or increased fluids' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: No treatment' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: No treatment' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: No treatment' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: No treatment' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: No treatment' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: ORT or increased fluids' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: ORT or increased fluids' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: ORT or increased fluids' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: ORT or increased fluids' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: ORT or increased fluids' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Oral rehydration solution (ORS)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Oral rehydration solution (ORS)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Oral rehydration solution (ORS)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Oral rehydration solution (ORS)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Oral rehydration solution (ORS)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Recommended home fluids (RHF) at home' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Recommended home fluids (RHF) at home' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Recommended home fluids (RHF) at home' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Recommended home fluids (RHF) at home' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Recommended home fluids (RHF) at home' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Zinc supplements' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Zinc supplements' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: don't know or missing' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: don't know or missing' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: don't know or missing' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: don't know or missing' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child mortality rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child mortality rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child mortality rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child mortality rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Child mortality rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Early neonatal deaths' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Early neonatal deaths' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Early neonatal deaths' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Early neonatal deaths' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Neonatal mortality rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Neonatal mortality rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Neonatal mortality rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Neonatal mortality rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Neonatal mortality rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of pregnancies of 7+ months duration' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of pregnancies of 7+ months duration' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of pregnancies of 7+ months duration' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of pregnancies of 7+ months duration' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of pregnancies of 7+ months duration (unweighted)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of pregnancies of 7+ months duration (unweighted)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of pregnancies of 7+ months duration (unweighted)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of pregnancies of 7+ months duration (unweighted)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Perinatal mortality rate (5 years)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Perinatal mortality rate (5 years)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Perinatal mortality rate (5 years)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Perinatal mortality rate (5 years)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Postneonatal mortality rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Postneonatal mortality rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Postneonatal mortality rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Postneonatal mortality rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Postneonatal mortality rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Stillbirths' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Stillbirths' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Stillbirths' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Stillbirths' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with one room for sleeping' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with one room for sleeping' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with one room for sleeping' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with one room for sleeping' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with one room for sleeping' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean number of household members' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean number of household members' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean number of household members' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean number of household members' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean number of household members' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean number of household members' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean number of household members' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean number of persons per sleeping room' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean number of persons per sleeping room' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean number of persons per sleeping room' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean number of persons per sleeping room' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mean number of persons per sleeping room' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using a public tap/standpipe' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using a public tap/standpipe' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using a public tap/standpipe' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using a public tap/standpipe' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using a public tap/standpipe' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using a public tap/standpipe' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using a public tap/standpipe' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using an improved water source' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using an improved water source' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using an improved water source' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using an improved water source' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using an improved water source' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using an improved water source' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using an improved water source' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using open defecation' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using open defecation' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using open defecation' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using open defecation' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using open defecation' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using open defecation' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using open defecation' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using water piped into dwelling' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using water piped into dwelling' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using water piped into dwelling' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using water piped into dwelling' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using water piped into dwelling' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using water piped into dwelling' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using water piped into dwelling' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using water piped into yard/plot' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using water piped into yard/plot' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using water piped into yard/plot' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using water piped into yard/plot' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using water piped into yard/plot' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using water piped into yard/plot' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population using water piped into yard/plot' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with a basic handwashing facility, with soap and water available' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with a basic handwashing facility, with soap and water available' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with a basic handwashing facility, with soap and water available' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with a limited handwashing facility, lacking soap and/or water' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with a limited handwashing facility, lacking soap and/or water' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with a limited handwashing facility, lacking soap and/or water' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with a place for handwashing was observed' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with a place for handwashing was observed' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with a place for handwashing was observed' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an improved sanitation facility' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an improved sanitation facility' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an improved sanitation facility' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an improved sanitation facility' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an improved sanitation facility' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an improved sanitation facility' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an improved sanitation facility' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an unimproved sanitation facility' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an unimproved sanitation facility' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an unimproved sanitation facility' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an unimproved sanitation facility' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an unimproved sanitation facility' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an unimproved sanitation facility' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with an unimproved sanitation facility' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with basic sanitation service' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with basic sanitation service' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with basic sanitation service' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with basic sanitation service' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with basic sanitation service' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with basic sanitation service' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with basic sanitation service' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with basic water service' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with basic water service' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with basic water service' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with basic water service' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with basic water service' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with basic water service' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with basic water service' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with improved water source on the premises' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with improved water source on the premises' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with improved water source on the premises' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with improved water source on the premises' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with improved water source on the premises' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with improved water source on the premises' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with improved water source on the premises' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with limited sanitation service' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with limited sanitation service' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with limited sanitation service' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with limited sanitation service' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with limited sanitation service' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with limited sanitation service' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with limited sanitation service' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with limited water service' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with limited water service' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with limited water service' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with limited water service' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with limited water service' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with limited water service' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with limited water service' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with water more than 30 minutes away round trip' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with water more than 30 minutes away round trip' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with water more than 30 minutes away round trip' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with water more than 30 minutes away round trip' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with water more than 30 minutes away round trip' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with water more than 30 minutes away round trip' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Population with water more than 30 minutes away round trip' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children stunted' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children stunted' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children stunted' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children stunted' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children under 5 who slept under an insecticide-treated net (ITN)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children under 5 who slept under an insecticide-treated net (ITN)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children under 5 who slept under an insecticide-treated net (ITN)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children under 5 who slept under an insecticide-treated net (ITN)' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children under 5 who slept under an insecticide-treated net (ITN)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children under 5 who slept under an insecticide-treated net (ITN)' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children under 5 who slept under an insecticide-treated net (ITN)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children underweight' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children underweight' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children underweight' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children underweight' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children wasted' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children wasted' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children wasted' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children wasted' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied by modern methods' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied by modern methods' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied by modern methods' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied by modern methods' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Demand for family planning satisfied by modern methods' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among general population' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among general population' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among general population' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among men' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among men' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among men' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among women' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among women' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'HIV prevalence among women' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with electricity' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with electricity' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with electricity' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with electricity' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with electricity' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with electricity' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Households with electricity' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Infant mortality rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any method of contraception' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any method of contraception' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any method of contraception' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any method of contraception' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any method of contraception' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any modern method of contraception' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any modern method of contraception' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any modern method of contraception' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any modern method of contraception' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Married women currently using any modern method of contraception' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Women]: 25-49' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Women]: 25-49' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Women]: 25-49' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Women]: 25-49' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Women]: 25-49' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Women]: 25-49' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Women]: 25-49' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Women]: 25-49' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of exclusive breastfeeding' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of exclusive breastfeeding' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of exclusive breastfeeding' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median duration of exclusive breastfeeding' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men receiving an HIV test and receiving test results in the last 12 months' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men receiving an HIV test and receiving test results in the last 12 months' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men receiving an HIV test and receiving test results in the last 12 months' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men receiving an HIV test and receiving test results in the last 12 months' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Physical or sexual violence committed by husband/partner' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Physical or sexual violence committed by husband/partner' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Physical or sexual violence committed by husband/partner' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Physical or sexual violence committed by husband/partner' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Place of delivery: Health facility' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Treatment of diarrhea: Either ORS or RHF' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Under-five mortality rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Unmet need for family planning' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Unmet need for family planning' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Unmet need for family planning' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Unmet need for family planning' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Unmet need for family planning' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women receiving an HIV test and receiving test results in the last 12 months' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women receiving an HIV test and receiving test results in the last 12 months' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women receiving an HIV test and receiving test results in the last 12 months' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women receiving an HIV test and receiving test results in the last 12 months' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are literate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are literate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are literate' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are literate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are literate' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women who are literate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with secondary or higher education' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with secondary or higher education' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with secondary or higher education' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with secondary or higher education' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with secondary or higher education' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with secondary or higher education' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Women with secondary or higher education' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 15-19' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 15-19' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 15-19' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 15-19' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 15-19' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 15-19' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 15-19' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 20-24' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 20-24' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 20-24' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 20-24' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 20-24' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 20-24' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 20-24' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 25-29' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 25-29' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 25-29' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 25-29' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 25-29' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 25-29' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 25-29' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 30-34' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 30-34' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 30-34' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 30-34' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 30-34' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 30-34' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 30-34' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 35-39' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 35-39' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 35-39' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 35-39' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 35-39' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 35-39' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 35-39' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 40-44' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 40-44' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 40-44' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 40-44' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 40-44' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 40-44' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 40-44' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 45-49' for year 1992 - not at district level (found 3 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 45-49' for year 2005 - not at district level (found 4 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 45-49' for year 2008 - not at district level (found 4 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 45-49' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 45-49' for year 2013 - not at district level (found 3 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 45-49' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 45-49' for year 2017 - not at district level (found 4 unique locations)\n", + "Skipping indicator 'Age specific fertility rate: 45-49' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Crude birth rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Crude birth rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Crude birth rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Crude birth rate' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Crude birth rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Crude birth rate' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Crude birth rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'General fertility rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'General fertility rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'General fertility rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'General fertility rate' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'General fertility rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'General fertility rate' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'General fertility rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-44' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-44' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-44' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-44' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-44' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-44' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-44' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2013 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2017 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total fertility rate 15-49' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total wanted fertility rate' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total wanted fertility rate' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total wanted fertility rate' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total wanted fertility rate' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Total wanted fertility rate' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mutual health organzation or community-base health insurance [Men]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Mutual health organzation or community-base health insurance [Women]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No health insurance [Men]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'No health insurance [Women]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of men' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of men (unweighted)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of women (unweighted)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Other employer-base health insurance [Men]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Other employer-base health insurance [Women]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Other health insurance [Men]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Other health insurance [Women]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Privately purchased commercial insurance [Men]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Privately purchased commercial insurance [Women]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Social security health insurance [Men]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Social security health insurance [Women]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'BCG vaccination received' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'BCG vaccination received' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'BCG vaccination received' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'BCG vaccination received' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'BCG vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 1 vaccination received' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 1 vaccination received' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 1 vaccination received' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 1 vaccination received' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 1 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 2 vaccination received' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 2 vaccination received' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 2 vaccination received' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 2 vaccination received' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 2 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 3 vaccination received' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 3 vaccination received' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 3 vaccination received' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 3 vaccination received' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'DPT 3 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Fully vaccinated (8 basic antigens)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Haemophilus influenza type b 1 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Haemophilus influenza type b 2 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Haemophilus influenza type b 3 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Hepatitis 1 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Hepatitis 2 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Hepatitis 3 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Measles vaccination received' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Measles vaccination received' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Measles vaccination received' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Measles vaccination received' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Measles vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children 12-23 months' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children 12-23 months' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children 12-23 months' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children 12-23 months' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children 12-23 months' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children 12-23 months (unweighted)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children 12-23 months (unweighted)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children 12-23 months (unweighted)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children 12-23 months (unweighted)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children 12-23 months (unweighted)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 0 vaccination received' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 0 vaccination received' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 0 vaccination received' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 0 vaccination received' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 0 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 1 vaccination received' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 1 vaccination received' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 1 vaccination received' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 1 vaccination received' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 1 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 2 vaccination received' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 2 vaccination received' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 2 vaccination received' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 2 vaccination received' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 2 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 3 vaccination received' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 3 vaccination received' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 3 vaccination received' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 3 vaccination received' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Polio 3 vaccination received' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Received no vaccinations' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Received no vaccinations' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Received no vaccinations' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Received no vaccinations' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Received no vaccinations' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages in newspapers or magazines [Men]' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages in newspapers or magazines [Men]' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages in newspapers or magazines [Men]' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages in newspapers or magazines [Men]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages in none of these three media [Men]' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages in none of these three media [Men]' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages in none of these three media [Men]' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages in none of these three media [Men]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages on television [Men]' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages on television [Men]' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages on television [Men]' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages on television [Men]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages on the radio [Men]' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages on the radio [Men]' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages on the radio [Men]' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Family planning messages on the radio [Men]' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of any method of contraception among married men' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of any method of contraception among married men' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of any method of contraception among married men' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of any method of contraception among married men' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of any method of contraception among married men' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of any modern method of contraception amonth married men' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of any modern method of contraception amonth married men' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of any modern method of contraception amonth married men' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of any modern method of contraception amonth married men' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Knowledge of any modern method of contraception amonth married men' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 20-24' for year 1992 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 25-29' for year 2005 - not at district level (found 3 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 25-29' for year 2010 - not at district level (found 3 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 25-29' for year 2015 - not at district level (found 1 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 25-29' for year 2019 - not at district level (found 1 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 25-49(54,59)' for year 2005 - not at district level (found 3 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 25-49(54,59)' for year 2010 - not at district level (found 3 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 25-49(54,59)' for year 2015 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 25-49(54,59)' for year 2019 - not at district level (found 1 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 30-34' for year 2005 - not at district level (found 4 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 30-34' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 30-34' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 30-34' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 35-39' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 35-39' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 35-39' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 35-39' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 40-44' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 40-44' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 40-44' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 40-44' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 45-49' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 45-49' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 45-49' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 45-49' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 50-54' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 50-54' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 50-54' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first marriage [Men]: 50-54' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 20-49(54,59)' for year 2000 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 25-29' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 25-29' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 25-29' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 25-29' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 25-49(54,59)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 25-49(54,59)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 25-49(54,59)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 25-49(54,59)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 30-34' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 30-34' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 30-34' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 30-34' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 35-39' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 35-39' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 35-39' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 35-39' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 40-44' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 40-44' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 40-44' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 40-44' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 45-49' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 45-49' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 45-49' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 45-49' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 50-54' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 50-54' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 50-54' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Median age at first sexual intercourse [Men]: 50-54' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men circumcised' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men circumcised' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men circumcised' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men circumcised' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men circumcised' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men who want no more children' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men who want no more children' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men who want no more children' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Men who want no more children' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of wives: One wife' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of wives: One wife' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of wives: One wife' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of wives: One wife' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of wives: One wife' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of wives: Two or more wives' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of wives: Two or more wives' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of wives: Two or more wives' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of wives: Two or more wives' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of wives: Two or more wives' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: Active 4 Weeks' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: Active 4 Weeks' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: Active 4 Weeks' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: Active 4 Weeks' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: Never had sex' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: Never had sex' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: Never had sex' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: Never had sex' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: One or more years ago' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: One or more years ago' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: One or more years ago' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: One or more years ago' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: Within the last year' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: Within the last year' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: Within the last year' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Recent sexual activity [Men]: Within the last year' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with ARI for whom advice or treatment was sought' for year 2019 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI who received antibiotics' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI who received antibiotics' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI who received antibiotics' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Children with symptoms of ARI who received antibiotics' for year 2019 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years (unweighted)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years (unweighted)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years (unweighted)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years (unweighted)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children born in the last five (or three) years (unweighted)' for year 2019 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years' for year 2019 - not at district level (found 2 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years (unweighted)' for year 2005 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years (unweighted)' for year 2008 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years (unweighted)' for year 2010 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years (unweighted)' for year 2015 - not at district level (found 5 unique locations)\n", + "Skipping indicator 'Number of children with symptoms of ARI born in the last five (or three) years (unweighted)' for year 2019 - not at district level (found 5 unique locations)\n", + "Created dataset with 6178 rows across 299 indicator-year combinations\n" + ] + } + ], + "source": [ + "df_adm2 = extract_adm2_indicators(excel_path=FILE_EXCEL)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "c2ca1a2d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
indicator_namedistrictaggregated_valueindicator_yearsurvey_namesurvey_year_labelaggregation_methodsource_sheet
0Antenatal care from a skilled providerButare89.6000001992RW1992DHS1992meandhs-mobile_subnational_rwa
1Antenatal care from a skilled providerButare/Gitarama93.6000001992RW1992DHS1992meandhs-mobile_subnational_rwa
2Antenatal care from a skilled providerByumba94.5000001992RW1992DHS1992meandhs-mobile_subnational_rwa
3Antenatal care from a skilled providerByumba/Kibungo94.2666671992RW1992DHS1992meandhs-mobile_subnational_rwa
4Antenatal care from a skilled providerCyangugu90.9333331992RW1992DHS1992meandhs-mobile_subnational_rwa
\n", + "
" + ], + "text/plain": [ + " indicator_name district aggregated_value \\\n", + "0 Antenatal care from a skilled provider Butare 89.600000 \n", + "1 Antenatal care from a skilled provider Butare/Gitarama 93.600000 \n", + "2 Antenatal care from a skilled provider Byumba 94.500000 \n", + "3 Antenatal care from a skilled provider Byumba/Kibungo 94.266667 \n", + "4 Antenatal care from a skilled provider Cyangugu 90.933333 \n", + "\n", + " indicator_year survey_name survey_year_label aggregation_method \\\n", + "0 1992 RW1992DHS 1992 mean \n", + "1 1992 RW1992DHS 1992 mean \n", + "2 1992 RW1992DHS 1992 mean \n", + "3 1992 RW1992DHS 1992 mean \n", + "4 1992 RW1992DHS 1992 mean \n", + "\n", + " source_sheet \n", + "0 dhs-mobile_subnational_rwa \n", + "1 dhs-mobile_subnational_rwa \n", + "2 dhs-mobile_subnational_rwa \n", + "3 dhs-mobile_subnational_rwa \n", + "4 dhs-mobile_subnational_rwa " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_adm2.head()" + ] + }, + { + "cell_type": "markdown", + "id": "30a89bd9", + "metadata": {}, + "source": [ + "
\n", + "

📝 Marking Notes for Part-1-Task-2

\n", + "
    \n", + "
  • Total Points: 25
  • \n", + "
  • You can decide how to assign points
  • \n", + "
  • Someone gets full points if they have code and they have displayed the dataframe above in their notebook
  • \n", + "
  • Results at district level or sector level is okay, otherwise, national level is not accepatab
  • \n", + "
  • Total Points-Part-1: 40
  • \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "8169202f", + "metadata": {}, + "source": [ + "## Introduction to Nightlights Dataset\n", + "\n", + "## What is Nightlight Data?\n", + "\n", + "Nightlight data is satellite imagery capturing artificial light emissions from Earth's surface during nighttime. Satellites like VIIRS collect this data regularly, providing an **objective, real-time measure of human economic activity and development**.\n", + "\n", + "### Raw Data: Radiance Measurements\n", + "The fundamental measurement in nightlight data is **radiance** - the amount of light energy detected by satellite sensors, measured in **nanowatts per square centimeter per steradian (nW/cm²/sr)**. Each pixel in satellite imagery contains a radiance value representing the light intensity from that specific location on Earth's surface.\n", + "\n", + "### Annual Composite Generation\n", + "This dataset was created from **annual composite images** using VIIRS nightlight files for Rwanda. Annual composites are generated by:\n", + "\n", + "- **Aggregating daily/monthly observations** throughout each year (2015, 2020, 2024)\n", + "- **Filtering out temporary light sources** (fires, lightning, aurora)\n", + "- **Removing cloud-affected observations** to ensure clear measurements\n", + "- **Averaging or taking median values** to create stable, representative annual measurements\n", + "- **Masking techniques** to exclude areas with unreliable data\n", + "\n", + "The files used include both **average composites** (`average_masked`) and **median composites** (`median_masked`), with **cloud-free versions** (`vcmslcfg`) preferred over cloud-inclusive versions (`vcmcfg`) for more accurate measurements.\n", + "\n", + "### Why Use Nightlight Data?\n", + "\n", + "- **Consistent global coverage** - Available everywhere, regardless of local data quality\n", + "- **Real-time updates** - More current than traditional economic statistics\n", + "- **Objective measurement** - Not subject to reporting biases\n", + "- **High resolution** - Captures local development patterns\n", + "- **Proxy for development** - Light intensity correlates with economic activity, infrastructure, and quality of life\n", + "\n", + "## Dataset Overview \n", + "\n", + "- **6,507 observations** across Rwanda's administrative cells\n", + "- **Three time periods**: 2015, 2020, 2024\n", + "- **Cell-level data** - Rwanda's smallest administrative units\n", + "- Allows temporal analysis of development trends\n", + "\n", + "---\n", + "\n", + "## Variable Definitions\n", + "\n", + "### Administrative Identifiers\n", + "- **`cell_id`** - Unique identifier for linking with other datasets\n", + "- **`province_name`** - Province (5 total in Rwanda)\n", + "- **`district_name`** - District (30 total in Rwanda) \n", + "- **`sector_name`** - Administrative level between district and cell\n", + "- **`cell_name`** - Specific cell name\n", + "\n", + "### Core Nightlight Measurements\n", + "\n", + "#### `total_nightlight`\n", + "- **Sum of all radiance values** within cell boundaries\n", + "- **Key indicator** of overall economic activity/development\n", + "- Higher values = more total development\n", + "\n", + "#### `mean_nightlight` \n", + "- **Average radiance** per pixel\n", + "- Indicates development intensity regardless of cell size\n", + "- Useful for comparing cells of different areas\n", + "\n", + "#### `median_nightlight`\n", + "- **Middle radiance value** of all pixels (less sensitive to outliers)\n", + "- Better represents typical lighting in unevenly developed areas\n", + "\n", + "#### `max_nightlight`\n", + "- **Highest radiance** within cell\n", + "- Indicates major infrastructure (hospitals, commercial centers)\n", + "\n", + "#### `min_nightlight` & `std_nightlight`\n", + "- Minimum radiance and standard deviation\n", + "- High std = uneven development within cell\n", + "\n", + "### Spatial Coverage Indicators\n", + "\n", + "#### `pixel_count`\n", + "- **Total pixels** in cell (indicates geographic size)\n", + "- Used to normalize other measurements\n", + "\n", + "#### `lit_pixel_count`\n", + "- **Number of pixels with detectable light** (radiance > 0)\n", + "- Shows spatial extent of development\n", + "\n", + "#### `lit_pixel_percentage`\n", + "- **Percentage of cell area with lighting**\n", + "- Formula: `(lit_pixel_count ÷ pixel_count) × 100`\n", + "- **0% = completely dark, 100% = fully developed**\n", + "\n", + "#### `year`\n", + "- Time period: 2015, 2020, or 2024" + ] + }, + { + "cell_type": "markdown", + "id": "784d2e72", + "metadata": {}, + "source": [ + "# Part-2: Demographic and Nightlights Data [60 Points]\n", + "\n", + "## Part A: Varible Generation and Data Integration\n", + "\n", + "### Population Dataset Variables (`rwa-cell-pop.csv`):\n", + "Create the following derived variables:\n", + "- **`dependency_ratio`** - `(children_under_five_2020 + elderly_60_plus_2020) / working_age_population * 100`\n", + "- **`people_per_building`** - `general_2020 / building_count`\n", + "- **`working_age_population`** - `general_2020 - children_under_five_2020 - elderly_60_plus_2020`\n", + "- **`infrastructure_index`** - Your own formula that incorporates `people_per_building` and other relevant variables to measure infrastructure adequacy. Document and justify your `infrastructure_index` methodology, explaining how `people_per_building` and other variables contribute to measuring infrastructure pressure.\n", + "\n", + "### Nightlight Dataset Variables (`cell-ntl-2015-2020-2024.csv`):\n", + "Create the following temporal and development indicators:\n", + "- **`nightlight_change_2015_2024`** - Percentage change in total nightlight from 2015 to 2024\n", + "- **`mean_nightlight_change_2015_2024`** - Percentage change in mean nightlight from 2015 to 2024\n", + "- **`lit_pixel_percentage`** - Use existing or calculate: `(lit_pixel_count / pixel_count) * 100`\n", + "\n", + "### Data Integration:\n", + "Merge the datasets using the appropriate column. \n", + "\n", + "## Part B: Exploratory Data Analysis\n", + "\n", + "### Correlation Analysis:\n", + "1. **Correlation Heatmap**: Create a heatmap showing correlations between 10 key variables (mix of demographic, infrastructure, and nightlight variables). \n", + "2. **Report the top 3 variable pairs** with the highest correlations and interpret their relationships.\n", + "3. **Identify unexpected correlations** and discuss potential explanations.\n", + "\n", + "### Nightlight Trend Analysis:\n", + "1. **District Ranking**: Report the **top 5 districts** with the highest nightlight growth (2015-2024) and **bottom 5 districts** with the most decline or lowest growth.\n", + "2. **Lit Pixel Analysis**: Compare these districts using `lit_pixel_percentage` changes to understand whether growth represents intensification or spatial expansion.\n", + "3. **Create visualizations** showing nightlight trends for these extreme districts.\n", + "\n", + "## Part C: Modeling\n", + "\n", + "\n", + "### Multivariate Linear Regression:\n", + "1. **Model Development**: Build a multivariate linear regression model predicting **population density** using both demographic and nightlight variables as predictors. Explore as many variables as possible at the beginning.\n", + "2. **Variable Selection**: Test different combinations of variables and report the **top 3 most predictive variables** of population density.\n", + "3. **Model Evaluation**: Report R-squared, coefficients, and statistical significance. Interpret what these results tell us about population-infrastructure relationships.\n", + "\n", + "\n", + "\n", + "## Notes and Other Requirements\n", + "Please follow the genral guidelines below when preparing your analysis..\n", + "\n", + "### Statistical Analysis:\n", + "- Properly handle missing data and outliers\n", + "- Use appropriate statistical tests and report p-values\n", + "- Calculate and interpret correlation coefficients\n", + "- Validate regression assumptions (normality, homoscedasticity)\n", + "\n", + "### Data Management:\n", + "- Document all data cleaning and aggregation steps using markdown \n", + "- Ensure consistent district naming across datasets\n", + "\n", + "### Visualization Standards:\n", + "- Create clear, publication-quality heatmaps with appropriate color scales\n", + "- Design effective time series plots for nightlight trends\n", + "- Include proper axis labels, titles, and legends\n", + "- Use consistent formatting across all visualizations\n", + "\n", + "### Reporting Requirements:\n", + "- Clearly state the top 3 most predictive variables with statistical justification\n", + "- Provide ranked lists for nightlight growth districts with supporting metrics\n", + "- Include model performance statistics and interpretation\n", + "- Document all methodological choices and assumptions" + ] + }, + { + "cell_type": "markdown", + "id": "99f0479d", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "7ef05143", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "## Create Population Dataset Variables" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "3adf8782", + "metadata": {}, + "outputs": [], + "source": [ + "df_pop = pd.read_csv(FILE_CELL_POP_RW)\n", + "df_ntl = pd.read_csv(FILE_CELL_NTL_RW)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "d9549fee", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/4k/7vm8r4rj2g90lf39dt0pqwbr0000gn/T/ipykernel_44216/3386350694.py:18: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n", + "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n", + "\n", + "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n", + "\n", + "\n", + " df_pop['dependency_ratio'].fillna(df_pop['dependency_ratio'].median(), inplace=True)\n", + "/var/folders/4k/7vm8r4rj2g90lf39dt0pqwbr0000gn/T/ipykernel_44216/3386350694.py:24: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n", + "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n", + "\n", + "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n", + "\n", + "\n", + " df_pop['people_per_building'].fillna(df_pop['people_per_building'].median(), inplace=True)\n" + ] + } + ], + "source": [ + "# ==================================================================\n", + "# GENERATE ADDITIONAL VARIABLES IN POPULAITON DATAFRAME\n", + "# ==================================================================\n", + "\n", + "# Create derived variables for population dataset\n", + "df_pop['working_age_population'] = (df_pop['general_2020'] - \n", + " df_pop['children_under_five_2020'] - \n", + " df_pop['elderly_60_plus_2020'])\n", + "\n", + "\n", + "# Calculate dependency ratio\n", + "df_pop['dependency_ratio'] = ((df_pop['children_under_five_2020'] + df_pop['elderly_60_plus_2020']) / \n", + " df_pop['working_age_population'] * 100)\n", + "\n", + "# Handle infinity values in dependency ratio\n", + "# We fill with median but these cn be left as NaN\n", + "df_pop['dependency_ratio'] = df_pop['dependency_ratio'].replace([np.inf, -np.inf], np.nan)\n", + "df_pop['dependency_ratio'].fillna(df_pop['dependency_ratio'].median(), inplace=True)\n", + "\n", + "# Calculate people per building\n", + "# We fill NaN with median but these cn be left as NaN\n", + "df_pop['people_per_building'] = df_pop['general_2020'] / df_pop['building_count']\n", + "df_pop['people_per_building'] = df_pop['people_per_building'].replace([np.inf, -np.inf], np.nan)\n", + "df_pop['people_per_building'].fillna(df_pop['people_per_building'].median(), inplace=True)\n", + "\n", + "# Create population density (people per unit area proxy)\n", + "df_pop['total_population'] = df_pop['general_2020'] # Using total population as proxy\n", + "\n", + "# Create Infrastructure Index" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "5a9438b4", + "metadata": {}, + "outputs": [], + "source": [ + "# Create Infrastructure Index based only on people_per_building\n", + "\n", + "# Calculate z-scores for people_per_building (how many standard deviations from mean)\n", + "df_pop['people_per_building_zscore'] = (df_pop['people_per_building'] - df_pop['people_per_building'].mean()) / df_pop['people_per_building'].std()\n", + "\n", + "# Infrastructure index - invert and scale to 0-100 range\n", + "# Lower people_per_building means better infrastructure (less crowding)\n", + "# We invert the z-score and scale to 0-100 range where higher = better infrastructure\n", + "\n", + "# Find min and max z-scores for scaling\n", + "min_z = df_pop['people_per_building_zscore'].min()\n", + "max_z = df_pop['people_per_building_zscore'].max()\n", + "\n", + "# Create the infrastructure index (scaled 0-100)\n", + "# Subtract from max_z to invert (lower people_per_building = higher infrastructure index)\n", + "df_pop['infrastructure_index'] = 100 * (max_z - df_pop['people_per_building_zscore']) / (max_z - min_z)\n", + "\n", + "# Round to 2 decimal places\n", + "df_pop['infrastructure_index'] = df_pop['infrastructure_index'].round(2)\n" + ] + }, + { + "cell_type": "markdown", + "id": "ac46ed0c", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "### Create Nightlight Dataset Variables\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "5d961de5", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Nightlight variables created successfully!\n", + "Nightlight change range: -65.31% - 3157.42%\n" + ] + } + ], + "source": [ + "# ==================================================================\n", + "# GENERATE ADDITIONAL NTL VARIABLES\n", + "# ==================================================================\n", + "\n", + "# Pivot nightlight data to get values by year\n", + "df_ntl_pivot = df_ntl.pivot_table(\n", + " index=['cell_id', 'province_name', 'district_name', 'sector_name', 'cell_name'],\n", + " columns='year',\n", + " values=['total_nightlight', 'mean_nightlight', 'lit_pixel_count', 'pixel_count'],\n", + " aggfunc='first'\n", + ").reset_index()\n", + "\n", + "# Flatten column names\n", + "df_ntl_pivot.columns = ['_'.join([str(col[0]), str(col[1])]) if col[1] != '' \n", + " else str(col[0]) for col in df_ntl_pivot.columns]\n", + "\n", + "# Clean column names\n", + "df_ntl_pivot.columns = [col.replace('_', '') if col.endswith('_') else col for col in df_ntl_pivot.columns]\n", + "\n", + "# Calculate nightlight changes (2015-2024)\n", + "# Replace division by zero with NaN instead of adding a small value\n", + "df_ntl_pivot['nightlight_change_2015_2024'] = np.where(\n", + " df_ntl_pivot['total_nightlight_2015'] == 0,\n", + " np.nan,\n", + " (df_ntl_pivot['total_nightlight_2024'] - df_ntl_pivot['total_nightlight_2015']) / \n", + " df_ntl_pivot['total_nightlight_2015'] * 100\n", + ")\n", + "\n", + "df_ntl_pivot['mean_nightlight_change_2015_2024'] = np.where(\n", + " df_ntl_pivot['mean_nightlight_2015'] == 0,\n", + " np.nan,\n", + " (df_ntl_pivot['mean_nightlight_2024'] - df_ntl_pivot['mean_nightlight_2015']) / \n", + " df_ntl_pivot['mean_nightlight_2015'] * 100\n", + ")\n", + "\n", + "# Calculate lit pixel percentage for each year\n", + "for year in [2015, 2020, 2024]:\n", + " df_ntl_pivot[f'lit_pixel_percentage_{year}'] = (\n", + " df_ntl_pivot[f'lit_pixel_count_{year}'] / df_ntl_pivot[f'pixel_count_{year}'] * 100\n", + " )\n", + "\n", + "df_ntl_pivot['lit_pixel_change_2015_2024'] = (\n", + " df_ntl_pivot['lit_pixel_percentage_2024'] - df_ntl_pivot['lit_pixel_percentage_2015']\n", + ")\n", + "\n", + "print(\"Nightlight variables created successfully!\")\n", + "print(f\"Nightlight change range: {df_ntl_pivot['nightlight_change_2015_2024'].min():.2f}% - {df_ntl_pivot['nightlight_change_2015_2024'].max():.2f}%\")" + ] + }, + { + "cell_type": "markdown", + "id": "0629c34d", + "metadata": {}, + "source": [ + "
\n", + "

📝 Marking Notes for Part-2-Variable Generation

\n", + "
    \n", + "
  • Total Points: 10
  • \n", + "
  • You can decide how to assign points
  • \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "cf4a9fdc", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "## Data Integration" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "22603370", + "metadata": {}, + "outputs": [], + "source": [ + "df_ntl_pivot.drop(columns=['province_name', 'district_name', 'sector_name', 'cell_name'], inplace=True)\n", + "\n", + "df = pd.merge(df_pop, df_ntl_pivot, on=\"cell_id\", how=\"left\")" + ] + }, + { + "cell_type": "markdown", + "id": "26fdb4b8", + "metadata": {}, + "source": [ + "
\n", + "

📝 Marking Notes for Part-2-Data Integration

\n", + "
    \n", + "
  • Total Points: 5
  • \n", + "
  • You can decide how to assign points
  • \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "4bf67167", + "metadata": {}, + "source": [ + "## Exploratory Analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "8f4e219b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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IjIrCwvDAzGSJEGr1XLYBBEpBnekiIiIyKzOnTsnOgIR0WPjjhQREREREVEjcUeKiIiIhDh16hQuXryI27dv662HhIQISkREZDoWUkRERGRWpaWlGDp0KAoKCnS9UQB090mxR4qIlIDjz4mIiMisoqOjoVKpUFFRgWbNmuHkyZPIyMjACy+8gP3794uOR0RkEvZIERERkVm5uLggPT0dgYGBcHR0RFZWFjp06ID09HTExsYiNzdXdEQioofijhQRERGZlVqtRvPmzQHcLaouX74MAPDy8kJhYaHIaEREJmOPFBEREZlV586dkZ+fDx8fH/To0QNLliyBtbU1kpOT4ePjIzoeEZFJeLSPiIiIzCo1NRW1tbUICwtDaWkpBg8ejDNnzsDZ2RlbtmxB//79RUckInooFlJEREQkXHV1NZycnHST+4iI5I49UkRERCREcXExUlNT8euvv6Jly5ai4xARNQoLKSIiIjKrqqoqDBgwAH5+fvjzn/+MsrIyAMDYsWMRGxsrOB0RkWlYSBEREZFZTZs2DVZWVrh48SKaNWumW4+IiMCuXbsEJiMiMh2n9hEREZFZ7d69G6mpqWjTpo3eevv27XHhwgVBqYiIGoc7UkRERGRWtbW1ejtR9a5evQobGxsBiYiIGo+FFBEREZlV3759sWHDBt2vJUmCRqPB0qVL0a9fP4HJiIhMx/HnREREZFanTp3CSy+9hOeffx7p6ekICQnByZMnUV1djczMTLRr1050RCKih2IhRURERGZXVlaGTz75BMeOHYNGo0G3bt3w3nvvwc3NTXQ0IiKTsJAiIiIis7t58yby8/NRWVkJjUaj9ywkJERQKiIi03FqHxEREZnVrl27EBUVhaqqKtz/ea4kSVCr1YKSERGZjsMmiIiIyKwmT56M8PBwXL58GRqNRu8/FlFEpBQ82kdERERm5eDggNzcXA6VICJF444UERERmdWbb76J/fv3i45BRPRYuCNFREREZnXjxg2Eh4ejVatWCAgIgJWVld7zqVOnCkpGRGQ6FlJERERkVmvXrsXEiRPRtGlTODs7Q5Ik3TNJklBaWiowHRGRaVhIERERkVm1bt0aU6dOxaxZs2BhwS4DIlIm/u1FREREZnX79m1ERESwiCIiRePfYERERGRWI0eOxJYtW0THICJ6LLyQl4iIiMxKrVZjyZIlSE1NRWBgoMGwieXLlwtKRkRkOvZIERERkVn169evwWeSJCE9Pd2MaYiIHg0LKSIiIiIiokZijxQREREREVEjsZAiIiIiIiJqJBZSREREREREjcRCioiIiIiIqJFYSBERERERETUSCykiIiIiIqJGYiFFRERERETUSCykiIiIiIiIGun/AU8EmH6KqDQ9AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Select key variables for correlation analysis\n", + "key_vars = [\n", + " 'dependency_ratio', 'people_per_building', 'infrastructure_index',\n", + " 'total_population', 'nightlight_change_2015_2024', \"building_count\",\n", + " 'mean_nightlight_change_2015_2024', 'lit_pixel_change_2015_2024',\n", + " 'total_nightlight_2024', 'mean_nightlight_2024', 'lit_pixel_percentage_2024'\n", + "]\n", + "\n", + "# Create correlation matrix\n", + "corr_matrix = df[key_vars].corr()\n", + "\n", + "# Create correlation heatmap\n", + "plt.figure(figsize=(10, 8))\n", + "sns.heatmap(corr_matrix, annot=True, cmap='RdBu_r', center=0,\n", + " square=True, linewidths=0.5, cbar_kws={\"shrink\": .8})\n", + "plt.title('Correlation Heatmap: Key Variables', fontsize=16, pad=20)\n", + "plt.tight_layout()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "171ba629", + "metadata": {}, + "source": [ + "# Based on Manual Inspection, Below is a List of Top and Intresting Correlations\n", + "```\n", + "'total_population' and 'building_count': 0.7\n", + "'dependency_ratio' and 'mean_nightlight_change_2024': -0.57\n", + "'total_population' and 'ltotal_night_light_2024': 0.53\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "731397f8", + "metadata": {}, + "source": [ + "## Trends in Night Lights" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "728286cf", + "metadata": {}, + "outputs": [], + "source": [ + "df_ntl_dist = df.groupby('district_name').agg({\n", + " 'nightlight_change_2015_2024': 'mean',\n", + " 'lit_pixel_change_2015_2024': 'mean',\n", + " 'total_nightlight_2015': 'mean',\n", + " 'total_nightlight_2024': 'mean',\n", + " 'lit_pixel_percentage_2015': 'mean',\n", + " 'lit_pixel_percentage_2024': 'mean'\n", + "}).reset_index()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "123c80bf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TOP 5 DISTRICTS - HIGHEST NIGHTLIGHT GROWTH (2015-2024):\n", + "============================================================\n", + "Nyaruguru: 877.4% growth\n", + "Nyagatare: 757.5% growth\n", + "Bugesera: 716.3% growth\n", + "Kirehe: 639.0% growth\n", + "Ngoma: 623.5% growth\n", + "\n", + "BOTTOM 5 DISTRICTS - LOWEST NIGHTLIGHT GROWTH (2015-2024):\n", + "============================================================\n", + "Nyarugenge: 192.7% growth\n", + "Rubavu: 318.4% growth\n", + "Kicukiro: 387.8% growth\n", + "Muhanga: 390.8% growth\n", + "Nyanza: 399.0% growth\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABjUAAAJOCAYAAAD/KYUYAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA4vRJREFUeJzs3X98T/X///H7y36PbWxrvzI/E7H58Ubyo7YxQ36VdwiJ8vZWfpQihWSSLd5CzTupZH7E9C4U5XdMQrFSCJXIjzaTH5vZ2tjO94++e3287IfXazaz7Xa9XM6lXuc8zzmP89p2nMd5nOfzmAzDMAQAAAAAAAAAAHCbq1TaAQAAAAAAAAAAAFiDogYAAAAAAAAAACgTKGoAAAAAAAAAAIAygaIGAAAAAAAAAAAoEyhqAAAAAAAAAACAMoGiBgAAAAAAAAAAKBMoagAAAAAAAAAAgDKBogYAAAAAAAAAACgTKGoAAAAAAAAAAIAygaIGABSDyMhImUwmbdu27Zbv+/jx4zKZTBo8ePAt33dpMplMCg0NvaltbNu2TSaTSZGRkcUSU0HbCw0NlclkuuntF8cx4/8MHjxYJpNJx48fL+1QAAAASlRxX/faqlatWqpVq1ap7Lu03K45QH7bK658triOGX+LjY2VyWRSbGxsaYcC3HYoagAolMlksmkqDbk3JvObGjRoYPV2ci8YcqdKlSrJ3d1dtWvXVs+ePRUTE6Pz58+XyDGU9s3q0tp/7sWzyWTSxx9/nG+b3J/v7t27b3F0+Svtn5UtbjapSExM1KRJk9SqVSt5eXnJwcFBnp6eat26tSZMmKAjR44UY7TFr7STdwAAypvch2munypXrqzGjRtrypQpSktLu+n9FHa9VRZv8l2fZ1w/JSUlWbWd/L5/V1dXBQQEqEOHDnrllVd09OjREjmG0r5ZXVr7z72eNJlMGjlyZL5tcn++r7/++i2OLn+l/bOyxc0WUzIyMvT2228rIiJCfn5+cnR0lJubm4KDgzVs2LBSeejQVmUpvwRuJ/alHQCA29vkyZPzzJsyZYo8PDw0evToWx9QIZ599llVrVrVYp63t7fN2+nQoYPatWsnSUpLS9OpU6f01Vdf6bPPPtPkyZM1f/589e7d22KdkSNH6tFHH1WNGjWKHH9R3XnnnTp06JA8PDxu+b6L08SJE/XQQw/J3t66f5oOHTokV1fXEo6qeCxevFjp6emlHYZN4uLiNGTIEKWnp6tp06bq06ePPD09lZqaqu+++04zZszQ9OnTtWbNGj344IOlHS4AALiF6tatq8cee0ySZBiGzp49q3Xr1ikyMlIbNmzQV199JTs7u1KO8vbTs2dPNW3aNM/8KlWq2LSda7//zMxMJScn69tvv9XUqVMVFRWlcePGadq0aRY3tu+9914dOnSoSPlRcdiyZUup7Lc4vfvuu3ruuedUt25dq9qXpRygNPPZovrhhx/08MMP69ixYwoMDFSnTp1055136q+//tLPP/+sZcuW6d1339VLL72k6Ojo0g4XQDGjqAGgUPk94TxlyhRVrVr1tnv6efTo0cXSpTk8PFwvvfSSxbzs7GzFxsZq1KhR6tevnzw8PBQREWFe7u3tXWoJgoODg009Um5HdevW1c8//6z3339fTz31lFXrlKVjLkvJgSStW7dOAwYMkJeXlz799FOFh4fnaXPy5Em99tprunjx4q0PEAAAlKq77rorTy6QmZmp1q1ba9euXdq+fbvCwsJKJ7jb2EMPPVQsQ8bm9/1L0ldffaXHH39c0dHRsrOz09SpU83LXF1dS/X62dpCwO2qbt26Onr0qCZOnKi4uDir1ilLOUBp5rNFcerUKUVEROjcuXOaM2eORo4cmaeQmpaWpnfeeUenTp0qpSgBlCSGnwJQbNLT0xUZGakGDRrI2dlZnp6e6tq1q3bu3Jmn7bXdTN977z01atRIzs7OqlGjhsaPH6+//vqrFI6gYHZ2dhoyZIjeeecdZWdn6/nnn5dhGOblBXWb3bp1q7p06aKAgAA5OTkpICBAoaGhev/99yX9X3dmSYqPj7foSp7bpf7aLvaff/657r//frm5uZkLOIW9U+PSpUt69dVX1bhxY1WuXFkeHh5q1qyZJk2apCtXrli1/5ycHL3//vu699575enpKVdXV9WqVUsPPfSQtm/fXizf75gxY1StWjVNmTJFly9ftmqdgrrpHj9+XH379pWnp6eqVKmikJAQbd++/YZdm7/77jt16tRJbm5u8vDw0MMPP2zxrgVrvquCFNQFPD09XePGjVNgYKCcnZ0VFBSk995774bDJp09e1ZPPvmkfHx85OLiovvuuy/PcZlMJsXHx5v/P3e6USJ99epVjRgxQjk5Ofrkk0/yLWhIUmBgoObPn68+ffpYzM8dL/nixYt65plnFBgYKHt7e4vvaO3atQoLC5OHh4dcXFzUtGlTzZkzR9nZ2eY2OTk58vT0zPM049mzZ1WpUiWZTCbt2LHDYlnfvn1lMpl05swZRUZGmm+mTJkyxeI7yO8dGm+//bbuueceOTs7q2bNmpoyZYpycnIK/a4AAMD/cXJyMv/be/bs2TzLd+7cqa5du8rT01POzs5q0KCBIiMjLZ5kv9H11uDBg/XEE09Ikp544okCh8E9ceKEhgwZojvvvFOOjo6qXr26hgwZopMnT+aJK/c6LTMzUxMmTFCNGjXk4uKi5s2ba/PmzZL+vqZ+5plndOedd8rZ2VmtW7fW3r17i+eLK0b333+/NmzYICcnJ82YMcPieAu6vvzll1/0xBNPqHbt2nJ2dpa3t7f+8Y9/aMyYMeY2N7quvDYfOXz4sHr16iVvb2+L666C3qlhGIYWLVqkBx54QFWrVpWrq6vq1aunp556SidOnLBq/9KN866bFR4erpCQEH300UdKSEiwap2ylAMUlivNnz/fnK8HBgZq3Lhx+uuvvwodNunq1auaOnWqateuLScnJ9199916++2383w/U6ZMkSSFhYWZY7XmQcXx48crOTlZkydP1rPPPptvz7AqVapo7NixmjlzpsX83OGNf/vtN82ePVuNGjWSk5OTxXd08OBB9e3bVz4+PnJyclLt2rX13HPP5RmO+qGHHpKdnV2e+Y0aNZLJZNJrr71mMX/evHkymUxasWKFzfnlli1b1K5dO1WuXFleXl4aNGiQzp07d8PvCiiv6KkBoFhkZmaqQ4cO2r17t/7xj39o9OjRSk5O1ooVK7Rx40atWLFCvXr1yrPeG2+8oW3btqlv377q1q2bvvjiC73++uv6/vvvtW7dOpvGAv3888916dIlOTk5qXHjxgoNDS32bu+PPfaYJk+erIMHD+rAgQMKDg4uNJ7u3buratWq6tmzp/z9/XX27Fnt27dPH374of71r3+pVq1amjx5sqZMmaKaNWtaXEhdfzP3f//7nzZu3Khu3bpp+PDhunTpUqGx/vnnnwoJCdFPP/2kpk2b6qmnnlJOTo4OHz6s6dOna8yYMVbtf/z48ZoxY4bq1q2r/v37y83NTadPn9ZXX32lL7/8Ug888IB5ndDQUMXHx2vr1q02jQtarVo1vfTSS3rxxRc1e/Zsvfzyy1ave63Tp0+rTZs2SkxM1IMPPqgmTZroyJEjioiIKPRpwb179+o///mPQkNDNWzYMH3//fdavXq19u/frwMHDsjZ2dmmn5U1srOz1a1bN23dulVNmjRR//79df78eY0ZM6bQ7+7ixYtq27at3N3dNWDAAPPfWadOnZSQkKCgoCBJfw8dFxsbq99//91iGLkbxbp161YdO3ZM999/v+6///4bHkd+w4VlZmaqffv2unTpkrp37y5HR0f5+vpKkt58802NHj1anp6e6t+/vypXrqw1a9boueee01dffaWPP/7Y/E6bkJAQffrppzp37py8vLwk/Z2Q5xYUt27dah4qTvo7Gbjnnnvk6+ur0NBQHT9+XIsWLVJISIjFd3r9MHUvvPCCtm3bpm7duikiIkKrV69WZGSksrKyNG3atBt+BwAAQMrKyjLfpLv+euOTTz7Ro48+KkdHR/ONws2bN2vKlCnauHGjtm7dKicnpxteb1WtWlUXL17Up59+WuBQTr/88ovatWun5ORkde/eXY0aNdLBgwf1wQcfaO3atfr6669111135Vmvb9++2r9/v3r06KGMjAx9+OGH6tatm3bu3Klhw4bpr7/+0iOPPKKzZ8+ar72OHTsmd3d3q7+jffv2adasWbp69arq1q2riIgIubm5Wb2+Ne6++2717dtXixcv1urVqzVq1KgC2/7xxx+69957dfnyZXXt2lV9+/ZVWlqafvnlF8XExOiNN96QZP115a+//qr77rtPjRo10qBBg3T+/Hk5OjoWuH/DMNSvXz+tWLFCd955p/r16yd3d3cdP35cK1asUOfOnVWjRo0b7t+avCtXZGSkpkyZosmTJ9s88sD06dN133336cUXXzQXvGx1u+YABXnllVc0depU+fv769///rfs7e31v//9T4cPHy50vX79+umbb75Rly5dZGdnp48++kgjRoyQg4ODhg4dKknmv+/4+HgNGjTIXMy4/lr9eunp6VqxYoVcXV313HPP3fAYChreeNSoUdq9e7e6du2qbt26mfOVnTt3KiIiQpmZmXrkkUdUq1Yt7d69W3PmzNHnn3+uXbt2mXOTsLAwffrpp4qPj9fDDz8sSUpOTtZPP/0k6e985drcNrdoFBoaqoyMDKvzyzVr1mjt2rXq3r27nn76aW3fvl2LFy/W0aNH8zzoBVQYBgDYSJJRs2ZN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OYfkFim2bdumpKQkHTlyRGFhYapSpYpatGhhUdTIzW9sRb4C5EVRA8BNy00Azpw5k+/y3Pn5JQoFPUGTnJxc4IWbtXKfvklPT7+p7VwrJydH27dvlyS1bNnyhu179eql7du36/z581q3bp3+9a9/KT4+Xp06dbL5iQpbXpqe+3I1a58eK4yDg4NeeOEFHTx4UKdPn9ayZct0//33a/HixRowYMBNb/96PXv2VNu2bbVs2TKru/RL//f7dfbs2XyXF/T7WVrc3d1vy1hzn7rKvfguioJ+V290rkhOTs5znrg2Sdi2bZu8vb0VHBysKlWqqGXLltq6dasOHDigP//8s0hPPQEAgOKT++Tzd999Z553M7mCrW7lvoqLt7e3DMNQRkZGsW0z92XE1uQrjRs31ieffKLz589r165deuWVV3TmzBn17dvX5ofDbMlXcnO94shXpOLNu27E399fo0eP1m+//ab58+fbtO7tmgPkp7D8qjRjbdmypRwcHJSQkHBTPbzy+30tyjkkNwfZunVrnt4YYWFh+uabb3T58mVt375dQUFBRXoIC0BeFDUA3DR3d3fVqVNHv/76a74XpfHx8ZKkpk2b5ln21Vdf5Zm3d+9eZWRk5NveFt98840kqVatWje1nWstWbJEv//+u4KDgy3eBXIj7u7u6ty5s959910NHjxYycnJ5vgkqVKlSsX6hEWLFi1UqVIlbd261aonyKzdf0BAgPr166f169erXr162rx5c7EmYLmmT58uwzD00ksvWb1O/fr15eTkpISEhDxPTBmGod27dxdLbMX1s2rSpIkuX76sH3/8Mc+ynTt33vT2pb97vki2Pb3Tvn171axZUzt27DAX8IpL7rAOuYn2tb799tt8/+6vfa/G1q1bFRoaak5A2rdvr2+++UZr1661aJurKMcPAACK7vz585L+fhAoV2H//p8+fVpHjx5VnTp15ObmZp5f2PVWYf++515HbN++Pc8QNYZhmHOPm80ziktqaqoOHz6sqlWr3vQDXbl+/vlnffTRR3JyctLDDz9s9XoODg667777NGXKFL311lsyDMN8jSUV/3VVlSpV1LBhQx07dky//PLLDdtbu/8b5V3F5cUXX5SXl5emTp1q04312zUHyE+TJk0k5R9XacZauXJl9e7dW+np6cU+1HRh56v09HTt3btXLi4uql+/vnl+bm/x3HzljjvuUFBQkKS/85WsrCy98847+vPPP/Md1qq47wUAFQVFDQDFYtCgQbpy5YrGjx9vkUAcOHBACxculIeHhx566KE86y1ZskQHDx40f7569aomTJhg3uaNJCUl6ejRo3nmnz592vyy6NwX+d2M7OxsffDBB3r66adlZ2enWbNm3fBJpC1btphfYnyt3N4p177IztPTU6dOnbrpOHP5+vrqn//8p/kljvnFcPXq1RvuPzMzU19++WWepPDy5cu6dOmSHBwczBeiknTixAkdPnz4pnvHtG3bVj169ND69eu1Y8cOq9ZxcnLSI488oqSkJL311lsWy3JfYF4ciutnldvLZdKkSRaJ/+HDh7Vo0aKb3r4k88sVbYnX3t5ec+fOlclk0iOPPKLNmzfn264oT7z1799f9vb2mjVrlv744w/z/CtXrpgLWIMHD7ZYp1GjRvLx8dGqVav0yy+/WPTGCAsL05UrVzR79ux8u3IX5fgBAEDR5OTkKCYmRpLle/N69uwpDw8PLVy40OK63zAMjR8/XleuXMnz739h11uF/fteo0YNhYWF6eDBg/rggw8sln3wwQc6ePCg2rdvr8DAwCIdY1Hl1+MhIyNDQ4cOVUZGhh599FGbejkUZMeOHerUqZMyMzM1fvz4Gw7ttGfPnnx7zuc+jX59viIV73XViBEjlJ2dreHDh+d5UOqvv/4yF8lutH9b8q4///xThw8fvulhdN3d3TVx4kSdPXtWb775ptXr3a45QH4effRRVapUSbNmzdK5c+fM8y9fvqxp06bd1LZzFTXWqKgoeXt769VXX9Vbb72Vb1EgIyPD5uHB2rZtq7p162rdunV58qDo6Gj9+eef6tevX553x4SGhurnn3/W6tWrLR7Catu2rRwdHTV9+nRJ+b9Po7jvBQAVhX1pBwCgfBg3bpw+//xzLVmyRIcOHVKHDh109uxZrVixQleuXNHixYstnr7KFR4ervvuu0+PPvqoPD099cUXX+jAgQPq1KmTHnvssRvu9/Dhw2rfvr3atWunBg0ayNPTU8ePH9fatWt1+fJlDRo0yPziOGtt3rzZfFGcnp6uU6dOafv27Tp9+rQ8PT21ZMkShYeH33A7Y8aM0YkTJxQaGqpatWrJZDJpx44d+vbbb9WmTRu1bdvW3LZ9+/b66KOP9Mgjj6hZs2ays7NT165d833ZsrXefvttHThwQNOmTdMXX3yh9u3byzAM/fzzz9q4caPOnDljHqaqoP0HBgaqQ4cOqlOnjlq1aqUaNWooLS1Na9euVVJSkl588UWLC7rHH39c8fHx5ifqb0Z0dLQ+//zzfItWha2zefNmvfDCC9q6dauaNm2qI0eOaO3atercubPWr1+vSpVurp5fXD+rJ554QkuWLNFnn32m5s2bq1OnTjp//rzi4uLUsWNHrVmzplhi/fjjj9W7d289+OCD5hd4d+3atdD1unXrpsWLF+vf//63OnbsqKZNm6p169by9PTUhQsXdPToUW3ZskWVKlW64UsCr1W3bl1Nnz5dY8aMUePGjdWnTx9VrlxZa9eu1eHDh9WzZ898/+5DQ0P10UcfSbJMBNq0aSMnJyedPXtWTZo0kZeXl8V6DRo0UEBAgOLi4uTq6qrq1avLZDLp6aefLranIQEAqIh+/fVXRUZGmj+fPXtWW7du1aFDhxQYGGjxbjR3d3e999576tevn1q1aqW+ffvqjjvu0JYtW7R3717de++9euGFFyy2X9j1VuvWreXi4qI5c+ZYvJ8g9wGJefPmqV27dho6dKjWrFmjhg0b6qefftJnn32mO+64Q/PmzSv5L+g67dq1U8OGDdW8eXMFBAQoOTlZmzdv1smTJ9WkSRNFRUXZtL1rv/+srCxzb4QDBw7Izs5OL7/8slUvH//www/19ttvKzQ0VHfddZfc3d31008/6YsvvpC3t7eefPJJc9uiXlcW5umnn1Z8fLw++ugj1atXTz169JC7u7tOnDihDRs2aMGCBeYH4wrbvy1519y5czVlyhRNnjzZ4ne4KIYPH64333zTpnzlds4Brle/fn299NJLioqKUnBwsHr37i17e3utXLlSwcHBOnDgwE3HGhYWJpPJpIkTJ+rw4cPy8PCQh4eHnn766ULXq1mzpjZs2KBevXrp2Wef1cyZMxUWFqY777xTGRkZOn36tDZs2KDU1FSrcvdclSpVUmxsrDp16qQHH3xQvXv3Vs2aNfXNN9/oyy+/VN26dS3eGXTtcfzvf//T2bNnLfIVFxcXtWrVSl999VWB79MoiXsBQIVgAICNJBk1a9bMMz8tLc2YNGmScffddxuOjo5G1apVjS5duhhfffVVnraTJ082JBlbt2415s+fbzRs2NBwcnIyqlevbrz00ktGenq6VbGc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AACKhqIGAAAAAAAAAAAoEyhqAACACsNkMmn16tVWt9+2bZtMJpMuXrx4U/s6fvy4TCaT9u3bZ/X6sbGxqlq1qs37vRmRkZFq2rTpLd0ngPKDc2zhOMcCAAAUD14UDgAArNZ9efdbur81/dYU6/YSExNVrVq1Yt1mZGSkVq9eXejNtMDAQCUmJsrb27tY9z148GBdvHjRppuIFcH58+c1efJkbdy4USdPnpS3t7ceeughTZ06VR4eHuZ2Fy5c0DPPPKPPPvtMktSjRw/FxMRY3Oh89tlntWPHDh04cED33HNPnp/z8ePHVbt27TwxrFu3Tp07d75hrCtXrtS8efO0b98+ZWZmqlGjRoqMjFSnTp0s2n3yySeaNGmSjh49qrp162ratGl6+OGHzcujo6O1cuVKHT58WC4uLmrTpo2mT5+u+vXr57vfYcOG6d1339Xs2bM1evToG8aJW6T7rT3Hag3n2MJwjs0f51jOsQAAlDZ6agAAgArDz89PTk5Ot3y/dnZ28vPzk709z5PcCn/88Yf++OMPzZw5U/v371dsbKzWr1+vIUOGWLTr37+/9u3bp/Xr12v9+vXat2+fBg4caNHGMAw9+eST6tu3b6H73Lx5sxITE81T+/btrYp1+/bt6tixo7744gslJCQoLCxM3bt31/fff29us2vXLvXt21cDBw7UDz/8oIEDB6pPnz765ptvzG3i4+M1YsQI7d69W5s2bdLVq1cVERGhy5cv59nn6tWr9c033yggIMCqGAFrcY6tGDjHco4FAKC0UdQAAADlRmhoqJ555hmNGzdOnp6e8vPzU2RkpHn59UOj7Ny5U02bNpWzs7NatGih1atX5zuESUJCglq0aCFXV1e1adNGR44ckfT38CVTpkzRDz/8IJPJJJPJpNjY2Dxx5Tc0ymeffaZ69erJxcVFYWFhWrRoUb7DsGzYsEH33HOPqlSpos6dOysxMVHS308vL1q0SJ9++ql539u2bbvhd3Tq1Ck9+uij8vT0VOXKldWiRQuLGzeStGTJEtWqVUseHh569NFHdenSJfOy9evXq127dqpataq8vLzUrVs3HT16NM+xrly5UmFhYXJ1dVWTJk20a9cui3289957CgwMlKurqx5++GHNmjUrz1Awa9asUfPmzeXs7Kw6depoypQpunr16g2PMSgoSJ988om6d++uunXrqn379po2bZrWrFljXv/QoUNav3693n//fbVu3VqtW7fWe++9p7Vr15p/vpL01ltvacSIEapTp06h+/Ty8pKfn595cnR0vGGckjRnzhyNGzdOLVu2VL169RQVFaV69eppzTVP0M+ZM0cdO3bU+PHj1aBBA40fP14dOnTQnDlzzG3Wr1+vwYMHq1GjRmrSpIkWLlyoEydOKCEhwWJ/p0+f1siRI/Xhhx/KwcHBqhjLsujoaJlMJosnpQ3DUGRkpAICAuTi4qLQ0FAdPHjQYr3MzEyNGjVK3t7eqly5snr06KFTp07d4uhvP5xjt93wO+Icyzm2Ip1jAQAoLRQ1AABAubJo0SJVrlxZ33zzjWbMmKFXX31VmzZtytPu0qVL6t69u4KDg/Xdd99p6tSpevHFF/Pd5sSJE/XGG29o7969sre315NPPilJ6tu3r8aMGaNGjRqZnx690dOm0t83pR555BE99NBD2rdvn4YNG6aJEyfmaZeenq6ZM2dqyZIl2r59u06cOKGxY8dKksaOHas+ffqYb8IlJiaqTZs2he43LS1NISEh+uOPP/TZZ5/phx9+0Lhx45STk2Nuc/ToUa1evVpr167V2rVrFR8fr9dff928/PLly3r++ee1Z88ebdmyRZUqVdLDDz9ssY3c72zs2LHat2+f7r77bvXr1898s+vrr7/WU089pWeffVb79u1Tx44dNW3aNIv1N2zYoMcee0zPPPOMfvrpJ82fP1+xsbF52lkrJSVF7u7u5ie5d+3aJQ8PD7Vq1crc5r777pOHh4d27txp8/Z79OghHx8ftW3bVh9//HGRYpSknJwcXbp0SZ6enuZ5u3btUkREhEW7Tp06FRpnSkqKJFlsJycnRwMHDtQLL7ygRo0aFTnGsmLPnj1699131bhxY4v5M2bM0KxZszR37lzt2bNHfn5+6tixo8WN5dGjR2vVqlWKi4vTjh07lJaWpm7duik7O/tWH8Zth3NswTjHco6tSOdYAABKE/1zAQBAudK4cWNNnjxZklSvXj3NnTtXW7ZsUceOHS3affjhhzKZTHrvvffk7Oyshg0b6vTp0xo6dGiebU6bNk0hISGSpJdeekldu3bVX3/9JRcXF1WpUkX29vby8/OzOsZ33nlH9evX13/+8x9JUv369XXgwIE8N5OuXLmid955R3Xr1pUkjRw5Uq+++qokqUqVKnJxcVFmZqbV+162bJnOnj2rPXv2mG/E3HXXXRZtcnJyFBsbKzc3N0nSwIEDtWXLFnNs//znPy3aL1iwQD4+Pvrpp58UFBRknj927Fh17dpVkjRlyhQ1atRIv/76qxo0aKCYmBh16dLFfPPw7rvv1s6dO7V27Vrz+tOmTdNLL72kQYMGSZLq1KmjqVOnaty4ceafr7XOnTunqVOnatiwYeZ5SUlJ8vHxydPWx8dHSUlJVm+7SpUqmjVrltq2batKlSrps88+U9++fbVo0SI99thjNsUpSW+88YYuX76sPn36WMTq6+tr0c7X17fAOA3D0PPPP6927dpZ/EymT58ue3t7PfPMMzbHVdakpaVpwIABeu+99/Taa6+Z5xuGoTlz5mjixInq1auXpL9v0vv6+mrZsmUaNmyYUlJStGDBAi1ZskTh4eGSpKVLlyowMFCbN2/OMxZ/RcM5tmCcYznHVpRzLAAApY2eGgAAoFy5/qlsf39/JScn52l35MgRNW7cWM7OzuZ599577w236e/vL0n5btNaR44cUcuWLS3m5bdvV1dX88223H3fzH737dunZs2aWTxZer1atWqZb7blt8+jR4+qf//+qlOnjtzd3c0vcD1x4oTFdgr7zo4cOZLneK//nJCQoFdffVVVqlQxT0OHDlViYqLS09OtPubU1FR17dpVDRs2zHOjzmQy5WlvGEa+8wvi7e2t5557Tvfee69atGihV199VcOHD9eMGTOs3kau5cuXKzIyUitWrMhzM/D6mAqLc+TIkfrxxx+1fPly87yEhAS9+eabio2Nten4yqoRI0aoa9eu5qJErmPHjikpKcniqWwnJyeFhISYn8pOSEjQlStXLNoEBAQoKCioSE+YlzecYwvGOZZzbEU5xwIAUNroqQEAAMqV68ewNplMeYbtkPK/YWEYxg23mbtOftu0lrX7zu9YCorRGi4uLjdsc6Pvr3v37goMDNR7772ngIAA5eTkKCgoSFlZWQVu5/rvzJrjz8nJ0ZQpU8xP01/r2pukhbl06ZI6d+6sKlWqaNWqVRYx+fn56cyZM3nWOXv2bJ4ndm1133336f3337dpnRUrVmjIkCH63//+l+dGvJ+fX54nhpOTk/ONc9SoUfrss8+0fft2Va9e3Tz/q6++UnJysmrUqGGel52drTFjxmjOnDk6fvy4TfHezuLi4vTdd99pz549eZblfo/5PZX9+++/m9s4OjqqWrVqedoU9OR2ZmamMjMzzZ9TU1Nv6hhuZ5xjC8Y5lnNsRTjHAgBwO6CnBgAAqJAaNGigH3/80eJG5N69e23ejqOjo83j7Ddo0CDPDddbse/GjRtr3759On/+vM37kv4eYuTQoUN6+eWX1aFDB91zzz26cOGCzdtp0KCBvv32W4t51x//P/7xDx05ckR33XVXnqlSpRtfwqampioiIkKOjo767LPP8tyka926tVJSUizi+Oabb5SSknLDcfNv5Pvvvzc/OW2N5cuXa/DgwVq2bJl5OJnrY73+nQUbN260iNMwDI0cOVIrV67Ul19+aX66O9fAgQP1448/at++feYpICBAL7zwgjZs2GDjEd6+Tp48qWeffVZLly4t9MasLU9lW9MmOjpaHh4e5ikwMND24MsZzrG24xxrHc6xAACAnhq3qe7Lu5d2CLe1Nf3WlHYIAIAyrn///po4caL+/e9/66WXXtKJEyc0c+ZMSfkPmVGQWrVq6dixY9q3b5+qV68uNzc3OTk5FbrOsGHDNGvWLL344osaMmSI9u3bp9jY2CLte8OGDTpy5Ii8vLzk4eGR5ynga/Xr109RUVF66KGHFB0dLX9/f33//fcKCAhQ69atb7i/atWqycvLS++++678/f114sQJvfTSS1bHm2vUqFF64IEHNGvWLHXv3l1ffvml1q1bZ3Hsr7zyirp166bAwED17t1blSpV0o8//qj9+/dbvCMhP5cuXVJERITS09O1dOlSpaammp+cv+OOO2RnZ6d77rlHnTt31tChQzV//nxJ0r///W9169ZN9evXN2/r119/VVpampKSkpSRkaF9+/ZJkho2bChHR0ctWrRIDg4OatasmSpVqqQ1a9borbfe0vTp0636LpYvX67HH39cb775pu677z7z08IuLi7y8PCQJD377LN64IEHNH36dPXs2VOffvqpNm/erB07dpi3M2LECC1btkyffvqp3NzczNvx8PCQi4uLvLy85OXlZbFvBwcH+fn5WRxvWZeQkKDk5GQ1b97cPC87O1vbt2/X3LlzdeTIEUl/98a49qbotU9l+/n5KSsrSxcuXLDorZGcnFzgzdjx48fr+eefN39OTU2t8IUNzrGcYznHlr9zLACUWd25z1qoNWXvPis9NQAAQIXk7u6uNWvWaN++fWratKkmTpyoV155RZL1Q29If7/UtXPnzgoLC9Mdd9xhMcZ2QWrXrq2PP/5YK1euVOPGjTVv3jxNnDhRkm54s+5aQ4cOVf369dWiRQvdcccd+vrrrwtt7+joqI0bN8rHx0cPPviggoOD9frrr8vOzs6q/VWqVElxcXFKSEhQUFCQnnvuOfOLeG3Rtm1bvfPOO5o1a5aaNGmi9evX67nnnrP43jt16qS1a9dq06ZNatmype677z7NmjVLNWvWvOH2ExIS9M0332j//v2666675O/vb55Onjxpbvfhhx8qODhYERERioiIUOPGjbVkyRKLbf3rX/9Ss2bNNH/+fP38889q1qyZmjVrpj/++MPc5rXXXlOLFi3UsmVLxcXF6YMPPtBzzz1n1Xcxf/58Xb16VSNGjLCI89lnnzW3adOmjeLi4rRw4UI1btxYsbGxWrFihVq1amVuM2/ePKWkpCg0NNRiOytWrLAqjvKiQ4cO2r9/v8XT0i1atNCAAQO0b98+1alTR35+fhZPZWdlZSk+Pt5csGjevLkcHBws2iQmJurAgQMFFjWcnJzk7u5uMVV0nGM5x3KOBQAAJcVk3MygoeVEamqqPDw8lJKSctskIPTUKBw9NQCgZP311186duyYateubdPNp7Luww8/1BNPPKGUlBSrxkYvTtOmTdM777xjcUOoIhk6dKgOHz6sr776qrRDwXUKOx/cjtfR1wsNDVXTpk01Z84cSdL06dMVHR2thQsXql69eoqKitK2bdt05MgR8wucn376aa1du1axsbHy9PTU2LFjde7cOSUkJFh1g7qw76Winl8lzrGliXPs7akinw8A4Jaip0bhbqOeGtbmFww/BQAAKqzFixerTp06uvPOO/XDDz/oxRdfVJ8+fW7Jzba3335bLVu2lJeXl77++mv95z//0ciRI0t8v7eLmTNnqmPHjqpcubLWrVunRYsW6e233y7tsFABjBs3ThkZGRo+fLguXLigVq1aaePGjeaChiTNnj1b9vb26tOnjzIyMtShQwfFxsZa/cQ9/sY5tvRwjgUAAOUZRQ0AAFBhJSUl6ZVXXjGPr9+7d29Nmzbtluz7l19+0Wuvvabz58+rRo0aGjNmjMaPH39T24yKilJUVFS+y+6//36tW7fuprZfnL799lvNmDFDly5dUp06dfTWW2/pX//6l1Xrfvjhhxo2bFi+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z7PMZDJZfDYMI8+86xXWZvz48UpJSTFPJ0+eLHrgAAAAAAAAAADglrgtihqjRo3SZ599pq1bt6p69erm+X5+fpKUp8dFcnKyufeGn5+fsrKydOHChQLbXM/JyUnu7u4WEwAAAAAAAAAAuL2ValHDMAyNHDlSK1eu1JdffqnatWtbLK9du7b8/Py0adMm87ysrCzFx8erTZs2kqTmzZvLwcHBok1iYqIOHDhgbgMAAAAAAAAAAMo++9Lc+YgRI7Rs2TJ9+umncnNzM/fI8PDwkIuLi0wmk0aPHq2oqCjVq1dP9erVU1RUlFxdXdW/f39z2yFDhmjMmDHy8vKSp6enxo4dq+DgYIWHh5fm4QEAAAAAAAAAgGJUqkWNefPmSZJCQ0Mt5i9cuFCDBw+WJI0bN04ZGRkaPny4Lly4oFatWmnjxo1yc3Mzt589e7bs7e3Vp08fZWRkqEOHDoqNjZWdnd2tOhQAAAAAAAAAAFDCSrWoYRjGDduYTCZFRkYqMjKywDbOzs6KiYlRTExMMUYHAAAAAAAAAABuJ7fFi8KB/9fencfVmP7/A3+dTosSIS2WslWEIUpEtsi+NBNhGGNkX8sSQkIkZd9KZYix77sh2VNEdkn2PXtp71y/P/y6vzWWz8wwTsd5PR+PHjOde5n3PV3nvu/rel8LEREREREREREREdH/wqQGERERERERERERERGpBCY1iIiIiIiIiIiIiIhIJTCpQUREREREREREREREKoFJDSIiIiIiIiIiIiIiUglMahARERERERERERERkUpgUoOIiIiIiIiIiIiIiFQCkxpERERERERERERERKQSmNQgIiIiIiIiIiIiIiKVwKQGERERERERERERERGpBCY1iIiIiIiIiIiIiIhIJTCpQUREREREREREREREKoFJDSIiIiIiIiIiIiIiUglMahARERERERERERERkUpgUoOIiIiIiIiIiIiIiFQCkxpERERERERERERERKQSmNQgIiIiIiIiIiIiIiKVwKQGERERERERERERERGpBCY1iIiIiIiIiIiIiIhIJTCpQUREREREREREREREKoFJDSIiIiIiIiIiIiIiUglMahARERERERERERERkUpgUoOIiIiIiIiIiIiIiFQCkxpERERERERERERERKQSmNQgIiIiIiIiIiIiIiKVwKQGERERERERERERERGpBCY1iIiIiIiIiIiIiIhIJTCpQUREREREREREREREKoFJDSIiIiIiIiIiIiIiUglMahARERERERERERERkUpgUoOIiIiIiIiIiIiIiFQCkxpERERERERERERERKQSmNQgIiIiIiIiIiIiIiKVwKQGERERERGpDV9fX8hksgI/pqam0nYhBHx9fVG2bFno6uqiWbNmuHLlihIjJiIiIiKi/JjUICIiIiIitVKjRg08fvxY+rl06ZK0bfbs2Zg7dy4WL16MM2fOwNTUFM7OzkhJSVFixERERERElIdJDSIiIiIiUiuampowNTWVfoyMjAC8H6Uxf/58TJw4ET/99BNq1qyJVatWIS0tDWvXrlVy1EREREREBDCpQUREREREaiYxMRFly5ZFpUqV0L17d9y6dQsAcPv2bTx58gStWrWS9tXR0UHTpk1x6tSpT54vMzMTb9++LfBDRERERET/DSY1iIiIiIhIbdSvXx8RERE4cOAAQkND8eTJEzRs2BAvXrzAkydPAAAmJiYFjjExMZG2fYy/vz8MDAykHzMzs//0GoiIiIiI1BmTGkREREREpDbatm0LV1dX/PDDD2jZsiX27NkDAFi1apW0j0wmK3CMEOKDz/KbMGEC3rx5I/3cv3//vwmeiIiIiIiY1CAiIiIiIvVVtGhR/PDDD0hMTISpqSkAfDAq49mzZx+M3shPR0cHxYsXL/BDRERERET/DSY1iIiIiIhIbWVmZuLatWsoU6YMKlWqBFNTUxw8eFDanpWVhaNHj6Jhw4ZKjJKIiIiIiPJoKjsAIiIiIiKib2XMmDHo2LEjzM3N8ezZM/j5+eHt27f49ddfIZPJ4OHhgZkzZ8LS0hKWlpaYOXMm9PT08PPPPys7dCIiIiIiApMaRERERESkRh48eIAePXrg+fPnMDIyQoMGDXD69GlUqFABAODl5YX09HQMGTIEr169Qv369fHnn3+iWLFiSo6ciIiIiIgAJjWIiIiIiEiNrF+//rPbZTIZfH194evr+20CIiIiIiKif4RrahARERERERERERERkUpgUoOIiIiIiIiIiIiIiFQCkxpERERERERERERERKQSmNQgIiIiIiIiIiIiIiKVwKQGERERERERERERERGpBCY1iIiIiIiIiIiIiIhIJTCpQUREREREREREREREKoFJDSIiIiIiIiIiIiIiUglMahARERERERERERERkUpgUoOIiIiIiIiIiIiIiFQCkxpERERERERERERERKQSmNQgIiIiIiIiIiIiIiKVwKQGERERERERERERERGpBCY1iIiIiIiIiIiIiIhIJTCpQUREREREREREREREKoFJDSIiIiIiIiIiIiIiUglMahARERERERERERERkUpgUoOIiIiIiIiIiIiIiFQCkxpERERERERERERERKQSmNQgIiIiIiIiIiIiIiKVwKQGERERERERERERERGpBCY1iIiIiIiIiIiIiIhIJTCpQUREREREREREREREKoFJDSIiIiIiIiIiIiIiUglMahARERERERERERERkUpgUoOIiIiIiIiIiIiIiFQCkxpERERERERERERERKQSmNQgIiIiIiIiIiIiIiKVwKQGERERERERERERERGpBCY1iIiIiIiIiIiIiIhIJTCpQUREREREREREREREKoFJDSIiIiIiIiIiIiIiUglMahARERERERERERERkUpgUoOIiIiIiIiIiIiIiFQCkxpERERERERERERERKQSmNQgIiIiIiIiIiIiIiKVwKQGERERERERERERERGpBCY1iIiIiIiIiIiIiIhIJTCpQUREREREREREREREKoFJDSIiIiIiIiIiIiIiUglMahARERERERERERERkUpgUoOIiIiIiIiIiIiIiFTCd5PUWLp0KSpVqoQiRYrA1tYWx48fV3ZIRERERESkwljHICIiIiIqfL6LpMaGDRvg4eGBiRMn4vz582jcuDHatm2Le/fuKTs0IiIiIiJSQaxjEBEREREVTt9FUmPu3Llwd3dHv379YG1tjfnz58PMzAzLli1TdmhERERERKSCWMcgIiIiIiqcNJUdwJfKyspCXFwcxo8fX+DzVq1a4dSpUx89JjMzE5mZmdLvb968AQC8ffv2vwv0H8pOy1Z2CIVaYfpbFUYsP5/H8vO/sQx9HsvQ57H8fB7Lz+ex/HxeYSs/hS2er+Wf1jFUoX6BbH63/qfC9PcqjFiGPo/l5/NYfj6P5efzWH7+N5ahz2MZ+rxCVH7y3p+FEJ/dT+WTGs+fP0dubi5MTEwKfG5iYoInT5589Bh/f39MnTr1g8/NzMz+kxjp6zPoZ6DsEEiFsfzQl2IZoi/B8kNfguXn2/indQzWL74TBvx+0Rdg+aEvwfJDX4pliL5EISw/KSkpMPhMXCqf1Mgjk8kK/C6E+OCzPBMmTMCoUaOk3xUKBV6+fAlDQ8NPHqPO3r59CzMzM9y/fx/FixdXdjikYlh+6EuxDNGXYPmhL8Hy87/l9aAqVqyYkiP5b/zdOgbrF/8cv1/0JVh+6Euw/NCXYhmiL8Hy83lCCKSkpKBs2bKf3U/lkxqlS5eGXC7/oMfUs2fPPuhZlUdHRwc6OjoFPitRosR/FeJ3o3jx4vyy0b/G8kNfimWIvgTLD30Jlh/180/rGKxf/Hv8ftGXYPmhL8HyQ1+KZYi+BMvPp31uhEYelV8oXFtbG7a2tjh48GCBzw8ePIiGDRsqKSoiIiIiIlJVrGMQERERERVeKj9SAwBGjRqFX375BXZ2dnBwcMDy5ctx7949DBo0SNmhERERERGRCmIdg4iIiIiocPoukhrdunXDixcvMG3aNDx+/Bg1a9bE3r17UaFCBWWH9l3Q0dHBlClTPhhST/R3sPzQl2IZoi/B8kNfguVHvbGO8d/i94u+BMsPfQmWH/pSLEP0JVh+vg6ZyFvdj4iIiIiIiIiIiIiIqBBT+TU1iIiIiIiIiIiIiIhIPTCpQUREREREREREREREKoFJDSIiIiIiIiIiIiIiUglMahARERERERERERERkUpgUoOIiIiIiIiIiIiIiFQCkxpERERERERERERERKQSmNSgb06hUBT4XQihpEiIiIiIiIiIiIiISJUwqUHfnIbG+2J38uRJZGZmQiaTMbFBfxvLChF9S7zn0N/1104bRKQ8n/s+8r6uvvL+9hkZGUqOhL4XfPYTESkPkxqkFAcPHoS7uzv8/f2Z2KC/TaFQQCaTSb+zzNDf8bHKBssO5ZdXHuLj47Fv3z6sXLkSL1++/OCeQ/QpCoVC6rRx9+5dXL58GUIIqWzxnkP07eT/Pm7duhUhISEICgrCnTt3eF9XczKZDDExMahZsybu3Lmj7HBIxeQ9y588eYJHjx7h1atX0r2G6J/4VDKMSTL6GHbU+DSZUPf/A6QU7969w/jx43H+/Hm0bt0aXl5e0NHRgRCCFQ36qPwV1JCQEJw8eRLp6emwtbXF+PHjlRwdFVb5y83Ro0fx5s0bGBoawsHBgZUQKmDLli0YOnQoatSogRs3bsDMzAy9e/fGwIED+Vyiz8p/n/Hx8cG2bdtw9+5d2NnZ4ddff0W3bt1QpEgRvuMQfWNeXl74448/4ODggKtXr0JHRwcjR45Enz59lB0aKdHDhw/Rrl075OTkYN++fTA3N1d2SKQC8p7h27Ztw8SJE5GVlYUXL15gxIgRcHNzQ40aNZQdIqmI/O+NBw8exOvXr6GhoQFXV1cA4PsiFZC/vKxatQqXL1+GTCZD27Zt0bx5cwDqXWbYokP/uY/lzYoWLYqAgADY2dlh7969mD17NrKysjhigz4p70Y+btw4TJs2DeXKlYOjoyO8vb0xbNgwZGVlKTlCKmyEEFK58fb2xs8//4xJkybByckJo0aNwuXLl5UcIRUWZ8+exdChQ+Hv74/IyEhERkbi9OnT0khCos/Ju89MmzYNoaGhmD59Om7fvo2cnBzMnj0bS5YsQXp6Ot9xiL6htWvXYt26ddizZw82b96M6dOn48KFCyhdurSyQ6NvLP99VwiBcuXKYd++fTAwMICzszPu3bunxOhIVchkMkRFReHnn3/GgAEDEBYWhqlTp2LdunWYP38+rl+/ruwQSQXkr59OmDABgwYNgo+PD6ZOnQpnZ2e2idEH8reDjR07Fq9evcKpU6cwadIkBAUFAYBalxkmNeg/l9cgFBERgYULF0pfNj09PcycORP29vZYt24d5s2bx5s4fVZ0dDS2bt2K9evXw9/fH9WqVYO2tjZq164NbW1tZYdHhUzevScgIAARERHYtGkTLl68iIkTJ2LJkiWYM2cOExsEALhx4wZq166N3377DQkJCWjbti3c3d0xcuRIAO+nGSD6nHPnzmHXrl1YuXIlXFxccOnSJZw7dw4GBgYICQnB8uXLmdgg+obu3r2Lli1bwsbGBuvWrUPfvn2xZMkSdOjQAWlpabh//76yQ6RvJG/Kqfz1zLJly2LTpk0wNDREq1atmNigz8qb+mXbtm1o3749PDw80KxZM4wYMQL+/v44dOgQtm3bVmBfoo/Jq58GBQXh999/x7p163Dt2jX07dsXkZGRaN68Od69e8f3RSpg+fLl2LRpE/bt24ewsDAMGzYMMTExiIiIgJ+fH4D3ZUsd7z9MatB/Jv8X6tWrV9iwYQPWrVuHFStWFEhsLFiwQKr0T5o0CdnZ2ewZSwA+fCl8/fo1DA0N0bhxY2zbtg1dunTBggUL0L9/f7x58wYHDx5UUqRUmOQvN48ePUJ8fDwCAgLQsGFDbNu2DfPmzcOAAQOwZcsWzJgxAxcuXFBitKRMec+imzdvonjx4hBCoGXLlmjZsiVCQkIAADt27MCaNWuQnp6uzFCpkCtXrhyGDx+OZs2a4ciRI3Bzc8OCBQtw6tQp6OvrIyQkBLNmzUJGRgbfcYi+so9V4m/cuAEDAwOcO3cOAwYMwKxZszB48GAIIbBq1Sps2bIF2dnZSoiWvrXU1FR069YN9erVK5DYKFeuHFavXo2srCz07NkTt2/fVnaoVMjkvSc+ePAAwPsptPPuN3n3D1dXVwwaNAgLFixASkoKp7el/+n+/fs4d+4cgoODYW9vjz179mDKlCnw9vbGs2fP0LZtWyY21Fz+9xqFQoGnT5+iX79+sLW1xbZt2zBkyBDMmDEDderUwbJlyxAYGAgAann/Ub8rpm8i/7C6fv36Yfbs2Vi2bBkqVqyI33//HWFhYQW+qHXr1oWenh6ys7OhqamprLCpkMkrQ3PnzsW+fftQvHhxaGlpYdGiRfj1118RFBSEgQMHAnjfS3bp0qVISkpSZshUCOSVm5MnT6JkyZLo3bs3OnTogLi4OHh6emLq1KlYsmQJJkyYgF27dmH69OlITExUctT0Lfy1YpDXuNy6dWscOHAARYsWhaurK0JCQqRydOjQIcTExCAnJ+ebx0uF08caUI2MjNCxY0fo6OggLCwMvXv3lubtt7KyQmZmJl6+fAkdHZ1vHC3R9y/vfn3+/Hm8fPkSANC9e3eEhYXBzs4OISEhGDx4MAAgPT0dO3fuxL1796ClpaW0mOnbuHbtGvT19bF161ZkZmaiefPmUmIDAMzNzfHDDz/g5MmTcHNz47OeCpDJZNiwYQOqV6+Ox48fo1q1avjzzz9x9+5daGlpSeXFwsICxsbGbICmj/rre6OZmRlcXFxQv359aQrcgIAA+Pn5oU+fPjhx4gTq1KnDjjBqKv8aGleuXIGGhgaGDBmCX3/9FXfv3sWkSZMwadIkjBs3Dp6ensjIyMDixYsRFham5MiVg0kN+uryL1Jz+/ZtxMTEwNnZGebm5li0aBHKli2LiIgIhIaGIicnBwqFAikpKZg2bRrmzp3LjDQVePCHhYVhzpw5KF26NAwNDZGdnY3Ro0dj9OjRUkIjIyMDc+bMgZ6eHipXrqyssEnJ8pcbLy8vODs74+3bt2jSpAkMDAywd+9e1KpVC+7u7gDeN4I0aNAAGhoaqFKlirLCpm8gb5RFbm4uAODSpUvYtm0brl+/jpSUFNSvXx8DBw5E8eLFUbVqVQDve1F5e3tj7dq1mDp1KooVK6a0+KnwyF/ROHz4ME6cOCFVOEqWLAkhBJ49e4bs7GzI5XIAgKamJpYtW4YFCxbwHYfoK8r/3N+zZw86dOiA9evX4+3bt2jcuDHc3d1hamqKtLQ0vHr1ChcuXICrqyuePHmC2bNnKzFy+haePn2KevXqITQ0FHXr1sXatWuRnJwsJTYAQEtLC5UrV8ahQ4ewdetWdq5TY39dewV4PzIjOjoa06dPR5kyZTBs2DA0atQIzZs3x+3bt6XycvLkSejp6Sklbir88t4bIyMjceXKFQCAm5sbypQpgxMnTqBu3bro1asXAMDU1BS9e/dG06ZNmXhXQ/nrGf7+/mjZsiViYmJgaGiIcuXK4fLlyxBCoFu3bgCAt2/folmzZvDy8kLfvn2VGbrSMKlBX11eQmPOnDmYPHkyGjVqhKZNmyInJwelS5fGkiVLULFiRYSEhMDW1haOjo6Ii4tD586dpXngmJFWb3k38ri4OFy+fBkzZsxAvXr1UK1aNYwaNQpGRkZISEhAeHg4Nm7ciI4dO+LevXtYtWqV2s4lSP9Xbh48eAANDQ3s2bMHJiYmUiXj2bNnyMrKQkpKCoQQiI6OxtChQ7Fx40ZoaGiw3HynVqxYgUmTJuHZs2fQ1NTEpk2bpHmQnZycMGPGDDx9+hSjRo1Cz5494enpicqVK6Njx47YvHkzDh06hOrVqyv7MqiQyLvPjB8/Hi4uLujduzeaN2+OzZs3A3g/HUW5cuUQExMDd3d3NG3aFPHx8WjRooV0n+E7DtGXyz8qPDw8HNeuXcPz588xc+ZMrF+/HlpaWvDw8MAvv/yCESNGoHr16vjll1+QlZWF2NhYaGpqSolu+j7p6enhp59+QlxcHHJzc1G7dm2sW7cOL168QL169TB37lwMHDgQGzduhKWlJczMzJQdMinRmTNnpH+XyWQ4ffo0bG1tcf78eTRt2hQAoKuri8DAQFhZWaFmzZpo0aIFWrZsifDwcAQHB6N48eLKCp8Kofx1yzNnzqBz585YsWIFbt26JX1+48YNXLx4Efr6+khPT8fu3btRtWpVhIaGQi6X8zmlRnJzc6X3mhEjRmDy5Ml4/fo1Xrx4Ie0jl8uhUCiwf/9+PHnyBIGBgShXrhyGDBkCDQ0NtSwvMsHuYvSV5M8qpqSkYPLkyQgNDYWDgwMOHToEAMjKyoK2tjbevHmD3bt34+zZs9DV1cW0adOgqalZ4Byk3qKjo+Hk5AS5XI65c+diwIAB0rYNGzZgy5Yt+PPPP1GnTh2YmJhg9erV0NLSQm5urtQ7ltTPhg0b0KtXL1SuXBnbt2+HtbW1tG3Hjh3o3r07ateujVevXkFTUxMXLlyApqZmgRFm9H0ZOXIkjhw5AhcXF7i6umLMmDHo2rUrfvrpJwQHB2Pnzp2oXbs2pk2bBlNTU1y4cAExMTGoXLkyrK2tUa5cOWVfAhUC+e8R165dwy+//ILg4GDk5ORg586dmDVrFsLCwtC3b1+8evUKY8aMwevXr1GkSBGsXLkSWlpafMch+g9MmTIFCxcuxNKlS6FQKLBhwwbExsZi2rRp6NOnD7S1tZGUlISkpCQYGxujVq1a0NDQQE5ODnvlq4EtW7bg559/xokTJ1CvXj0A70diDho0CE+fPoVcLkdISAhsbGyUGygp1f79++Hm5oa7d+/CwMAAGhoaiIyMxKRJkxAfH4+zZ8+iRo0a0rtAdnY2wsPDcfv2bejq6uLnn3+GlZWVsi+DCpH8740zZ85ETk4OFixYgLS0NPTr1w8eHh6oUqUKLly4gDZt2kBLSwsGBgYQQiA+Pp7PJzU2ZswYhIWFIS4uDh4eHmjdujWGDRsGAHjy5AlGjBghTY1samqK06dPQ0tLS23bM5jUoK8uIyMDRYoUwd27dxEeHg4/Pz8sXboUgwYNAvC+F+PHhtKxMZr+aunSpRg/fjzatm2LWbNmoVKlStK27OxsvHz5EsWLF4euri4AsIJKiI6Oxpw5c7B7924cO3YM9vb2Be45u3fvRlxcHGQyGby9vaWemrz3fN8mT56MgwcPwtHREY8ePSrQm27RokVYs2YNateujfHjx3MKO/pA/mRERkYGrl69ij/++ANz5swB8H4R2qCgIEybNg3Lly9Hv379PnjX4fOJ6Ot79uwZmjVrBg8PjwKdX3r37o1du3YhICAAXbp0QalSpQocxwTj9+vp06coVqxYgamA3NzckJ2djVWrVhXoSf/mzRtoamqiaNGiygiVCpG0tDS8ffsWpqamePDgAcqXL4+cnBwcP34cnp6eyMrKwpkzZ1C0aFE+z+kfmTVrFmbNmoXNmzejSJEiiI2Nha+vL3777TeMGjUKFSpUwMWLF7F582YUL14cHh4erJ+qMR8fH/j5+eH8+fOoXbs2mjZtCgcHB8yaNUuqWzx58gS3b9/G06dP0bFjR8jlcrW+L6nnVdN/Zvny5QgMDERMTAwqVKiAQYMGITMzE2PGjIGWlhbc3d2l3ooymaxAJpE3bfX1qcrlkCFDkJmZicDAQKxcuRL9+/dH+fLlAbwvLyYmJtK+Qgi1vZGrq4+VGwcHB0yZMgUvXrxAx44dcfLkSVhYWEgvAR06dECHDh2k/dX5BUAd5FUIpk+fjqysLKxbtw4AkJmZKe0zfPhwAMDGjRsxceJEBAQEwNzcXCnxUuGUd5/x9fXFiRMn8Pz5c5QoUQJv3ryBgYEB9PX1MWbMGADvn1sZGRlSjyqAzyei/0reKO+8BGJex6qIiAjY29tjzpw5kMlk6NmzZ4FGbiY0vk8JCQmoW7cu3Nzc0Lp1a3Tv3h0A4OrqCj8/Pzx69AjFixeXZg4wMDBQcsRUWOjp6UFPTw+JiYmoWrWq1CGzSZMmmD9/PkaPHo2mTZviyJEj0NfXl8oQ0edkZWXh4MGDGDx4MFq2bAkAcHR0RLFixTBkyBAoFAp4enqiVq1aqFWrlnQcExrqq23btujevbs09bGZmZm0NmReO+rt27fh4OAgHZObm6vW9Qy+0dFX1bhxY8hkMrRv3x4vX75E2bJlMWLECAwfPhyjRo3CihUrALyvTKjj0Cj6UP6G6e3bt2PRokVYsWIF7ty5AwDw9PSEh4cHwsPDERoaiocPHwL4sELK8qRe8pebjRs3Ys6cOfDz88OFCxfwww8/IDg4GDY2NnB2dsbNmzehpaWF7OzsD86jzi8A6iB/hSAgIAD9+vWDTCbD7Nmz8ezZM2nb8OHD0bFjR7x48YKL8pEk/1zIS5YsQUhICOzs7FCnTh0cO3YM4eHh0mKi+vr6GDt2LIYNG4b169cXWHCUzyeiL/exda9KlSqFMmXKYNWqVQCAIkWKSAtAW1paQkNDA7NmzcK5c+c+eQ5SfXn326pVq2LBggXQ1dWFu7s7fvzxR2zatAndunWDoaEh/Pz8AICN0VRAXvnJzMyEpaUlxo4di5EjR2LFihWQy+VwdHREUFAQZDIZWrRogZSUFJYh+p8UCgWEEMjKypKePXmdqvr37w93d3esXr0ay5cvx/379wscy4SGevjYO4mDgwOqV6+OnJwcAO+TGnlrsCgUCnTs2BG+vr4F6hlqX14E0b+Um5tb4HeFQiGEEOLGjRvC2tpa1KtXT7x48UIIIcSDBw+Et7e3kMlkYteuXd88Viqc8sqMEEKMGzdOGBsbC2dnZ1G2bFnRqVMnsXXrVmn77Nmzhbm5ufDw8BDPnj1TRrhUCI0dO1aYmpqK3r17i/r164uaNWuKBQsWCCGEOHv2rGjbtq2oXLmyuHbtmpIjpW8p796SlJQkEhISxKlTp6RtkydPFnXr1hWTJk0SycnJBY57+fLlN42TVENcXJzw9vYWO3fulD6bM2eO0NDQEPPnzy/wLEtPT5d+z/85Ef17+esc8fHx4ubNm+LRo0fS78bGxqJLly5CiP/73vXo0UOcO3dONGnSRDRr1uzbB03/uby/dVZWVoHPU1JSxMWLF0WnTp2EjY2NaNCggRg0aJAwMTER0dHRygiVCqHs7Gzp3/fv3y8GDRokFAqFePv2rZgyZYqQyWQiPDxc2vfIkSPCwsJCNGvWTCgUCj7jqYC/to3lGTdunChRooR48OCBEOL/yt3kyZNFkyZNRKlSpcSSJUs+ew76/uS/f4SGhgoPDw8xZ84ckZCQIIQQIicnRwghxNSpU4Wtra3IyckRHTp0EBYWFh8889Qdkxr0xTZu3Cj9e96XMyEhQVhbWwt7e3spsXH37l2xbNmyAi8QREIIMX/+fGFmZiZiY2OFEEIEBwcLmUwmnJycCpSvyZMni86dO/MlkoQQQmzatEmYmZmJs2fPCiGEWLt2rdDS0hKbNm2S9rl48aKws7MTP/30k7LCpG8s7/6wdetWYW1tLWrWrClMTExE165dxcOHD4UQQkyYMEHUrVtXTJkyRTx9+lSZ4VIhplAoRFxcnJDJZEJTU1NEREQU2D5nzhwhl8vFwoULP3gu8TlF9PV5eXmJihUripIlS4quXbuKPXv2CCGE2LlzpzA1NRU1atQQrq6uwtbWVlhYWAgh3jcINGzYUJlh038g7x576NAh0atXL+Hm5iY8PT0L7JOSkiIuX74sfvvtN1GqVClRsmRJqWGR1FdoaKjUPpGZmSmEEOKXX34Ro0aNkvZ59+7dRxMbx48fF7du3fr2QVOhlj8ZcfjwYfHnn3+KS5cuCSGESEtLE02bNhUVKlQQN2/eFOnp6SI7O1u4uLiII0eOiIkTJwpDQ0Px5s0bZYVP31j+8jJ+/HhRunRp0bx5c1G7dm1Rp04dERMTI23fsmWLqFevnmjSpImwtLSUEhpsU/0/TGrQF7l3756Qy+Wibdu20md5L5lxcXGiePHion379h/0rOeXUL3l3cjzesMMGzZM6qGwZcsWUaJECTFp0iRRp04dYWdnJzZv3iwdyx6wlGfOnDnC1dVVCCHEhg0bRPHixcWyZcuEEO8rstevXxdCvE+ysueLejl8+LDQ19cXoaGhIjU1Vezbt0/IZDLxxx9/SPtMnDhRVKpUScyYMYPlgz5r9erVQiaTiYEDB34wumfevHlCJpMVSMAT0deR/13v0KFDolKlSuLw4cMiLCxMdOnSRdSrV0/s2LFDCCHEw4cPxbBhw8SAAQOEh4eHVPH/+eefhZubm8jKyuK743dm69atonjx4mLw4MFi4sSJwsLCQrRp00akpaV9sO+pU6eY0CBx//59UbVqVVG9enXx6tUr6XMXFxfh4+NTYN/U1FQxZcoUoa2tLdVTif4q/3Nl1KhRomzZsqJ48eKiYcOGYtasWUIIIW7evClatWol9PT0RL169YSVlZWwtLQU2dnZYu3ataJ69eofvW/R9+3GjRti8ODBIi4uTgghxPHjx0WXLl2EhYWFOH36tBBCiKNHjwqZTCZq1qzJhMYnMKlB/0j+m3bekKioqChRrlw50bFjxwL7Pn/+XNjZ2QmZTCZ+++23bxonFV75H9jnz5+X/vn06VNx5coVYWFhIebNmyeEeJ/g0NfXF3Z2duLAgQPScayUqp+PNTp7eXmJYcOGiVOnTgl9fX2xdOlSaVtERISYOXOmSE9P/+w56PuSd2/w8fERgwYNEkK8r0hYWFiIAQMGFNhHiPc9eNnjjvLkv0f89TmTN4LQ19f3g2nK1q9fzwoG0X9o27ZtYvDgwSIgIED6LDY2VvTq1UvY2dkVGKGZ58WLF8LDw0OULl1aXLly5VuGS9/AxYsXRdWqVaXG5jt37oiyZcsKDQ0NUb9+fam+kdcTn0iI98/2o0ePikaNGolatWpJz3MXFxcRGBgohChYV3379q0YPXq0KFWqlHj9+jXroFRA/vJw5swZUa9ePXHmzBkRFxcnRo0aJerUqSOmTJki7RMeHi4CAgLEnDlzpPfGwYMHCycnJ5GSkvKtwycl2rBhg6hQoYKwt7cv0AE8NjZWdOnSRVhaWkojNsLDw6W2V9Y3PsSFwulvUygU0mKX/v7+WLhwIVJTU9GsWTOsXbsWsbGx6NSpk7S/np4eateujfj4eISGhiorbCpENm7cCB8fHwCAh4cHOnXqhNTUVNSoUQPGxsY4deoUjI2N0adPHwBAeno6mjVrhmbNmqFly5bSebjoqnrJvyj40aNHkZycDABo06YNlixZgkaNGmHFihUYPHgwgPfl5o8//sCjR49QpEgR6Tx/XVyevh/i/y+WlreQ2rlz51CqVClkZmaiadOmcHJyQnBwMID3Cz6vW7cOAODj44NKlSopJ2gqVPLfZ0JDQzFixAgMHDgQK1asQHZ2NgYOHIjFixdj6tSpWLhwIV69eiUd261bN2hqakqL+hHR15OUlIS5c+di3bp1ePnypfR5vXr1MHLkSFSrVg1BQUGIiIiQtt29exfh4eE4dOgQDh48iOrVqysjdPoPPX78GO3atcOQIUNw//59ODk5oX379oiKikJCQgK6du2KtLQ0LuhMkry2jMaNG8Pf3x+6urpo2rQp0tPTUapUKejq6gIAdHR0pGOEEAgMDMT169dhYGDAOigVkFceNm7ciKCgIDRs2BB2dnaoW7cuxo0bh3bt2mHHjh2YPHkyAKBv377w8vLCqFGj8PjxYwwdOhTr16/H/Pnzoa+vr8xLoW9MLpfDysoK169fx5s3b6TP69WrBy8vL9SpUwctW7bEzZs30bdvX8jlcuTk5EBTU1OJURdObOGhvyV/Zf/p06c4evQopk6dinXr1iE9PR1NmjTBxo0bERcXB3t7e0ydOhVt27bF1atXUbNmTcjlcuTm5ir5KkjZsrKyMGfOHDg4OGDVqlXYu3cv9PX1IZfLAbxvjE5LS8OVK1eQnp6OjRs3olmzZggMDISGhgYUCoWSr4C+NSGEdO+ZOHEiRo4cic2bNyMjIwONGzfGtGnToK2tjeTkZNy8eRNxcXH48ccf8eTJE8ybN086B33fZDIZtm/fjhYtWuD27dvo3Lkzjh49CjMzM3Tq1AnBwcGQyWQQQuDChQs4efIkMjMzWTZIknef8fLywvjx45GdnY2LFy9iwYIF6NSpE7KysjBkyBAsXboU06dPh5+fH1JSUgqcgxUNoi/31/tylSpV4O3tjbp162LLli04fPiwtM3Ozg4eHh4oXbo0jh07Jn1eoUIFuLm54fDhw7CxsflWodM31KpVK/z6668AgFGjRqFBgwYIDg5GvXr1YG1tjb1796JDhw5KjpIKk7wGaJlMhkaNGiEwMBBFihSBnZ0djh07hqVLl6JBgwaoU6cOGjZsiPr166NLly7IzMyEkZGRkqOnwurVq1fSs+nmzZvS58bGxhgxYgQ6dOiA/fv3Y/jw4dK258+f49ChQ7h+/TqioqLwww8/KCN0+kY+Vt90dXXFqFGjUKNGDfTs2RM3btyQttWrVw8jRozA8OHDC3S+Yz3j42SCNXr6B0aPHo3jx4/D0tIS8fHxuHnzJubNm4e+ffuiSJEiuHXrFgYNGgQhBPT19bFx40ZoaWkVSIqQehJCQCaToW3btvjzzz/Rp08fLFu2rEAPqgsXLqBnz57IzMxEdnY2ihUrhnPnzkFLS0s6ntTT5MmTsWzZMmzbtg0//PADSpQoAQB48+YNlixZAn9/fxQrVgzGxsYwNjbGnj17oKWlhdzcXClpRt+X3NxcaGhoQCaT4f79+/Dw8EDr1q0xYMAAREdHw9PTEykpKQgNDUXDhg2RmpqKWbNm4ffff0dUVBSsrKyUfQlUyERHR6NHjx5YvXo1GjduDCEEtm7dioCAAJiZmWHDhg3Q1NTEggULsHHjRpw4cYLPJaKvKH994fnz58jIyED58uUBAMePH8eMGTMghMCECRPQrFkz6biEhARYWlpKHWBY5/h+iPfTZUNDQwMpKSmQy+XQ1dWV7r0vX75EmzZt4OXlhS5duiA7OxtDhw7Fjz/+CGtra1SsWFG5F0CFyoEDBxAfH49x48ZBoVDgxIkTmDVrFvbv348ZM2agatWqePjwIeRyObKzs9GmTRtUrVpV2WFTIfKxNolbt24hICAAe/bsgZeXF0aMGCFtS05OxvTp05Gamorw8HDp2NevX0Mmk8HAwOCbxk/fVv53koSEBMjlcmhoaKBy5coAgJ07d2Lp0qVISUnBypUrYWlp+cE52J7xeUxq0N+2efNmuLu7IyoqCtbW1tDW1sb48eMxf/58LFy4EL169UKxYsUAvO9xnzeEk8OkCPi/G/qECRNQrFgxTJo0CV5eXhg7diwMDQ2l7RcvXsTFixeRmpqKfv36SVN6sAyprxs3bqB79+4ICgqCk5MTkpOTcf/+fezYsQMtW7ZE48aNcfPmTSQnJ8PAwADVqlWDhoYGy8136uTJk2jUqJH0e2xsLEJDQ3Hnzh2EhYWhQoUKAN4/sxYsWIBHjx6hbNmy0NbWxrVr17Bnzx7UqVNHWeFTIbZjxw4MGDAAFy5cgKmpKQAgIyMDa9euxcKFC7F69WqpN11epZYJd6KvI/93yc/PD7t27UJycjKMjY0xadIkdOjQAYcOHcK8efOQk5ODiRMnokmTJgXOwYTG9+PYsWMwNzeXkhLbt2/H4sWL8fDhQ7Ro0QJNmzZF165dkZOTgxo1aqBq1aqYO3cugoODsXPnThw9ehRlypRR7kVQobNw4UJ4eHggMDAQo0ePhkKhwNGjRzF9+nSkpKTg5MmTnLKMPin/MyavvSuvwTkpKQn+/v64evUqevbsiaFDh0rHvX79Wpq+jM8p9ZH/vWbKlCnYuXMnnjx5gmrVqqF79+4YOHAggP9LbKSlpSE4OJhTZv5T3275DlJ1y5cvF3Xr1hXv3r0rsJjm8OHDRdGiRUVYWJh4/fp1gWO4mJZ6+9zCzCtXrhQymUyMGzdOvHjxQvo8b0GkPHmLIpH6evjwoShbtqxYsWKFOH/+vOjbt6+oUaOGqFGjhpDJZGL//v0fHMNFwb9P69atEy1atBBPnz6Vni8LFy4UZcuWFfr6+h/cP86ePSsiIiLEkCFDREhIiLh586YywqZC6GPvJ2fPnhVWVlZi7969BT5/9OiR0NXVFevWrfuf5yCiLzN16lRhamoqNmzYIJ49eyasra1FzZo1xe3bt4UQQhw4cEB06NBB1K1bV5w7d065wdJXp1AoRGxsrChSpIiYMGGCeP78uYiNjRX6+vpiwoQJYty4ccLV1VWYmZmJefPmCSGE2LdvnyhbtqwwMzMTFSpUYLkgIcSnn9FLliwRGhoaIiAgQAjxvs5w7Ngx0bBhQ1GuXLkP2jOIhChYt5w3b5746aefRIsWLcTMmTOlhZ4TEhKEu7u7cHBwEEuXLv3gHHxvVE9TpkwRRkZG4sCBAyI+Pl707NlTyOVyERQUJO2za9cuYWtrKwYOHKjESFUTkxr0UR9rEAwJCRFFixYVb9++FUIIkZ6eLoQQIi4uTmhqaooSJUqItWvXfvJ4Ui/5y8DmzZvF4sWLxdy5c0VycrK0bdWqVUImk4lRo0aJkydPio4dO4q6desKhULBh76a+ti9IysrSwwdOlSUL19e6OjoiOHDh4sdO3YIIYRo2rSpGD9+/LcOk76xvHJx/vx5cffuXSGEkP4phBARERHCwsJCdOvWTVy5ckUpMZLqyP98mTdvnjh16pQQQoinT58KOzs70aFDB3H58mVpnydPnog6deqIffv2ffNYidSFQqEQT58+FQ0aNBBbt24VQghx6NAhUaxYMRESElJg3+3bt4vRo0ezvvEdmzNnjjA3NxfTp08XkydPFj4+PtK2u3fviqlTp4oKFSqI3bt3CyGEeP78uYiJiRFPnjxRVshUSOWVifzP/oULFwoNDQ0xe/ZsIcT798zIyEjh7OwskpKSlBInqYbx48eL0qVLi6CgIDFmzBhha2srfvzxR/H48WMhxPvERv/+/YWFhYXYsmWLkqMlZTt9+rRo0KCBOHr0qBBCiP3794tixYqJjh07iqJFi0rJeSGEOH78ON9r/gUmNeizNm3aJFXi09LShJ2dnXB2dhYpKSnSPleuXBFeXl5i2LBhwsDAQNy/f19Z4VIhNG7cOGFiYiJatWolTExMhJOTk9izZ4/Izs4WQgixZs0aYWRkJGrWrCnq1asnsrKylBwxKUv+h/iOHTvEvHnzxJIlS6Te9TExMSI2NlbaJysrSzg4OIhFixZ981jp27ty5YpwdnYWycnJ4uLFi8Le3r5AD5fg4GBRp04dMXDgQHHt2jUlRkqFWf77zJUrV4SDg4MwNjYW58+flz4rV66ccHZ2FjNmzBA7d+4Uzs7OwsbGhiMHif5jd+7cEVWqVBFZWVli3759Ql9fXyxbtkwIIURqaqoICQmROlflYQPA9yX/fTYvsWFmZiYmTpxYYL87d+6I9u3bi9GjR3/rEEmFJCQkCJlMJiIiIj7YFhQUJGQymXSPUSgUIi0t7VuHSCpk3bp1omrVquLMmTNCiPe963V0dISlpaVo3bq1ePr0qRDi/bukv78/3xvV0F875j579kxMnTpVpKeni0OHDglTU1MREhIikpOTRZMmTYRMJhNTpkwpcAzfa/4ZJjXokx4/fiwqVaok2rdvL6KiooQQQuzevVvY29sLBwcHERMTI44dOybatGkjunXrJpKTk4WxsbEICwtTbuBUaCxYsECUL19exMXFCSHeJ8lkMplwdHQUu3btkhIbV69eFXFxcdINPO9zUk9jx44VlSpVEk5OTsLFxUXIZDIRGRkpbU9LSxOXLl0S7du3FzY2NiwvauL3338XDRo0EEK8r6T26NFDNG7cuEBSa+nSpaJOnTpiyJAhBXraE/3V5MmThbOzs2jcuLHQ1tYWpqamIjo6WgghxPXr10WPHj2EtbW1sLGxER06dJAS7qygEn0d+Sv+ed+v7OxsUadOHeHm5iaKFSsmQkNDpX0SExOFo6Oj1DOfvk9/bRBasmSJ0NHREc2bN/9gCskhQ4YIe3t7doiiT8rOzhbDhw8XOjo60hSSeWXs9u3bwtjYWMhkMjF//nxlhkkqYsuWLcLT01MI8b4DXqlSpcTixYtFWFiYKFGihHBxcREPHjwocAzfG9XTzJkzxYEDB4QQQkqW9u3bV3h4eEjPrP79+4sGDRqIdu3acaaSL8AVakgi/rJmvKmpKTZs2IDk5GTMnTsXp06dQvv27REQEABdXV00b94cvXv3xuvXr7FmzRpoa2ujZMmSMDExUdIVUGHy5s0bPHjwAD4+Pqhbty62bNmC/v37Y/bs2Xj79i0mTpyIffv2IScnB9bW1qhbty40NDSQm5vLxZ3V2Pr167F69WqsX78ekZGR+OmnnwAAjx49AvD+PrVlyxZMmDABqampiI2NhaamJnJzc5UZNn0Djx8/RnZ2NnJzc2FlZQU/Pz9YWlrijz/+wOLFiwEAgwcPxsCBA7Fv3z6Eh4cjOztbyVFTYZKTkwMACAkJwdy5c+Hj44PNmzdjx44dsLW1RefOnRETE4OqVasiLCwMMTEx2LdvH3bu3AktLS3k5ORALpcr+SqIVJ9CoZAWz/T398eSJUvw8uVLaGpqolu3boiKikLr1q3Rr18/AO8XZPXw8ICenh7atGmjzNDpPyaTyRAbG4tly5YBAIYMGYKgoCBcvXoVoaGhuHnzprRvamoqypUrB4VCoaxwqZDJa8+Ijo7GypUrkZubi8DAQHh4eKBnz55Yv369dO8pUaIEfvzxRyxevBitWrVSZthUCP21bQwAfvrpJ4wdOxZv377FrFmzMHbsWAwdOhSurq4wMTHBiRMnEBAQUOB4vjeqn6ysLJw5cwYrVqxARkYGdHV1kZGRgbi4OOTm5kJLSwvv3r3Dq1ev4OnpiT179kj3Jfrn2HJIkrwvUnJyMoyMjAAA9erVw5IlSzBo0CD4+/vD29sbzZo1Q7NmzXD+/HmULFkSFSpUgEwmw6xZswAANjY2yroEUiIhRIGbsZ6eHjp37gwrKytcvXoV3t7e8PX1xciRI/HDDz+gY8eOmDx5MkqVKoVGjRpJx/HBr96SkpLg6uoKe3t7bN26FUOGDEFISAh69eqFlJQUZGVlwdnZGYaGhmjVqhXkcjlycnKYCPvOKBQKaGhoICMjA0WKFAHwvkHawMAAcrkcCoUClStXhre3N2bOnIm1a9cCAIYNG4aBAwdCS0sLzZs3h5aWljIvgwqJgwcPomXLltDU1ERmZiYuXrwIFxcXODo6AgDatGkDIyMjeHp64scff8S+fftQu3ZtAECxYsUAvC+TvM8Qfbm8+zsAPH36FEePHsXp06dRtGhR9OvXD7169UJSUhIiIyPRuXNnlC1bFleuXMHr168RFxcnPQPyzkHfl4yMDMydOxeJiYmQy+UYMGAAhg0bhszMTMyePRvHjx+Hvb09cnJysHv3bhw+fBg6OjrKDpsKgby66JYtWzBgwAAMHDgQCQkJqFWrFiZOnAgA6NmzJ5KTk1G/fn3s2rULcXFxCAwMlJ71REDBdo2nT59CCAFTU1MAQJkyZXDp0iXcu3cPTZs2BQC8fPkSNjY2cHNzg4uLCwCwkVqNaWtro3Xr1pg/fz5evnyJsmXLokiRIujSpQtCQkKQlZWFy5cvIz09Ha6urgA+bEujv49vg1Sgd8vixYsxYMAAXLx4UfrMzs4Oy5Ytw+XLlzF58mQcPnwYAFCnTh1UrFgRcXFxGDx4MJYtW4Z169ahfPny3/waSLny34RXrFiB2NhYaGlpwd7eHkZGRjh79ixKly6N7t27AwDevn2Lbt26wcHBAQ0aNFBm6KREefee/D1hUlJSkJubi23btuHXX39FYGAg+vfvDwDYtm0b5s2bhxIlSqBt27ZSwwYbGr8/GhoaePjwIXr37o2DBw8CAHJzc1G6dGkA78uMQqFAlSpVMG7cOFhbW2P9+vWYPXs2AKBv376oVKmS0uKnwuPly5cYMGAAqlevDiEEdHR0oK2tjfj4eKSlpUn72draokuXLnjy5Ak6dOiA8+fPA/i/+xMbUIm+jrzv0ujRo9GxY0cYGhqiXLlyGDZsGJYuXYpy5cph+vTp8Pf3R2ZmJtLT09GsWTOcO3dOGjHF7+P3q0iRIpg5cyaqV6+ONWvWIDg4GMD78uLj44OLFy9i+/btKF++PGJjY6UENKmvvPqETCbDmTNnMGDAAPj7+8PPzw+1atUC8L6DwpQpUxAQEIDRo0ejZ8+eCAsLw/Lly5nQIEl4eDgeP34stWt4e3ujTZs2qFWrFry9vXHv3j0AkGYnCQsLw8mTJzFkyBCkp6fDxcUFGhoaHD2mZj42qmfgwIEoUqQIfH19pc+6du2K/v37IzExERYWFjh9+jTkcjlyc3OZ0PgS337GKypM8s/bdv36dXHmzBlRpkwZ0bdvX3HhwoUC+0ZERAh9fX3RvHlzaXEkIYSIj48XgYGBXJhVTeVfyOjcuXPCwcFB1K1bV5rPXqFQiNmzZ4vq1auL8+fPi5cvX4qOHTuKwMBA6TjONaneTp48Kf17aGioqFSpktDX1y+wVsKbN29E27ZthZeXlzJCJCVISkoSDg4Oom3btiIuLk54e3uLX3755aP7pqamik6dOomOHTuKly9ffuNIqTBTKBTi5MmTombNmsLGxkYoFApx4sQJUb16dbF48WLx+vVrad+9e/eKX375RfTq1Uu0aNFCPH/+XImRE32/Nm3aJIoXLy7i4uJEWlqayMnJEWPGjBFyuVwsWbJEZGZmfvQ4vi9+f/Lqos+ePSvw+e3bt0WPHj1EkyZNREhIiPT57NmzRa1atcSrV6++ZZhUCJ04ceKDz+bNmyecnZ0LrLf31/vGlStXRHx8vHj06NF/HiOpjtjYWCGTycTIkSPFq1evRHh4uChfvrxYvny5CAoKEvr6+qJnz54iISFBKBQKMX/+fPHDDz+I8uXLi8aNG0vrJHCRZ/Xx559/Ss+wxYsXiy1btkiLxQshREhIiGjUqJG4e/dugePylxGuDfrlZEJ8JK1EaiH/0O0xY8Zg7ty5UCgUOHDgAAYMGAAnJyd4enpKPRzWrFmDTZs2wdjYGCEhIQV6SXH6F/Uk8o3QmD59Oi5cuIDbt2/j0qVLsLGxQUhICOrUqYN79+6hUaNGUpkpUaIEzp49y6lh1FT+e098fDzq1q2LRYsWYejQoQCALl26YO/evQgLC4OdnR0yMzMxduxYJCcnIyYmBpqamhyiqSZu3ryJYcOGoWjRorh79y4UCgVq1qwJmUwGuVyOjIwMyGQy6Onp4eHDhwgJCYGZmZmyw6ZCRqFQICYmBr/99htKliyJ6OhojB8/Hnv27EHPnj3RpUsXFC1aFAMHDkTVqlVhY2OD0aNH4+DBg/jhhx+UHT7Rdyc0NBTBwcE4fvw4ihQpIr0TjBgxAitWrMD8+fPRtWtXGBgYKDlS+to+NnXY2bNnMX78eAwePFiaigMAbt26hREjRuD27dvw8vLCr7/+CgB48eIFDA0Nv2ncVLisX78eYWFhWLt2LYyNjaXPJ0+ejAMHDuDkyZMf1DNPnjwJGxsbFC1a9FuHSypi586d+OmnnzBu3DgULVoUlStXlmaaOHXqFFxcXODk5ITAwECUL18eL168wOPHj1GjRg1oaGiwTUyNvHz5Era2ttDW1salS5fg6uqKBw8e4M2bN/Dz80ODBg1QpkwZVKxYET4+PlI7R/5nINszvg4mNQgJCQlYuHAh3NzcpHkBDxw4gIEDB6J58+ZwdXWFo6Mj+vTpg3bt2mHAgAEAPv5SSupp0aJFmDBhAnbt2gULCwtERkZi9erVePv2LYKDg2Fra4v79+/j0KFD0NDQQM+ePaGpqckHvxrK//BeunQprl+/jrCwMGRmZiIgIABjxowBALi4uODWrVu4du0a7OzsoKOjg4MHD0JLSwu5ublce0WNJCQkwNPTE8ePH4eOjg66du2K27dvQ0NDA0WLFkVOTg6ys7Mxe/ZsVK9eXdnhUiEQGxuLFy9eoG3bttJzJicnB+fOnUO3bt1gbm6Oo0ePYurUqdixYwcuXbqEKlWqQENDA1evXkViYiLatm2LrVu3Sh07iOjf+Vh9Yfny5Rg1ahQeP36MYsWKSesnnTt3DvXr14e+vj6WLFmCn3/+mfWN70je3/LOnTvYvn073r17B1tbW9StWxedOnVCqVKlMGjQIHTq1Ek65vLly2jSpAlMTU0xatQo9OvXjw1BaiyvDMXHx6NUqVIwNzfH/fv3pQ4twcHBGD16NE6cOIE6depIx2VnZ2P06NFo2LCh1EhNlEehUEAmk0Emk2H79u346aefAEDqdJd3z4mOjoaLiwtatGgBb29v1KxZs8A5+KxSH0IIREdHo3///jAyMkJUVBSSk5MRFBSE3bt3Q0tLC25ubnj48CFiYmKwY8cOTtP/X1HSCBEqJDZu3CgqVKggatasKR4+fChycnKkIVQHDx4UDg4OwtTUVFSoUEHUrl1bGlaXf9oqUm/Z2dmiR48eYtCgQQU+3717t6hbt66oV6+eiI+P/+A4TiGg3iZOnCiMjIzE2rVrRVhYmOjVq5fQ19cXM2bMkPa5dOmSOHjwoLhy5Yo0TJNDNNVTYmKiaN++vXB2dhYXL15UdjhUiB0+fFjIZDIhk8lEgwYNRJ8+fcS2bdukod8xMTHCxsZGNGrUSAghxOvXr8XGjRvFoUOHpOfSyJEjRZ06dTj9FNFXtGnTJrFv3z4hhBBpaWnCzs5OODs7i5SUFGmfK1euCC8vLzFs2DBhYGAg7t+/r6xw6SvLe4+7cOGCMDMzE46OjqJy5cpCR0dHbN++Xdy/f184OTmJNm3aiB07dkjHXbp0SbRp00b069dP3Lt3T1nhUyFy5coV4ezsLJKTk8XFixeFvb29mDt3rrS9ZcuWokKFCiI2Nla8efNGpKamivHjx4uyZcuKW7duKTFyKozyt2vltXXt379fyGQy4ebmJk1TlrdfdHS0kMlkYsqUKd88VipccnNzxalTp4SFhYWoV6+eVEbOnz8vNm3aJKysrISZmZmQyWTiwIED0jH0dTGpoeY2b94snJ2dhZ6enrhy5YoQ4v3NPO8LmZiYKCIjI8XGjRulyj4bFemv+vfvL1q0aCEyMjIKfD5p0iSpYemva7SQ+nry5Imws7MTK1eulD67f/++8PHxEbq6ugUqJvnxJUC9JSQkiNatW4vWrVuLY8eOFdjGRDvluXnzpnBwcBB2dnaiTZs2YsSIEaJEiRKiSpUqolOnTmL+/Pli5cqVoly5csLZ2blA2YmKihIDBw4UJUuWFOfPn1feRRB9Zx4/fiwqVaok2rdvL6KiooQQ7zu/2NvbCwcHBxETEyOOHTsm2rRpI7p16yaSk5OFsbGxCAsLU27g9FXkT2jo6emJ8ePHi8zMTBEfHy+qV68urK2thUKhEGfPnhVOTk6iVatWIjw8XLx9+1ZMnjxZuLu7F1j/iNTb77//Lho0aCCEeP9u2KNHD9G4cWOxePFiIYQQycnJokOHDkJfX19Uq1ZNODg4CBMTE3Hu3Dllhk2F3IoVK8SiRYvEu3fvhBBC7NixQ8hkMjF8+HBpnYS8d8ZLly6xg6YaiomJEXv37hVC/F+baHZ2toiJiREWFhaiVq1aBeoVKSkp4s8//xRt2rQRtra2LDP/EY6PUiPiIzONubq6YtSoUfjhhx/Qs2dP3LhxQ5reRQgBCwsLODk5oWvXrpDL5cjNzeV0QWrsY2UIAGxsbHD//n0cOHAAGRkZ0ufW1tZwcXFB+fLlMW/ePLx79+5bhUqFiEKhKPC7XC7HnTt38Pz5c+mz8uXLw93dHbVr18bo0aOxYMECaVteueOQXvVmZWWFRYsWQUtLC15eXoiJiZG2cRoKylOlShWsWrUKZmZmkMvl6Nu3L5KSkhASEgKZTIatW7di0KBB0NDQwKFDh+Dp6SkdK5PJkJycjOPHj8PGxkZ5F0Gk4v76vmhqaooNGzYgOTkZc+fOxalTp9C+fXsEBARAV1cXzZs3R+/evfH69WusWbMG2traKFmyJExMTJR0BfQ1aWho4P79+2jRogXat28Pf39/aGtro3bt2jA1NcXr16/x+PFj2NraYuXKlShVqhSmTp2KmjVrIjg4GEOHDuX6KiR5/PgxsrOzkZubCysrK/j5+cHS0hKrV69GcHAwSpcujV27diEsLAzDhw9Hv379cPr06QLTURHll5ubiw0bNmDFihVYv3490tLS0KlTJ2zduhWLFy+Gn58fnj17JtU3atasKbWNkXqIiopCgwYN0L59ezg4OKB///7Yvn07Hj16BHt7e/zxxx/Q1taGjY2N9A6kr68PZ2dn+Pj4IDs7G5cvX1byVXyfuKaGmsg/x19CQgLkcjk0NDRQuXJlAMCuXbuwePFivHv3Dr///jssLS05bz0V8LEyJJfLUalSJQBA+/btkZiYCF9fXzg6OsLAwAC9e/dGw4YNoaWlhYCAAJw9e5aL+Kqx9PR06OrqQqFQoF+/fkhNTcWMGTNgaWkp7TN06FDcuHEDCQkJCAgIQI8ePZQYMRVG169fx+TJkzFnzhyYm5srOxwqpG7cuIERI0ZAoVBg6tSpcHBwAPC+4rp3717cvn0b0dHRiIiIKLCYaN59ioi+XHJyMoyMjKTfz549i0GDBqFMmTLw9vaWvpfnz59HyZIlUaFCBchkMnh7e2Pr1q04dOgQ56D+Tty5cwdubm4oU6YMvLy80KhRI/j7+2PixImoVasWjI2NkZubiw4dOqBKlSooUqQIMjIyULt2bVSoUEHZ4ZOS5NU/89bdAYDp06fjyJEjiIyMlLYnJSVh5syZuHr1Knr27Ilhw4YpOXIqzD7WzpWRkYHffvsNSUlJGDBgAH7++Wfo6elh+/btcHNzQ/fu3bFgwQKULFlSSVGTMiUlJeGXX35BdnY2SpcuDSsrK0RERMDQ0BA1atSAk5MTSpQogSlTpsDCwgIHDx6UkmCvX79G9erVsXz5cnTo0EHJV/L9YVJDDYh8i6lNmTIFO3fuxJMnT1CtWjV0794dAwcOBADs3LkTS5cuRVpaGoKDg7ngKkk+V4bc3NwwePBgAECXLl1w48YNPHz4ECYmJsjNzUVCQgLOnTsHNzc3HDx4UEqCkHoJDQ3FrFmzcPr0aRgZGWH9+vWYOnUqOnXqBHd3d1hZWSElJQW//vor2rZti0OHDkFLSwvh4eHQ1tZmT3wqICsrC9ra2soOgwq5xMREDB8+HADg7e2NJk2afHS/7OzsAokNIvp38neAWbx4MSIjIzF16lTUqlVL2ufMmTNwc3NDlSpV4O3tDScnJ2nb2bNnER4ejvXr1+Pw4cPsWf2dSUxMxIgRI6CtrQ1jY2Ps2LEDwcHBcHR0REJCAq5du4agoCCkp6fDwsIChw8f5vsf4eHDh/D09ET//v3h7OwMX19fXLt2DRs2bEBubi5kMhk0NDRw48YNBAQEICEhAS4uLhgzZoyyQ6dCLikpCZUqVZKeWxkZGejduzfu3LmDQYMGoUePHtDV1cW6deuwZMkSHDt2jDMHqLHExESMGzcOWVlZmDFjBszMzHD+/HksWrQIr169QmxsLIyMjPDgwQOMHDkS8+bNAwCsXbsW/fr1w6VLl1ClShUlX8X3h0kNNeLr64ulS5dizZo1MDExQWBgINavX4+AgACMHj0aALB79274+vrCzs4OwcHBSo6YCptPlSF/f3+MHTsWAHDixAncvXsX2tra+OmnnyCXyzFs2DDExsbizz//RIkSJZR7EaQUCQkJ6Ny5M4oXL479+/ejVKlSWLZsGZYuXQodHR2UL18eDx48QE5ODuLj4zF27FgcO3YMp06d4ogxIvrX8hrRAGDSpElo1KiRkiMi+j7l7wCTkJCAlJQUdOrUCW3btsXIkSMLJDZWr16NIUOGoF69epg9ezbs7OwAABcuXMDBgwfRoUMHVKtWTSnXQf+tGzduYNiwYThx4gSmTZv2QcNzSkoKLl++DGNjYzb+EADg1q1b6NWrF0qUKAE/Pz9s2bIF9+/fR0RExAf7vnv3Dj///DOEEFi1ahV71VMBf/75J16+fInu3btj/fr18PX1RVBQENq1ayclK9LT0+Hi4oIbN27Ax8cHbm5uKFq0qHSO/Ml7Uj//ZiT47t27YWVlBSsrK2WG/t1iUkNNxMTEwMPDAwEBAWjSpAkOHDiArl27olmzZjh8+DD8/Pzg4eEB4H2jdMOGDXmzpgL+VxmaPn16gbnJAeDkyZNYtWoVtmzZgsOHD6N27dpKip6+pb++7OU1dCQlJcHFxQWampqIjIxEqVKlEBUVhQsXLiA6OhpVqlTBlClToKOjg19//RUaGhoICQlhj3wi+iKJiYnw9PTE06dPER4eXqBxlYi+XP7n/pgxYzB37lwoFAocOHAAAwYMgJOTEzw9PaXv3po1a7Bp0yYYGxsjJCSkwDtDTk4O1+/7ziUlJWHIkCGQy+Xw9vaGo6MjAP7t6dNu3ryJYcOGoWjRorh79y4UCgVq1qwJmUwGuVyOjIwMyGQy6Onp4eHDhwgJCeGUx1TAyZMn0bhxY9ja2mLChAlo1aoV2rVrB4VCAW9vb7Rp00Z6Fl2+fBmNGjWCqakpAgMD0alTpwKJe1Jvf3ckOGcW+DbYav2d+muuqnLlymjbti3s7e0RGRmJPn36ICgoCCtWrICtrS1GjRoFX19fAICjoyM0NDQ+WNyX1Ms/LUOjR4/G9OnTCxyTlpaGO3fu4MiRI0xoqJG8F8INGzYAeL/4rhACVapUwbZt25CdnQ1nZ2e8ePECzZs3h4eHBzZs2ICZM2ciOTkZ3t7e2LlzJ8aMGcMXASL6YpaWlggMDESTJk1Qs2ZNZYdD9N3Jv+Zaeno6oqKiAACtW7fG8uXLERUVhXnz5mH37t14/fo1Nm/ejPbt2yM0NPSDOgcbtb9/VapUweLFiyGEgJ+fH06ePAmAf3v6NAsLCyxYsADp6elISEjAvXv3ULRoUTx9+hRPnjxBdnY20tLS8PjxYwQFBTGhQR9ITk4GAOjp6SE8PBzHjx/H/v37oa2tjenTp2Pfvn3Svq9fv0aXLl3g6uqK9u3bAwATGiSxtLTEokWLIJPJ4O/vLz3D/ortGN8GR2p85/z9/WFra4tWrVpJi1+6u7ujePHimD17NrS0tDBgwABcunQJpUqVwu7duwHwpk3/59+UofzlJy0tDXp6ekq8AvpWsrKykJOTAz09PTx48ACVK1dG8+bNceDAAQD/N2IjPj4ezZs3h4ODA1asWAFTU1MAQGpqKsaNG4djx45h9erVsLGxUeLVENH3ilMHEH19mzZtwtixY1GsWDEcOHAAJiYm0NDQgEwmw6FDh+Dj44Pbt29DR0cHJUqUwJkzZ6ClpcXer2osMTERo0aNwvPnzzFv3jw0aNBA2SFRIXfz5k14eHggKysLc+bMwQ8//KDskEiF/PLLL7h//z4MDQ3x7NkzTJo0CY0bN0aHDh2QmZmJrl27wsnJCZMmTYK1tTUCAgIAfHxhcSKOBC8cWKP7jmVlZeHMmTNYsWIFMjIyoKuri4yMDMTFxSE3NxdaWlp49+4dXr16BU9PT+zZs4eVCirg35ah/LlSJjTUw5YtW9CjRw84OjpixowZKF++PCIjI3H16lW0a9cOwP8lS83NzWFlZYX9+/djwoQJ0jn09fUxbdo0/Pnnn0xoENF/hgkNoq9PQ0MDVlZWuHXrFl6/fg25XI6cnBwIIdCyZUtERETgjz/+QGBgIOLi4qClpYWcnBzWPdRY3ii68uXLo2zZssoOh1SAhYUF5s6dCw0NDYwdOxbHjx8vsJ39deljMjMzAQBt2rSBlZUVvLy8YGxsjGnTpuH48ePYs2cPLC0tsWDBArRt2xbPnz+Hn58fgPdligkN+hiOBC8cOFLjOxcSEoL58+cjMjJSeln08/NDSEgI2rdvj8uXLyM9PR2xsbGQy+XsLUUfYBmi/yUkJAReXl5wd3eHQqHAokWLEBISgn79+uHEiRNwc3NDrVq1sH//fgBARkYGhg4dipEjR6JGjRrSiyLLDhERUeH3qef1/v374evri8zMTGzYsAFWVlbIycmBXC7/YH/2fKU8nHec/qn8o3zmz5+P+vXrKzskKmSioqJw69YtuLu7S589fvwY9erVw7Rp09CuXTsMHToUT58+hbe3N9q1a4c7d+7g8ePHqF+/PjQ0NLjOD/0jHAmuHExqfEc+VcGoU6cO6tWrh+XLlwN4P9/thg0bcPToUZiZmSE0NBRaWlqsXBDLEP1jYWFhGDJkCDZu3AgXFxcAQI8ePeDg4ICff/4ZJUuWxKlTp9CvXz/o6uqic+fOOHLkCLKzs3HixAloaGiw3BAREamI/JX2hIQEyOVyaGhooHLlygCAXbt2YfHixXj37h1+//13WFpa8jlPRF/d9evXMXnyZMyZMwfm5ubKDocKkaioKLRo0QIA0KpVK7i4uMDR0RE1a9bE+vXrsXbtWqxduxb37t2Dj48PXrx4gV69ehVIgPC5RaQamNT4Dhw8eBAtW7aETCbDkiVLUKZMGTg6OsLY2BgAsHz5ckRERGDt2rUFHvj5KyXMQqs3liH6N44cOQInJyf4+vrCx8dH+tzGxgYKhQJ37txBnTp18Ouvv6J58+YYPnw4srKyoK+vjw0bNkBLS4s9GoiIiFRE/s4vU6ZMwc6dO/HkyRNUq1YN3bt3x8CBAwEAO3fuxNKlS5GWlobg4GBUr15dmWET0XeKo3zoY27evAl3d3doampCCIGaNWti7dq1mDRpEoQQ2L17N6ZOnQpHR0dcvXoVQ4cORc2aNbFw4ULOGkCkYpjUUHEvX76Era0ttLW1cenSJbi6uuLBgwd48+YN/Pz80KBBA5QpUwYVK1aEj48Phg4dCqBgYzSnfFFvLEP0byUmJsLd3R0lS5bE5MmTYWdnB1dXV1y8eBF+fn4wMDDAmDFjoFAoEBUVBRMTE2RkZKBIkSIAmAgjIiJSRb6+vli6dCnWrFkDExMTBAYGYv369QgICMDo0aMBALt374avry/s7OwQHBys5IiJiEid3LhxAxMmTEB2djZGjhyJ3NxchISEID09Hfv370fnzp2xefNmyOVy3LlzB+bm5tDQ0GC7BpGKYVJDxQkhEB0djf79+8PIyAhRUVFITk5GUFAQdu/eDS0tLbi5ueHhw4eIiYnBjh07UL58eWWHTYUIyxB9icTERIwYMQJyuRyvX79Geno6tmzZgooVKwIAzp07Bzs7O2zdulWangpgIoyIiEgVxcTEwMPDAwEBAWjSpAkOHDiArl27olmzZjh8+DD8/Pzg4eEBADhx4gQaNmzIEZlERPTNJSQkwMPDAwqFAgsWLIClpSUSEhIwd+5cDB8+HLVr1y5QJ+UMAkSqh0mN74BCoUBMTAx69+6NkiVLIiYmBjKZDPHx8bh58yYmTpyI9PR0PHjwAPv370erVq14w6YCWIboSyQmJmLIkCE4c+YMQkND0bVrVygUCshkMpw/fx6//PILli9fjkaNGik7VCIiIvoH/toJITk5GcuWLYOXlxdOnjyJXr16YerUqfjpp5/g6uqK48ePw8fHB76+vtIxfGckIiJlSExMxLBhwwAAkyZNQuPGjaVtfDYRqT4mNVRQbGwsXrx4gbZt20rTt+Tk5ODcuXPo2bMn9PT0EB8fL1VAUlNTER0djblz5yI5ORkxMTFc9EjNsQzR15aUlIShQ4dCQ0MDEyZMkF4YO3bsiNTUVERGRvKlkYiISEX5+/vD1tYWrVq1Qnp6OnR1deHu7o7ixYtj9uzZ0NLSwoABA3Dp0iWUKlUKu3fvBgCOyiQiIqXKm1kAACZOnAhHR0clR0REXwtbmFRMVFQUGjRogPbt28PBwQH9+/fH9u3b8ejRI9jb2+OPP/6AtrY2bGxskJev0tfXh7OzM3x8fJCdnY3Lly8r+SpImViG6L9QpUoVLFq0CEIIzJo1CydOnICrqytu3LiBP//8ExoaGlAoFMoOk4iIiP6hrKwsnDlzBitWrEBGRgZ0dXWRkZGBuLg45ObmQktLC+/evcOrV6/g6emJPXv2MJlBRESFgqWlJRYuXAi5XA5PT09cvHhR2SER0VfCpIaKMTc3R4MGDWBra4sSJUqgePHi+O233+Dk5ITOnTsjOjoaw4YNw5s3b+Ds7Iz8A3Gsra2RnJyM+/fvK/EKSNlYhui/kvfCKJPJ4OTkhCtXruDy5cvQ0tJCTk4OR2oQERGpIG1tbbRu3RoXLlzAy5cvAQBFihRBly5dsG3bNgwaNAitW7fGrVu34OrqCoBrZxERUeFhaWmJwMBANGnSBDVr1lR2OET0lbCFScVUqVIFq1atgpmZGeRyOfr27YukpCSEhIRAJpNh69atGDRoEBQKBQ4fPoxRo0ZJx+7duxevX7+GtbW1Eq+AlI1liP5LlpaWCAoKwqBBgwokNDQ1NZUdGhEREf0NH5udeODAgShSpEiBtTK6du2K/v37IzExERYWFjh9+jTkcjlyc3OZ0CAiokLF2toac+bM4QwCRN8Rrqmhom7cuIERI0ZAoVBg6tSpcHBwAADk5uZi7969uH37NqKjoxEREQEtLS0AwO7du2FlZQUrKytlhk6FBMsQfQtMaBAREamGgwcPomXLlpDJZFiyZAnKlCkDR0dHGBsbAwCWL1+OiIgIrF27Fubm5tJx+Rdb5XOfiIiIiL4FJjVUWGJiIoYPHw4A8Pb2RpMmTT66X1ZWFrS1tb9laKQiWIaIiIiI6OXLl7C1tYW2tjYuXboEV1dXPHjwAG/evIGfnx8aNGiAMmXKoGLFivDx8cHQoUMBFExocMopIiIiIvpWmNRQcYmJiRgxYgQAYNKkSWjUqJGSIyJVwzJEREREpN6EEIiOjkb//v1hZGSEqKgoJCcnIygoCLt374aWlhbc3Nzw8OFDxMTEYMeOHShfvryywyYiIiIiNcWkxncgMTERnp6eePr0KcLDw1GrVi1lh0QqhmWIiIiISL0pFArExMSgd+/eKFmyJGJiYiCTyRAfH4+bN29i4sSJSE9Px4MHD7B//360atWqwEgNIiIiIqJvhUmN78S1a9cQFhaGwMBAVizoX2EZIiIiIlIfsbGxePHiBdq2bSuthZGTk4Nz586hZ8+e0NPTQ3x8vDSlVGpqKqKjozF37lwkJycjJiYGcrlcyVdBREREROqISY3vEHtM0ZdiGSIiIiL6fkVFRaFFixYAgPr166NatWro3Lkz6tatC3Nzc8TGxmLo0KHIysoqkNgAgOjoaAwaNAgRERGoXbu2si6BiIiIiNQYWy2/Q2yMpi/FMkRERET0/TI3N0eDBg1ga2uLEiVKoHjx4vjtt9/g5OSEzp07Izo6GsOGDcObN2/g7OyM/P3grK2tkZycjPv37yvxCoiIiIhInbHlkoiIiIiISI1UqVIFq1atgpmZGeRyOfr27YukpCSEhIRAJpNh69atGDRoEBQKBQ4fPoxRo0ZJx+7duxevX7+GtbW1Eq+AiIiIiNQZp58iIiIiIiJSQzdu3MCIESOgUCgwdepUODg4AAByc3Oxd+9e3L59G9HR0YiIiICWlhYAYPfu3bCysoKVlZUyQyciIiIiNcakBhERERERkZpKTEzE8OHDAQDe3t5o0qTJR/fLysqCtrb2twyNiIiIiOijmNQgIiIiIiJSY4mJiRgxYgQAYNKkSWjUqJGSIyIiIiIi+jSuqUFERERERKTGLC0tsXDhQsjlcnh4eODixYvKDomIiIiI6JOY1CAiIiIiIlJzlpaWCAwMRJMmTVCzZk1lh0NERERE9ElMahARqblmzZrBw8MDAFCxYkXMnz//q/83+vTpAxcXl69+XiIiIvp6rK2tMWfOHGhoaEChUCg7HCIiIiKij2JSg4iIJGfOnMGAAQP+1r7/JAGyYMECrFy58m/te+fOHchkMsTHx/+t/YmIiOjr09BgVZGIiIiICidNZQdARESFh5GR0Vc9X25uLmQyGQwMDL7qeYmIiIiIiIiISD2x+w0RkRp59+4devfuDX19fZQpUwZz5swpsP2voy98fX1hbm4OHR0dlC1bFiNGjADwfsqqu3fvwtPTEzKZDDKZDACwcuVKlChRArt370b16tWho6ODu3fvfjD9lEKhQEBAACwsLKCjowNzc3PMmDEDAFCpUiUAQJ06dSCTydCsWbP/eV155w8KCkKZMmVgaGiIoUOHIjs7W9pnzZo1sLOzQ7FixWBqaoqff/4Zz549k7YfOXIEMpkMBw4cQJ06daCrqwsnJyc8e/YM+/btg7W1NYoXL44ePXogLS1NOk4IgdmzZ6Ny5crQ1dVF7dq1sXnz5r/3ByEiIiIiIiIion+EIzWIiNTI2LFjERUVhW3btsHU1BTe3t6Ii4uDjY3NB/tu3rwZ8+bNw/r161GjRg08efIEFy5cAABs3boVtWvXxoABA9C/f/8Cx6WlpcHf3x9hYWEwNDSEsbHxB+eeMGECQkNDMW/ePDg6OuLx48e4fv06ACA2Nhb29vY4dOgQatSoAW1t7b91bVFRUShTpgyioqJw8+ZNdOvWDTY2NlJ8WVlZmD59OqpWrYpnz57B09MTffr0wd69ewucx9fXF4sXL4aenh7c3Nzg5uYGHR0drF27Fqmpqfjxxx+xaNEijBs3DgAwadIkbN26FcuWLYOlpSWOHTuGXr16wcjICE2bNv1bsRMRERERERER0d/DpAYRkZpITU1FeHg4IiIi4OzsDABYtWoVypcv/9H97927B1NTU7Rs2RJaWlowNzeHvb09AKBUqVKQy+XSqIf8srOzsXTpUtSuXfuj501JScGCBQuwePFi/PrrrwCAKlWqwNHREcD/TYFlaGj4wbk/p2TJkli8eDHkcjmqVauG9u3bIzIyUkpq9O3bV9q3cuXKWLhwIezt7ZGamgp9fX1pm5+fHxo1agQAcHd3x4QJE5CUlITKlSsDALp06YKoqCiMGzcO7969w9y5c3H48GE4ODhI5z5x4gRCQkKY1CAiIiIiIiIi+so4/RQRkZpISkpCVlaW1PgOvE9OVK1a9aP7d+3aFenp6ahcuTL69++Pbdu2IScn53/+d7S1tVGrVq1Pbr927RoyMzPRokWLf34Rn1GjRg3I5XLp9zJlyhSYXur8+fPo3LkzKlSogGLFiknTWt27d6/AefLHbmJiAj09PSmhkfdZ3nmvXr2KjIwMODs7Q19fX/qJiIhAUlLSV70+IiIiIiIiIiLiSA0iIrUhhPhH+5uZmSEhIQEHDx7EoUOHMGTIEAQGBuLo0aPQ0tL65HG6urrSGhuf2v5f+GtMMpkMCoUCwPu1RFq1aoVWrVphzZo1MDIywr1799C6dWtkZWV98jwymeyz58375549e1CuXLkC++no6HydCyMiIiIiIiIiIglHahARqQkLCwtoaWnh9OnT0mevXr3CjRs3PnmMrq4uOnXqhIULF+LIkSOIjo7GpUuXALwfkZGbm/uP47C0tISuri4iIyM/uj1vDY1/c+5PuX79Op4/f45Zs2ahcePGqFatWoFRHP9W3mLo9+7dg4WFRYEfMzOzrxA5EREREZHqadasGTw8PAAAFStWxPz587/6f6NPnz5wcXH56uclIqLCjyM1iIjUhL6+Ptzd3TF27FgYGhrCxMQEEydOhIbGx/PbK1euRG5uLurXrw89PT2sXr0aurq6qFChAoD3lZNjx46he/fu0NHRQenSpf9WHEWKFMG4cePg5eUFbW1tNGrUCMnJybhy5Qrc3d1hbGwMXV1d7N+/H+XLl0eRIkVgYGDwRddubm4ObW1tLFq0CIMGDcLly5cxffr0LzonABQrVgxjxoyBp6cnFAoFHB0d8fbtW5w6dQr6+vrSmiFEREREROrqzJkzKFq06N/at2LFivDw8JASIp+zYMGCvz0a/c6dO6hUqRLOnz8PGxubv3UMEREVXhypQUSkRgIDA9GkSRN06tQJLVu2hKOjI2xtbT+6b4kSJRAaGopGjRqhVq1aiIyMxK5du2BoaAgAmDZtGu7cuYMqVapIi3v/XZMnT8bo0aPh4+MDa2trdOvWTRo5oampiYULFyIkJARly5ZF586dv+yi8X7x8ZUrV2LTpk2oXr06Zs2ahaCgoC8+LwBMnz4dPj4+8Pf3h7W1NVq3bo1du3ahUqVKX+X8RERERESqzMjICHp6el/tfLm5uVAoFDAwMECJEiW+2nmJiEh1yMQ/nWSdiIiIiIiIiIgI79evGzx4MLZu3SqNZN61axdsbGwwf/78D0Zf+Pr6YsWKFXj69CkMDQ3RpUsXLFy4EM2aNcPRo0cLnFsIgZUrV8LDwwNr1qyBl5cXbty4gcTEREydOhWvX7/G9u3bAbxf7y4wMBChoaG4f/8+TExMMHDgQEycOPGDNf+aNm2KI0eOfPa6+vTpg9evX8PR0RFz5sxBVlYWunfvjvnz50vr7q1Zswbz589HQkICihYtCicnJ8yfPx/GxsYAgCNHjqB58+bYv38/xo8fj+vXr8PBwQHr169HXFwcRo0ahYcPH6J9+/YIDw+Xkj9CCAQGBiI4OBiPHz+GlZUVJk+ejC5dunzhX4uI6PvA6aeIiIiIiIiIiOhfGTt2LKKiorBt2zaYmprC29sbcXFxH53mafPmzZg3bx7Wr1+PGjVq4MmTJ7hw4QIAYOvWrahduzYGDBiA/v37FzguLS0N/v7+CAsLg6GhoZQ0yG/ChAkIDQ3FvHnz4OjoiMePH+P69esAgNjYWNjb2+PQoUOoUaOGtI7f/xIVFYUyZcogKioKN2/eRLdu3WBjYyPFl5WVhenTp6Nq1ap49uwZPD090adPH+zdu7fAeXx9fbF48WLo6enBzc0Nbm5u0NHRwdq1a5Gamooff/wRixYtwrhx4wAAkyZNwtatW7Fs2TJYWlri2LFj6NWrF4yMjNC0adO/FTsR0feMSQ0iIir09PX1P7lt3759aNy48TeMhoiIiIiIACA1NRXh4eGIiIiAs7MzAGDVqlUoX778R/e/d+8eTE1N0bJlS2hpacHc3Bz29vYAgFKlSkEul6NYsWIwNTUtcFx2djaWLl2K2rVrf/S8KSkpWLBgARYvXiyta1elShU4OjoCgDRdrqGh4Qfn/pySJUti8eLFkMvlqFatGtq3b4/IyEgpqdG3b19p38qVK2PhwoWwt7dHampqgTqMn58fGjVqBABwd3fHhAkTkJSUhMqVKwMAunTpgqioKIwbNw7v3r3D3LlzcfjwYTg4OEjnPnHiBEJCQpjUICICkxpERKQC4uPjP7mtXLly3y4QIiIiIiKSJCUlISsrS2p8B94nJ6pWrfrR/bt27Yr58+ejcuXKaNOmDdq1a4eOHTtCU/PzzVPa2tqoVavWJ7dfu3YNmZmZaNGixb+7kE+oUaMG5HK59HuZMmVw6dIl6ffz58/D19cX8fHxePnyJRQKBYD3yZvq1atL++WP3cTEBHp6elJCI++z2NhYAMDVq1eRkZEhJYnyZGVloU6dOl/1+oiIVBWTGkREVOhZWFgoOwQiIiIiIvqLf7pMq5mZGRISEnDw4EEcOnQIQ4YMQWBgII4ePSqtU/Exurq6H6yL8dft/4W/xiSTyaTExbt379CqVSu0atUKa9asgZGREe7du4fWrVsjKyvrk+eRyWSfPW/eP/fs2fNBBy4dHZ2vc2FERCpOQ9kBEBERERERERGR6rGwsICWlhZOnz4tffbq1SvcuHHjk8fo6uqiU6dOWLhwIY4cOYLo6Ghp9IO2tjZyc3P/cRyWlpbQ1dVFZGTkR7fnraHxb879KdevX8fz588xa9YsNG7cGNWqVcOzZ8+++LzVq1eHjo4O7t27BwsLiwI/ZmZmXyFyIiLVx5EaRERERERERET0j+nr68Pd3R1jx46FoaEhTExMMHHiRGhofLwP7cqVK5Gbm4v69etDT08Pq1evhq6uLipUqAAAqFixIo4dO4bu3btDR0cHpUuX/ltxFClSBOPGjYOXlxe0tbXRqFEjJCcn48qVK3B3d4exsTF0dXWxf/9+lC9fHkWKFIGBgcEXXbu5uTm0tbWxaNEiDBo0CJcvX8b06dO/6JwAUKxYMYwZMwaenp5QKBRwdHTE27dvcerUKejr60trhhARqTOO1CAiIiIiIiIion8lMDAQTZo0QadOndCyZUs4OjrC1tb2o/uWKFECoaGhaNSoEWrVqoXIyEjs2rULhoaGAIBp06bhzp07qFKlirS49981efJkjB49Gj4+PrC2tka3bt2kkROamppYuHAhQkJCULZsWXTu3PnLLhrvFx9fuXIlNm3ahOrVq2PWrFkICgr64vMCwPTp0+Hj4wN/f39YW1ujdevW2LVrFypVqvRVzk9EpOpk4p9OgEhERERERERERERERKQEHKlBREREREREREREREQqgUkNIiIiIiIiIiJSK/r6+p/8OX78uLLDIyKiz+D0U0REREREREREpFZu3rz5yW3lypWDrq7uN4yGiIj+CSY1iIiIiIiIiIiIiIhIJXD6KSIiIiIiIiIiIiIiUglMahARERERERERERERkUpgUoOIiIiIiIiIiIiIiFQCkxpERERERERERERERKQSmNQgIiIiIiIiIiIiIiKVwKQGERERERERERERERGpBCY1iIiIiIiIiIiIiIhIJTCpQUREREREREREREREKuH/AcAw4wmCzvcaAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Top 5 districts with highest nightlight growth\n", + "top_5_growth = df_ntl_dist.nlargest(5, 'nightlight_change_2015_2024')\n", + "bottom_5_growth = df_ntl_dist.nsmallest(5, 'nightlight_change_2015_2024')\n", + "\n", + "print(\"TOP 5 DISTRICTS - HIGHEST NIGHTLIGHT GROWTH (2015-2024):\")\n", + "print(\"=\"*60)\n", + "for idx, row in top_5_growth.iterrows():\n", + " print(f\"{row['district_name']}: {row['nightlight_change_2015_2024']:.1f}% growth\")\n", + "\n", + "print(\"\\nBOTTOM 5 DISTRICTS - LOWEST NIGHTLIGHT GROWTH (2015-2024):\")\n", + "print(\"=\"*60)\n", + "for idx, row in bottom_5_growth.iterrows():\n", + " print(f\"{row['district_name']}: {row['nightlight_change_2015_2024']:.1f}% growth\")\n", + "\n", + "# Visualization of extreme districts\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))\n", + "\n", + "# Top 5 districts\n", + "top_5_growth.plot(x='district_name', y='nightlight_change_2015_2024', \n", + " kind='bar', ax=ax1, color='green', alpha=0.7)\n", + "ax1.set_title('Top 5 Districts: Nightlight Growth', fontsize=14)\n", + "ax1.set_ylabel('Nightlight Change (%)')\n", + "ax1.tick_params(axis='x', rotation=45)\n", + "\n", + "# Bottom 5 districts\n", + "bottom_5_growth.plot(x='district_name', y='nightlight_change_2015_2024', \n", + " kind='bar', ax=ax2, color='red', alpha=0.7)\n", + "ax2.set_title('Bottom 5 Districts: Nightlight Growth', fontsize=14)\n", + "ax2.set_ylabel('Nightlight Change (%)')\n", + "ax2.tick_params(axis='x', rotation=45)\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "fb9b2ce3", + "metadata": {}, + "source": [ + "
\n", + "

📝 Marking Notes for Part-2-EDA

\n", + "
    \n", + "
  • Heatmap: 10
  • \n", + "
  • Interesting Correlations: 5
  • \n", + "
  • NTL Trends: 10
  • \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "4c703224", + "metadata": {}, + "source": [ + "## Modelling " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "383af240", + "metadata": {}, + "outputs": [], + "source": [ + "# Prepare variables for modeling\n", + "predictor_vars = ['nightlight_change_2015_2024', 'mean_nightlight_change_2015_2024', 'building_count',\n", + " 'total_nightlight_2024', 'mean_nightlight_2024', 'lit_pixel_percentage_2024','mean_nightlight_2020',\n", + " 'lit_pixel_percentage_2020', 'lit_pixel_change_2015_2024'\n", + "]\n", + "\n", + "target_var = 'total_population'" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "da8ed78d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " OLS Regression Results \n", + "==============================================================================\n", + "Dep. Variable: total_population R-squared: 0.540\n", + "Model: OLS Adj. R-squared: 0.538\n", + "Method: Least Squares F-statistic: 281.3\n", + "Date: Fri, 19 Sep 2025 Prob (F-statistic): 0.00\n", + "Time: 13:00:30 Log-Likelihood: -20322.\n", + "No. Observations: 2163 AIC: 4.066e+04\n", + "Df Residuals: 2153 BIC: 4.072e+04\n", + "Df Model: 9 \n", + "Covariance Type: nonrobust \n", + "====================================================================================================\n", + " coef std err t P>|t| [0.025 0.975]\n", + "----------------------------------------------------------------------------------------------------\n", + "const 2213.2951 341.388 6.483 0.000 1543.810 2882.780\n", + "nightlight_change_2015_2024 4.224e+05 2.67e+06 0.158 0.874 -4.81e+06 5.65e+06\n", + "mean_nightlight_change_2015_2024 -4.224e+05 2.67e+06 -0.158 0.874 -5.65e+06 4.81e+06\n", + "building_count 2.9272 0.087 33.623 0.000 2.757 3.098\n", + "total_nightlight_2024 13.7070 1.244 11.022 0.000 11.268 16.146\n", + "mean_nightlight_2024 219.5286 214.385 1.024 0.306 -200.894 639.951\n", + "lit_pixel_percentage_2024 -1068.1185 790.110 -1.352 0.177 -2617.577 481.341\n", + "mean_nightlight_2020 -214.2300 365.571 -0.586 0.558 -931.139 502.679\n", + "lit_pixel_percentage_2020 1068.5510 789.789 1.353 0.176 -480.277 2617.379\n", + "lit_pixel_change_2015_2024 500.7809 188.848 2.652 0.008 130.437 871.125\n", + "==============================================================================\n", + "Omnibus: 1939.170 Durbin-Watson: 1.110\n", + "Prob(Omnibus): 0.000 Jarque-Bera (JB): 221683.446\n", + "Skew: 3.728 Prob(JB): 0.00\n", + "Kurtosis: 52.032 Cond. No. 9.91e+07\n", + "==============================================================================\n", + "\n", + "Notes:\n", + "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", + "[2] The condition number is large, 9.91e+07. This might indicate that there are\n", + "strong multicollinearity or other numerical problems.\n", + "\n", + "Top 3 most predictive variables:\n", + " Variable Coefficient \\\n", + "building_count building_count 2.927238 \n", + "total_nightlight_2024 total_nightlight_2024 13.706998 \n", + "lit_pixel_change_2015_2024 lit_pixel_change_2015_2024 500.780863 \n", + "\n", + " P-value Abs_t_stat \n", + "building_count 1.425043e-199 33.622678 \n", + "total_nightlight_2024 1.601139e-27 11.022217 \n", + "lit_pixel_change_2015_2024 8.066012e-03 2.651763 \n", + "\n", + "Model with top 3 variables:\n", + " OLS Regression Results \n", + "==============================================================================\n", + "Dep. Variable: total_population R-squared: 0.534\n", + "Model: OLS Adj. R-squared: 0.534\n", + "Method: Least Squares F-statistic: 825.2\n", + "Date: Fri, 19 Sep 2025 Prob (F-statistic): 0.00\n", + "Time: 13:00:30 Log-Likelihood: -20337.\n", + "No. Observations: 2163 AIC: 4.068e+04\n", + "Df Residuals: 2159 BIC: 4.070e+04\n", + "Df Model: 3 \n", + "Covariance Type: nonrobust \n", + "==============================================================================================\n", + " coef std err t P>|t| [0.025 0.975]\n", + "----------------------------------------------------------------------------------------------\n", + "const 1698.7816 113.001 15.033 0.000 1477.179 1920.384\n", + "building_count 2.8945 0.085 33.978 0.000 2.727 3.062\n", + "total_nightlight_2024 15.5039 1.043 14.869 0.000 13.459 17.549\n", + "lit_pixel_change_2015_2024 143.4122 174.158 0.823 0.410 -198.123 484.947\n", + "==============================================================================\n", + "Omnibus: 1939.588 Durbin-Watson: 1.109\n", + "Prob(Omnibus): 0.000 Jarque-Bera (JB): 232689.703\n", + "Skew: 3.712 Prob(JB): 0.00\n", + "Kurtosis: 53.267 Cond. No. 4.20e+03\n", + "==============================================================================\n", + "\n", + "Notes:\n", + "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", + "[2] The condition number is large, 4.2e+03. This might indicate that there are\n", + "strong multicollinearity or other numerical problems.\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3RU1drH8e+k96GlEIjUEIGAIigCKh2kiL4W0EgEUUBRuAiIIhZEiiDNdi1cBDteCzaKWFGkCoJ0QTpJSIA00pM57x/nZiAkQBISJpn8PmtlOWefPTPPnD0z8sxuFsMwDERERERERESkzLk4OgARERERERERZ6WkW0RERERERKScKOkWERERERERKSdKukVERERERETKiZJuERERERERkXKipFtERERERESknCjpFhERERERESknSrpFREREREREyomSbhEREREREZFyoqRbRKqcV155BYvFQmRkZKkfIyYmhkmTJrFly5ayC+wCOnXqRKdOnS7Lc11I/fr1sVgs9j8/Pz/atm3Le++9d1mef9GiRVgsFg4ePGgvK+21mTZtGl9++WWZxZbv4MGDWCwWFi1adMF6v/zyS4Fr6erqSnBwMHfddRe7du0q87hKY9KkSVgsllLdd9myZUyaNKnIc/Xr12fw4MGlD6yU8t8/f/zxR5Hn+/btS/369Uv0mPnt+Msvv1x6gCVw7mfxfH8Xex+WhYkTJ9KqVStq1KiBl5cXDRs2ZNiwYRw6dOiC9/vqq6+wWCy8+eab563z/fffY7FYmDNnTpnEeinfpfXr16dv374XrVfc7wARqTrcHB2AiMjl9s477wCwY8cO1q9fT9u2bUv8GDExMTz//PPUr1+fq6++uowjrNg6dOjArFmzADh69CizZs1i0KBBpKWl8fDDD1/2eP7973+X6n7Tpk3jzjvv5LbbbivbgEoRR+fOncnOzuaPP/5g8uTJ/Pjjj2zbto06deo4NLZLsWzZMl5//fUiE+8lS5YQEBBw+YMqB9dccw1r166lWbNml/V5lyxZQlZWlv34P//5DwsWLGDFihVYrVZ7eaNGjco9lqSkJO655x6aNm2Kv78/O3fuZMqUKXz99dfs2LGDmjVrFnm/Pn36EBISwjvvvMNDDz1UZJ2FCxfi7u5OdHR0mcRa2u8LEZFLoaRbRKqUP/74g61bt9KnTx+WLl3KggULSpV0V2XVqlXj+uuvtx9369aNevXqMWfOnPMm3Xl5eeTm5uLp6Vnm8VzuZKeshYeH26/nTTfdRLVq1XjggQdYtGgREydOdHB05aNVq1aODqHMBAQEFPg8XC7nXsMVK1YA0Lp1a2rVqnVZY3n99dcLHHfq1IkGDRrQu3dvvvrqK4YMGVLk/dzc3LjvvvuYOXMm27dvLzT6KCkpiSVLltCvXz8CAwMvKcb09HR8fHwq/feFiFROGl4uIlXKggULAHjxxRdp3749ixcvJj09vVC9Y8eOMWzYMMLCwvDw8CA0NJQ777yT48eP88svv3DttdcCcP/999uHceb36J1v+OLgwYMLDV19/vnnadu2LTVq1CAgIIBrrrmGBQsWYBhGiV/bbbfdRr169bDZbIXOtW3blmuuucZ+/Omnn9K2bVusVis+Pj40bNjwvP8wvphq1aoRERFhH0qaP7Ry5syZTJkyhQYNGuDp6cnPP/8MmD989OvXzz4UtVWrVvz3v/8t9Ljr1q2jQ4cOeHl5ERoayoQJE8jJySlUr6jrnZWVxeTJk2natCleXl7UrFmTzp07s2bNGgAsFgtpaWm8++679vY7+zHi4uIYPnw4devWxcPDgwYNGvD888+Tm5tb4HliYmLo378//v7+WK1WBgwYQFxcXKmuY778BC7/etpsNmbOnMmVV16Jp6cnQUFB3HfffRw9erTQdYiMjOS3337j+uuvx9vbmzp16vDMM8+Ql5dnr3e+4dDFHRL7ySef0KNHD2rXro23tzdNmzblySefJC0tzV5n8ODB9kTs7KHO+dMCihpefvjwYQYOHEhQUBCenp40bdqU2bNnF3g/58c4a9Ys5syZQ4MGDfDz86Ndu3asW7fuote2NN544w2uuuoq/Pz88Pf358orr+Spp56yny/qeg4ePBg/Pz/27dtH79698fPzIywsjLFjxxbonQZztMidd96Jv78/1apV495772Xjxo1lMjw5MzOTCRMm0KBBAzw8PKhTpw6PPPIISUlJBerlD5tesmQJLVu2tA8Rf+WVV0r93PlJspvbhft3HnjgAcDs0T7Xxx9/TGZmpv276fXXX+emm24iKCgIX19fWrRowcyZMwt9L+R/Fn799Vfat2+Pj4+P/TGK+r4o6fdwaa/T3r17iYqKKvAeP/cHC5vNxpQpU4iIiMDb25tq1arRsmVLXn755WI9h4hUTOrpFpEqIyMjg48//phrr72WyMhIhgwZwoMPPsinn37KoEGD7PWOHTvGtddeS05ODk899RQtW7bk5MmTfPfddyQmJnLNNdewcOFC7r//fp5++mn69OkDQN26dUsc08GDBxk+fDhXXHEFYCaaI0eO5NixYzz77LMleqwhQ4Zw66238tNPP9GtWzd7+e7du9mwYYP9H4Zr165lwIABDBgwgEmTJuHl5cWhQ4f46aefShw/QE5ODocOHSrUE/XKK6/QpEkTZs2aRUBAAOHh4fz888/cfPPNtG3bljfffBOr1crixYsZMGAA6enp9kRs586ddO3alfr167No0SJ8fHz497//zUcffXTReHJzc+nVqxe//fYbo0ePpkuXLuTm5rJu3ToOHz5M+/btWbt2LV26dKFz584888wzAPbhznFxcVx33XW4uLjw7LPP0qhRI9auXcuUKVM4ePCgPTnIyMigW7duxMTEMH36dJo0acLSpUsZMGBAqa5jvn379gFnkpaHH36Yt99+m0cffZS+ffty8OBBnnnmGX755Rc2b95coFczLi6Ou+++myeffJLJkyezdOlSpkyZQmJiIq+99tolxZVv79699O7dm9GjR+Pr68vu3buZMWMGGzZssL+HnnnmGdLS0vjss89Yu3at/b61a9cu8jETEhJo37492dnZvPDCC9SvX59vv/2WcePG8c8//xQaEvz6669z5ZVXMm/ePPvz9e7dmwMHDhQYWn2pFi9ezIgRIxg5ciSzZs3CxcWFffv2sXPnzoveNycnh379+vHAAw8wduxYfv31V1544QWsVqv9s52Wlkbnzp05deoUM2bMoHHjxqxYseKS30MAhmFw22238eOPPzJhwgRuvPFG/vrrL5577jnWrl3L2rVrC4w82bJlC6NHj2bSpEmEhITw4Ycf8q9//Yvs7GzGjRtXrOfMzc0lJyeH3bt3M3r0aJo0acLtt99+wfs0adKEG264gQ8++IAXX3wRd3d3+7mFCxdSp04devbsCcA///xDVFSU/UeErVu3MnXqVHbv3m2fNpQvNjaWgQMHMn78eKZNm4aLy/n7mUryPVza67Rz507at2/PFVdcwezZswkJCeG7775j1KhRnDhxgueeew6AmTNnMmnSJJ5++mluuukm+/U894cSEalkDBGRKuK9994zAOPNN980DMMwUlNTDT8/P+PGG28sUG/IkCGGu7u7sXPnzvM+1saNGw3AWLhwYaFzHTt2NDp27FiofNCgQUa9evXO+5h5eXlGTk6OMXnyZKNmzZqGzWa76GOeLScnxwgODjaioqIKlI8fP97w8PAwTpw4YRiGYcyaNcsAjKSkpAs+XlHq1atn9O7d28jJyTFycnKMAwcOGIMGDTIA4/HHHzcMwzAOHDhgAEajRo2M7OzsAve/8sorjVatWhk5OTkFyvv27WvUrl3byMvLMwzDMAYMGGB4e3sbcXFx9jq5ubnGlVdeaQDGgQMH7OXnXpv8dp4/f/4FX4uvr68xaNCgQuXDhw83/Pz8jEOHDhUoz79uO3bsMAzDMN544w0DML766qsC9YYOHXre98bZfv75ZwMwPvnkEyMnJ8dIT083fv31V6Nx48aGq6ursXXrVmPXrl0GYIwYMaLAfdevX28AxlNPPVXgOpwvHhcXF/vryX/en3/+uUC9/HY7O+7nnnvOuNA/FWw2m5GTk2OsWrXKAIytW7fazz3yyCPnvW+9evUKXPsnn3zSAIz169cXqPfwww8bFovF2LNnT4EYW7RoYeTm5trrbdiwwQCMjz/++LyxGoZhLFy40ACMjRs3Fnm+T58+BT6jjz76qFGtWrULPmZR1zP/M/Hf//63QN3evXsbERER9uPXX3/dAIzly5cXqDd8+PBivYfOlt9WCQkJhmEYxooVKwzAmDlzZoF6n3zyiQEYb7/9tr2sXr16hsViMbZs2VKgbvfu3Y2AgAAjLS3tos8fGxtrAPa/tm3bGseOHStW7Pnt8sUXX9jLtm/fbgDGxIkTi7xP/vfle++9Z7i6uhqnTp2yn8v/LPz444+F7nex79ILfQ8X9zoV9Vnq2bOnUbduXSM5ObnAfR999FHDy8vLHn/fvn2Nq6+++rzxiUjlpOHlIlJlLFiwAG9vb+6++24A/Pz8uOuuu/jtt9/Yu3evvd7y5cvp3LkzTZs2LfeY8nulrVYrrq6uuLu78+yzz3Ly5Eni4+NL9Fhubm4MHDiQL774guTkZMCcS/3+++9z66232hczyh8a379/f/773/9y7NixEj3PsmXLcHd3x93dnQYNGvDf//6XkSNHMmXKlAL1+vXrV6DXat++fezevZt7770XMHvF8v969+5NbGwse/bsAeDnn3+ma9euBAcH2+/v6uparB7A5cuX4+XlVerh8t9++y2dO3cmNDS0QIy9evUCYNWqVfYY/f396devX4H7R0VFlej5BgwYgLu7Oz4+Ptx0003k5eXx2Wef0bJlS/uQ/HOHYl933XU0bdqUH3/8sUD5+eKx2Wz8+uuvJYrrfPbv309UVBQhISH292zHjh0BSr3q+k8//USzZs247rrrCpQPHjwYwzAKjcLo06cPrq6u9uOWLVsCXHS17JK67rrr7IuEffXVV5w4caLY97VYLNxyyy0Fylq2bFkgxlWrVuHv78/NN99coN4999xzaYGD/Zqd+96566678PX1LfTead68OVdddVWBsqioKFJSUti8efNFn69WrVps3LiR1atXM3/+fE6dOkXnzp2JjY296H3zp2ic3Vv9zjvvYLFYuP/+++1lf/75J/369aNmzZr29959991HXl4ef//9d4HHrF69Ol26dLnoc0PJvodLc50yMzP58ccf+b//+z98fHwKffdlZmbap0dcd911bN26lREjRvDdd9+RkpJSrNcgIhWbkm4RqRL27dvHr7/+Sp8+fTAMg6SkJJKSkrjzzjsBCvxjLyEhoVRDxUtqw4YN9OjRA4D58+fz+++/s3HjRvviWRkZGSV+zCFDhpCZmcnixYsB+O6774iNjS3wD9ebbrqJL7/8ktzcXO677z7q1q1LZGQkH3/8cbGe44YbbmDjxo388ccf7Ny5k6SkJF555RU8PDwK1Dt3KPHx48cBGDdunD1pz/8bMWIEgD2pOXnyJCEhIYWeu6iycyUkJBAaGnrB4aQXcvz4cb755ptCMTZv3rxQjGf/KFCSGM82Y8YMNm7cyObNmzl8+DD79++3r6h+8uRJoOhh2aGhofbz+S4Uz7l1S+P06dPceOONrF+/nilTpvDLL7+wceNGvvjiC6B079n82M73GvPPn+3c1bDzh0lf7Pnz5xefPcf9bLm5uQV+KIqOjuadd97h0KFD3HHHHQQFBdG2bVu+//77i7wi8PHxwcvLq1CcmZmZ9uPzvYeKKiupkydP4ubmVmjah8ViISQkpNA1vdDnrTjvHTc3N9q0aUOHDh148MEH+emnn9i/fz8vvvjiRe/r4+PD3XffzYoVK4iLiyM3N5cPPviAjh072ldfP3z4MDfeeCPHjh3j5Zdf5rfffmPjxo32OdHntv35pjKcq6Tfw6W5TidPniQ3N5dXX3210PdK7969gTPfKxMmTGDWrFmsW7eOXr16UbNmTbp27Xrebe5EpHLQnG4RqRLeeecdDMPgs88+47PPPit0/t1332XKlCm4uroSGBhYaJGqkvDy8rL3NJ/t3F6yxYsX4+7uzrffflvgH+eXsnd0fm/hwoULGT58OAsXLiQ0NNT+j8p8t956K7feeitZWVmsW7eO6dOnExUVRf369WnXrt0Fn8NqtdKmTZuLxnLu/s75c48nTJhw3nmeERERgJlUFbUgWXEWKQsMDGT16tXYbLZSJd61atWiZcuWTJ06tcjz+YlgzZo12bBhQ6liPFvDhg3Pez3zk8vY2NhCPwTFxMQUWqU6/4eNouLJf6z899q5C3oVpxf3p59+IiYmhl9++cXeuw1c8nzTmjVrFtkjGhMTA1Bmq3HnJ7PnG91x7NixQgnv/fffz/33309aWhq//vorzz33HH379uXvv/+mXr16lxRPWb2HzvfYubm5JCQkFEi8DcMgLi7OPuLlQs957nunJOrWrUtoaGihHujzeeCBB5g/fz7vvfceTZo0IT4+ntmzZ9vPf/nll6SlpfHFF18UuO5btmwp8vGKu798Sb+HS3OdqlevjqurK9HR0TzyyCNF1mnQoAFg/ngxZswYxowZQ1JSEj/88ANPPfUUPXv25MiRI/j4+BTrdYlIxaKebhFxenl5ebz77rs0atSIn3/+udDf2LFjiY2NZfny5QD06tWLn3/+2T7UuSgX6lmrX78+f//9d4Gk5uTJk/aVs/NZLBbc3NwKDJPNyMjg/fffv6TXe//997N+/XpWr17NN998w6BBgwo8x7mvo2PHjsyYMQMwh2+Wl4iICMLDw9m6dStt2rQp8s/f3x+Azp078+OPPxZIIvPy8vjkk08u+jy9evUiMzPzois/e3p6Ftl+ffv2Zfv27TRq1KjIGPOT7s6dO5OamsrXX39d4P7FWeytuPKHx37wwQcFyjdu3MiuXbvo2rVrgfLzxePi4sJNN90EYF9B/6+//ipQ79z7FSU/kTl367e33nqrUN3i9j4DdO3alZ07dxYanvvee+9hsVjo3LnzRR+jOK6//nr8/PyKfB/t3LmTHTt2FFiE8Gy+vr706tWLiRMnkp2dzY4dOy45no4dO5Kammr/7smXP1LlUuS/N85973z++eekpaUVeu/s2LGDrVu3Fij76KOP8Pf3L7DzQXHt27ePo0eP0rhx42LVb9u2LZGRkSxcuJCFCxditVq544477OeLeu8ZhsH8+fNLHNvZSvo9XJrr5OPjQ+fOnfnzzz9p2bJlkd8rRSXs1apV48477+SRRx7h1KlT9tX/RaTyUU+3iDi95cuXExMTw4wZM4rcyisyMpLXXnuNBQsW0LdvXyZPnszy5cu56aabeOqpp2jRogVJSUmsWLGCMWPGcOWVV9KoUSO8vb358MMPadq0KX5+foSGhhIaGkp0dDRvvfUWAwcOZOjQoZw8eZKZM2faV8fO16dPH+bMmUNUVBTDhg3j5MmTzJo165L3sr7nnnsYM2YM99xzD1lZWYXmdD777LMcPXqUrl27UrduXZKSknj55ZcLzM0tL2+99Ra9evWiZ8+eDB48mDp16nDq1Cl27drF5s2b+fTTTwF4+umn+frrr+nSpQvPPvssPj4+vP766wW2pTqfe+65h4ULF/LQQw+xZ88eOnfujM1mY/369TRt2tQ+p79Fixb88ssvfPPNN9SuXRt/f38iIiKYPHky33//Pe3bt2fUqFFERESQmZnJwYMHWbZsGW+++SZ169blvvvuY+7cudx3331MnTqV8PBwli1bxnfffVdm1ysiIoJhw4bx6quv4uLiQq9eveyrl4eFhfHYY48VqF+zZk0efvhhDh8+TJMmTVi2bBnz58/n4Ycftq/MHBISQrdu3Zg+fTrVq1enXr16/Pjjj/Yh4hfSvn17qlevzkMPPcRzzz2Hu7s7H374YaEkBMzrC+bw+V69euHq6krLli0LTUMAeOyxx3jvvffo06cPkydPpl69eixdupR///vfPPzwwzRp0qQ0l68Qf39/nn/+ecaOHYvNZmPAgAFUr16dbdu2MW3aNOrVq8eoUaPs9YcOHYq3tzcdOnSgdu3axMXFMX36dKxWa6Ge4tIYNGgQc+fOZeDAgUyZMoXGjRuzfPly+3uotFMkALp3707Pnj154oknSElJoUOHDvbVy1u1akV0dHSB+qGhofTr149JkyZRu3ZtPvjgA77//ntmzJhxwd7Vv/76i8cee4w777yThg0b4uLiwrZt25g7dy41a9Ys9srnYE6PGTNmDHv27GH48OF4e3sXeD0eHh7cc889jB8/nszMTN544w0SExNLfnHOUtLv4dJep5dffpkbbriBG2+8kYcffpj69euTmprKvn37+Oab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Zs6EiAiHhiYiInK5FHt4+YwZM3jyySfx9fWldu3azJkzR1uEiYiIyPlNmmTuuZ2UBC1bmnO2v/pKCbeIiFQpxU66Fy1axKuvvsrKlSv56quv+PLLL3nvvfcwDKM84xMREZHKJDf3zO1//QuaNIH//Ac2b4auXR0Xl4iIiIMUe3j5oUOH6Nu3r/24Z8+eGIZBTEwMderUKZfgREREpJKIiYGJE835219/bZYFB8OuXeBS4nVbRUREnEaxk+7s7Gy8vb3txxaLBQ8PD7KyssolMBEREakE0tNh9myYMQPS0syyv/4yh5ODEm4REanySrR6+TPPPIOPj4/9ODs7m6lTp2K1Wu1lc+bMKbvoREREpGKy2eCjj2DCBDh61Cy7/nqYO/dMwi0iIiLFT7pvuukm9uzZU6Csffv27N+/335s0bYfIiIizu/wYbjzTti40Ty+4gqzp3vAAG0BJiIico5iJ92//PJLOYYhIiIilUZwsDl3288PnnoKRo+Gs6agiYiIyBklGl4uIiIiVVByMrz1lrn9l5sbeHrC4sUQFgYhIY6OTkREpEJT0i0iIiJFy801t/t69llISDB7tkeMMM9de61jYxMREakklHSLiIhIYStXmj3bO3aYxxER0KiRY2MSERGphLSPh4iIiJyxaxf07g09e5oJd40a8MorsG2bWSYiIiIlop5uEREROWPUKPjhB3Pu9siR8MwzUL26o6MSERGptIqVdP/111/FfsCW2ptTRESk8sjKgpwcc742wMyZMHmy+d/wcMfGJiIi4gSKlXRfffXVWCwWDMO46F7ceXl5ZRKYiIiIlCPDgCVLYPx46NcP5swxy1u1MstFRESkTBRrTveBAwfYv38/Bw4c4PPPP6dBgwb8+9//5s8//+TPP//k3//+N40aNeLzzz8v73hFRETkUm3aBJ06wR13wD//wOefQ2amo6MSERFxSsXq6a5Xr5799l133cUrr7xC79697WUtW7YkLCyMZ555httuu63MgxQREZEycOwYTJwI771n9nR7ecG4cfDEE+ZtERERKXMlXkht27ZtNGjQoFB5gwYN2LlzZ5kEJSIiImXs229hwABITzeP770Xpk2DK65wbFwiIiJOrsRbhjVt2pQpU6aQedYwtKysLKZMmULTpk3LNDgREREpI23agIsLtG8P69bBBx8o4RYREbkMStzT/eab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cGCkilJHpPGJS0c/9v3d/M29T/P339nJ39z7NB/7/m52DZRmtBYQX8vRqk826RCquITfHb/hcOQH8wnZhE3Zizu9L8snUVozUKoTRnp8HBxEkWakXOehvSPsHixTqPocGquxoTM7o/3WGzpz/M516/m9F23irTds5PdetIk3Xbt+ys/bRLB5XleeVa3pGZWU37NtgFI9ZENHllzSwTLjxn0bO7OMVHzu2d4/7bUWYqE5fJNt+ptcKdfCCyMZKyeEEGJRmNNMd6VS4eKLL+a1r30tv/qrv3rU4x/84Af5yEc+wmc+8xk2bdrEX/7lX/KiF72Ip556ilwu/nD7jne8g//93//ly1/+Mm1tbfz+7/8+L33pS3n44YexLAuAW265hYMHD3L33XcD8Fu/9Vvceuut/O///i8AURTxkpe8hI6ODn70ox8xPDzMa17zGrTWfPSjHz1LV0PMxLGa7rzogmW83O0+6RLWI0vUIQ5i065J76hH0QuxDIPBsk/SsbjinGYyCZuv/byXaLzDuTXp1pVlQqjipmpaK54eqBCGh+dHGePHTG6oFipFsRrihzWCSKOUxjLivdWRjpuaxd9skHQMbDNucFYen0sVKLhwzzb+9Duf5NLepwB49SNf557Nz2fvUIUgUoxUPLxAs3+kCsRN3WwrHnHmWhatOZuhik8QaUKtSRjQmU9y9fo2fv3K1WzozDWu/aMHRtk/UqXmR6Qci9VtaS5d1TKl/HkmezXXtU/NBC/PJ4/aLuBHijBS2AmLsWpIZz5JLnn419Z0JeHjw83QxBUCI5WAeqDiagEV30zwI81w2WOkEtBfrJF2LTpySX7tityMS1mny+CeThfmnrEau4fKrM64aMn8iUVOxsoJIYRYSub0X7Obb76Zm2++edrHtNb87d/+Le9973v5lV/5FQA++9nPsmzZMr74xS/y27/92xQKBT71qU/xr//6r7zwhS8E4POf/zyrVq3i29/+NjfddBM7duzg7rvv5ic/+QlXXnklAJ/4xCe46qqreOqppzj33HO55557eOKJJzhw4ADd3d0A/PVf/zW33XYb73//+8nn82fhaogTmUkgd15XvFYT2fATBT9TupjvH2O44nForE7JC1AqDpATtknCNsknLfpLHl0czlSHGghVI/uq1Ph4MGBrTwEviLPcE4GzQRxIG+PBtBrf6u1HmnC8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++7jZS97Gd3d3RiGwV133TXlca01t99+O93d3aRSKa677jq2b98+5RjP83jrW99Ke3s7mUyGl7/85Rw8eHDKMaOjo9x66600NTXR1NTErbfeytjY2JRj9u/fz8te9jIymQzt7e287W1vw/f92Xjbi9Kdd97Js571LHK5HJ2dnfzSL/0STz311JRjZD0Xlo997GNcdNFFjbmgV111Fd/85jcbj8t6Llx33nknhmHwjne8o/E1Wc+F5fbbb8cwjCn/dXV1NR6X9Vx4enp6ePWrX01bWxvpdJpLLrmEhx9+uPG4rOnCsWbNmqP+fhqGwVve8hZA1hIALZaEL3/5y9pxHP2JT3xCP/HEE/rtb3+7zmQy+plnnpnrU1tSvvGNb+j3vve9+itf+YoG9H//939PefwDH/iAzuVy+itf+YreunWrftWrXqWXL1+ui8Vi45g3velNesWKFfree+/VjzzyiL7++uv1xRdfrMMwbBzz4he/WG/evFnff//9+v7779ebN2/WL33pSxuPh2GoN2/erK+//nr9yCOP6HvvvVd3d3fr3/3d3531a7BY3HTTTfrTn/603rZtm37sscf0S17yEr169WpdLpcbx8h6Lixf/epX9de//nX91FNP6aeeekr/8R//sXYcR2/btk1rLeu5UD300EN6zZo1+qKLLtJvf/vbG1+X9VxY3ve+9+kLL7xQ9/b2Nv4bGBhoPC7rubCMjIzoc845R9922236wQcf1Hv37tXf/va39a5duxrHyJouHAMDA1P+bt57770a0N/73ve01rKWWmstQfcS8exnP1u/6U1vmvK18847T//hH/7hHJ2RODLoVkrprq4u/YEPfKDxtXq9rpuamvQ//dM/aa21Hhsb047j6C9/+cuNY3p6erRpmvruu+/WWmv9xBNPaED/5Cc/aRzzwAMPaEA/+eSTWus4+DdNU/f09DSO+dKXvqQTiYQuFAqz8n4Xu4GBAQ3oH/zgB1prWc/FoqWlRX/yk5+U9VygSqWS3rhxo7733nv1tdde2wi6ZT0Xnve973364osvnvYxWc+F5z3veY9+7nOfe8zHZU0Xtre//e16/fr1WiklazlOysuXAN/3efjhh7nxxhunfP3GG2/k/vvvn6OzEkfau3cvfX19U9YpkUhw7bXXNtbp4YcfJgiCKcd0d3ezefPmxjEPPPAATU1NXHnl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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Filter out rows with NaN values\n", + "df_model = df.dropna(subset=predictor_vars + [target_var])\n", + "\n", + "# Add constant term for intercept\n", + "X = sm.add_constant(df_model[predictor_vars])\n", + "y = df_model[target_var]\n", + "\n", + "# Fit the model\n", + "model = sm.OLS(y, X).fit()\n", + "\n", + "# Print model summary\n", + "print(model.summary())\n", + "\n", + "# Find the top 3 most predictive variables\n", + "# We'll use absolute t-statistic values to rank variable importance\n", + "var_importance = pd.DataFrame({\n", + " 'Variable': predictor_vars,\n", + " 'Coefficient': model.params[1:], # Skip the constant term\n", + " 'P-value': model.pvalues[1:], # Skip the constant term\n", + " 'Abs_t_stat': abs(model.tvalues[1:]) # Skip the constant term\n", + "}).sort_values('Abs_t_stat', ascending=False)\n", + "\n", + "# Display the top 3 most predictive variables\n", + "top_3_vars = var_importance.head(3)\n", + "print(\"\\nTop 3 most predictive variables:\")\n", + "print(top_3_vars)\n", + "\n", + "# Create a simpler model with just the top 3 variables\n", + "X_top3 = sm.add_constant(df_model[top_3_vars['Variable'].tolist()])\n", + "model_top3 = sm.OLS(y, X_top3).fit()\n", + "\n", + "# Print the simpler model summary\n", + "print(\"\\nModel with top 3 variables:\")\n", + "print(model_top3.summary())\n", + "\n", + "# Create a scatter plot of actual vs predicted values\n", + "plt.figure(figsize=(10, 6))\n", + "plt.scatter(y, model_top3.predict(), alpha=0.5)\n", + "plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--')\n", + "plt.xlabel('Actual Population')\n", + "plt.ylabel('Predicted Population')\n", + "plt.title('Actual vs Predicted Population Using Top 3 Variables')\n", + "plt.grid(True, alpha=0.3)\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "6460ee22", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
VariableCoefficientP-valueAbs_t_stat
building_countbuilding_count2.9272381.425043e-19933.622678
total_nightlight_2024total_nightlight_202413.7069981.601139e-2711.022217
lit_pixel_change_2015_2024lit_pixel_change_2015_2024500.7808638.066012e-032.651763
\n", + "
" + ], + "text/plain": [ + " Variable Coefficient \\\n", + "building_count building_count 2.927238 \n", + "total_nightlight_2024 total_nightlight_2024 13.706998 \n", + "lit_pixel_change_2015_2024 lit_pixel_change_2015_2024 500.780863 \n", + "\n", + " P-value Abs_t_stat \n", + "building_count 1.425043e-199 33.622678 \n", + "total_nightlight_2024 1.601139e-27 11.022217 \n", + "lit_pixel_change_2015_2024 8.066012e-03 2.651763 " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "top_3_vars " + ] + }, + { + "cell_type": "markdown", + "id": "ca721f58", + "metadata": {}, + "source": [ + "
\n", + "

📝 Marking Notes for Part-2-Modelling

\n", + "
    \n", + "
  • Variable Selection: 10
  • \n", + "
  • Model definition and fittting: 15
  • \n", + "
  • Top variable selection and scatter scatterplot: 15
  • \n", + "
\n", + "
" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/assignments/assignment-2.ipynb b/notebooks/assignments/assignment-2.ipynb new file mode 100644 index 0000000..a2f547c --- /dev/null +++ b/notebooks/assignments/assignment-2.ipynb @@ -0,0 +1,333 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2baaa681-e813-428b-9010-4508b7291011", + "metadata": {}, + "source": [ + "# Programming Assignment-2\n", + "The goal of this assingment is to allow you to practice several the following things in Python:\n", + "1. Perfoming typical data processing (or preprocessing if you prefer). This includes all the typical data wraning such as creating news variables, combining several datasets and more \n", + "2. Running explolatory data analysis including basic plotting of variables \n", + "3. Perfoming basic inferential statisticals using statsmodels and scipy to run hypythesis testing and build simple statistial or econometric models.\n", + "\n", + "## Datasets \n", + "For this assignment, you will use the following datasets:\n", + "### Rwanda Health Indicators\n", + "The Excel file was generated by combining multiple CSV files, each containing data on different health indicators for Rwanda, So that each sheet in the file represent one such indicator. See below some of the input files which were used:\n", + "- `access-to-health-care_subnational_rwa`\n", + "- `child-mortality-rates_subnational_rwa`\n", + "- `dhs-mobile_subnational_rwa`\n", + "\n", + "You can download the dataset from [here](https://docs.google.com/spreadsheets/d/1uvTQYS22VfXXo1Hwkm1frFx_bKkLQkcf/edit?usp=share_link&ouid=113302179168925233984&rtpof=true&sd=true).\n", + "### Nights lights Data\n", + "- Please download it [here](https://drive.google.com/file/d/1f_4fiqxIejly0YmC088s9bxOfrABv9Sz/view?usp=sharing) and check the documentation in the cells below. \n", + "\n", + "### Popupation Dataset\n", + "- Please download it [here](https://drive.google.com/file/d/1FWEFGdN-xDuFH1jmt0hr4F8Xc3Y5XzvB/view?usp=share_link) and check the documentation and metadata in the class notebooks.\n", + "\n", + "\n", + "## Submission Guidelines \n", + "- Please guidelines and complete all steps in the [GitHub Workflow](https://dmatekenya.github.io/AIMS-DSCBI/course-requirements/github-workflow.html)\n", + "- Once you have completed your assignment, push chanegs to your repository.\n", + "- Send a link (copy from within GitHub) to your notebook to the tutors/teaching assistants\n" + ] + }, + { + "cell_type": "markdown", + "id": "1a0961aa", + "metadata": {}, + "source": [ + "# Import Required Packages" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "30d3cb64", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "id": "cbb0234e", + "metadata": {}, + "source": [ + "# Setup Input Folders\n", + "\n", + "As usual, it is good practice to set up input folders using the [`pathlib`](https://docs.python.org/3/library/pathlib.html) package. In this section, make sure to define the folders where your data is stored on your machine.\n", + "\n", + "I find it helpful to set up the working directory and input data folders right at the start of the notebook. To keep things organized, I use the naming convention: `FILE_{NAME}` for files and `DIR_{NAME}` for folders. We use capital letters because these are global variables that will be referenced throughout the notebook.\n", + "\n", + "We'll be using the [`pathlib`](https://docs.python.org/3/library/pathlib.html) library, which offers several advantages over traditional string-based path handling:\n", + "\n", + "- **Cross-platform compatibility** - automatically handles path separators (`/` vs `\\`) across different operating systems\n", + "- **Object-oriented approach** - paths are objects with useful methods rather than strings\n", + "- **Intuitive syntax** - use `/` operator to join paths naturally: `parent_dir / \"subfolder\" / \"file.txt\"`\n", + "- **Built-in path operations** - methods like `.exists()`, `.is_file()`, `.parent`, `.stem`, and `.suffix`\n", + "- **Safer path manipulation** - reduces errors from manual string concatenation and splitting\n", + "\n", + "This is the recommended approach for managing file paths in modern Python development.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ba8273ba", + "metadata": {}, + "outputs": [], + "source": [ + "# Uncomment the following lines and add your code to define the directories and files\n", + "DIR_DATA = Path.cwd().parents[1].joinpath(\"data\")\n", + "FILE_EXCEL = DIR_DATA/\"RW-Health-Data.xlsx\"\n", + "\n", + "# Population by enumeration area (EA) for Malawi\n", + "# FILE_POP_MW = ADD YOUR CODE\n" + ] + }, + { + "cell_type": "markdown", + "id": "3a15bb61", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "e49528b3", + "metadata": {}, + "source": [ + "# Part 1: Processing Excel Files\n", + "The primary goal is to preprocess an [Excel file](https://docs.google.com/spreadsheets/d/1uvTQYS22VfXXo1Hwkm1frFx_bKkLQkcf/edit?usp=share_link&ouid=113302179168925233984&rtpof=true&sd=true) with multiple sheets into a unified CSV dataset that consolidates multiple indicators. Having all indicators in a single file at the same analytical unit (national, subnational) is more efficient than managing separate files and enables easier cross-indicator analysis.\n", + "\n", + "## Task 1: Generate National-Level Summaries\n", + "\n", + "For each indicator, compute a single national-level value using appropriate aggregation functions such as **mean**, **sum** or **count**. For this one, all available indicators can be summarized at national level, so we will have a CSV file with one row and \n", + "\n", + "### Expected Output Structure\n", + "1. **DataFrame display** in Jupyter Notebook\n", + "2. **CSV file** with columns:\n", + "- `indicator_name`: Name of the indicator\n", + "- `aggregated_value`: Computed national value\n", + "- `indicator_year`: Survey year or something similar\n", + "- `survey_name`: Name of the survey where information is coming from\n", + "- `aggregation_method`: Statistical method used (optional)\n", + "\n", + "## Task 2: Subnational-Level Indicator Dataset\n", + "\n", + "Create a merged dataset for indicators with subnational data (ADM2/ADM3 levels), ensuring spatial alignment and consistent administrative boundaries.\n", + "\n", + "### Expected Output Structure\n", + " - `indicator_name`: Name of the indicator\n", + " - `aggregated_value`: Computed national value\n", + " - `indicator_year`: Survey year or something similar\n", + " - `survey_name`: Name of the survey where information is coming from\n", + " - `aggregation_method`: Statistical method used (optional)\n", + "\n", + "This structure enables both single-indicator and multi-indicator analysis at the subnational level." + ] + }, + { + "cell_type": "markdown", + "id": "9568e764", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "8169202f", + "metadata": {}, + "source": [ + "## Introduction to Nightlights Dataset\n", + "\n", + "## What is Nightlight Data?\n", + "\n", + "Nightlight data is satellite imagery capturing artificial light emissions from Earth's surface during nighttime. Satellites like VIIRS collect this data regularly, providing an **objective, real-time measure of human economic activity and development**.\n", + "\n", + "### Raw Data: Radiance Measurements\n", + "The fundamental measurement in nightlight data is **radiance** - the amount of light energy detected by satellite sensors, measured in **nanowatts per square centimeter per steradian (nW/cm²/sr)**. Each pixel in satellite imagery contains a radiance value representing the light intensity from that specific location on Earth's surface.\n", + "\n", + "### Annual Composite Generation\n", + "This dataset was created from **annual composite images** using VIIRS nightlight files for Rwanda. Annual composites are generated by:\n", + "\n", + "- **Aggregating daily/monthly observations** throughout each year (2015, 2020, 2024)\n", + "- **Filtering out temporary light sources** (fires, lightning, aurora)\n", + "- **Removing cloud-affected observations** to ensure clear measurements\n", + "- **Averaging or taking median values** to create stable, representative annual measurements\n", + "- **Masking techniques** to exclude areas with unreliable data\n", + "\n", + "The files used include both **average composites** (`average_masked`) and **median composites** (`median_masked`), with **cloud-free versions** (`vcmslcfg`) preferred over cloud-inclusive versions (`vcmcfg`) for more accurate measurements.\n", + "\n", + "### Why Use Nightlight Data?\n", + "\n", + "- **Consistent global coverage** - Available everywhere, regardless of local data quality\n", + "- **Real-time updates** - More current than traditional economic statistics\n", + "- **Objective measurement** - Not subject to reporting biases\n", + "- **High resolution** - Captures local development patterns\n", + "- **Proxy for development** - Light intensity correlates with economic activity, infrastructure, and quality of life\n", + "\n", + "## Dataset Overview \n", + "\n", + "- **6,507 observations** across Rwanda's administrative cells\n", + "- **Three time periods**: 2015, 2020, 2024\n", + "- **Cell-level data** - Rwanda's smallest administrative units\n", + "- Allows temporal analysis of development trends\n", + "\n", + "---\n", + "\n", + "## Variable Definitions\n", + "\n", + "### Administrative Identifiers\n", + "- **`cell_id`** - Unique identifier for linking with other datasets\n", + "- **`province_name`** - Province (5 total in Rwanda)\n", + "- **`district_name`** - District (30 total in Rwanda) \n", + "- **`sector_name`** - Administrative level between district and cell\n", + "- **`cell_name`** - Specific cell name\n", + "\n", + "### Core Nightlight Measurements\n", + "\n", + "#### `total_nightlight`\n", + "- **Sum of all radiance values** within cell boundaries\n", + "- **Key indicator** of overall economic activity/development\n", + "- Higher values = more total development\n", + "\n", + "#### `mean_nightlight` \n", + "- **Average radiance** per pixel\n", + "- Indicates development intensity regardless of cell size\n", + "- Useful for comparing cells of different areas\n", + "\n", + "#### `median_nightlight`\n", + "- **Middle radiance value** of all pixels (less sensitive to outliers)\n", + "- Better represents typical lighting in unevenly developed areas\n", + "\n", + "#### `max_nightlight`\n", + "- **Highest radiance** within cell\n", + "- Indicates major infrastructure (hospitals, commercial centers)\n", + "\n", + "#### `min_nightlight` & `std_nightlight`\n", + "- Minimum radiance and standard deviation\n", + "- High std = uneven development within cell\n", + "\n", + "### Spatial Coverage Indicators\n", + "\n", + "#### `pixel_count`\n", + "- **Total pixels** in cell (indicates geographic size)\n", + "- Used to normalize other measurements\n", + "\n", + "#### `lit_pixel_count`\n", + "- **Number of pixels with detectable light** (radiance > 0)\n", + "- Shows spatial extent of development\n", + "\n", + "#### `lit_pixel_percentage`\n", + "- **Percentage of cell area with lighting**\n", + "- Formula: `(lit_pixel_count ÷ pixel_count) × 100`\n", + "- **0% = completely dark, 100% = fully developed**\n", + "\n", + "#### `year`\n", + "- Time period: 2015, 2020, or 2024" + ] + }, + { + "cell_type": "markdown", + "id": "784d2e72", + "metadata": {}, + "source": [ + "# Part-2: Demographic and Nightlights Data\n", + "\n", + "## Part A: Varible Generation and Data Integration\n", + "\n", + "### Population Dataset Variables (`rwa-cell-pop.csv`):\n", + "Create the following derived variables:\n", + "- **`dependency_ratio`** - `(children_under_five_2020 + elderly_60_plus_2020) / working_age_population * 100`\n", + "- **`people_per_building`** - `general_2020 / building_count`\n", + "- **`working_age_population`** - `general_2020 - children_under_five_2020 - elderly_60_plus_2020`\n", + "- **`infrastructure_index`** - Your own formula that incorporates `people_per_building` and other relevant variables to measure infrastructure adequacy. Document and justify your `infrastructure_index` methodology, explaining how `people_per_building` and other variables contribute to measuring infrastructure pressure.\n", + "\n", + "### Nightlight Dataset Variables (`cell-ntl-2015-2020-2024.csv`):\n", + "Create the following temporal and development indicators:\n", + "- **`nightlight_change_2015_2024`** - Percentage change in total nightlight from 2015 to 2024\n", + "- **`mean_nightlight_change_2015_2024`** - Percentage change in mean nightlight from 2015 to 2024\n", + "- **`lit_pixel_percentage`** - Use existing or calculate: `(lit_pixel_count / pixel_count) * 100`\n", + "\n", + "### Data Integration:\n", + "Merge the datasets using the appropriate column. \n", + "\n", + "## Part B: Exploratory Data Analysis\n", + "\n", + "### Correlation Analysis:\n", + "1. **Correlation Heatmap**: Create a heatmap showing correlations between 10 key variables (mix of demographic, infrastructure, and nightlight variables). \n", + "2. **Report the top 3 variable pairs** with the highest correlations and interpret their relationships.\n", + "3. **Identify unexpected correlations** and discuss potential explanations.\n", + "\n", + "### Nightlight Trend Analysis:\n", + "1. **District Ranking**: Report the **top 5 districts** with the highest nightlight growth (2015-2024) and **bottom 5 districts** with the most decline or lowest growth.\n", + "2. **Lit Pixel Analysis**: Compare these districts using `lit_pixel_percentage` changes to understand whether growth represents intensification or spatial expansion.\n", + "3. **Create visualizations** showing nightlight trends for these extreme districts.\n", + "\n", + "## Part C: Modeling\n", + "\n", + "### Multivariate Linear Regression:\n", + "1. **Model Development**: Build a multivariate linear regression model predicting **population density** using both demographic and nightlight variables as predictors. Explore as many variables as possible at the beginning.\n", + "2. **Variable Selection**: Test different combinations of variables and report the **top 3 most predictive variables** of population density.\n", + "3. **Model Evaluation**: Report R-squared, coefficients, and statistical significance. Interpret what these results tell us about population-infrastructure relationships.\n", + "\n", + "\n", + "\n", + "## Notes and Other Requirements\n", + "Please follow the genral guidelines below when preparing your analysis..\n", + "\n", + "### Statistical Analysis:\n", + "- Properly handle missing data and outliers\n", + "- Use appropriate statistical tests and report p-values\n", + "- Calculate and interpret correlation coefficients\n", + "- Validate regression assumptions (normality, homoscedasticity)\n", + "\n", + "### Data Management:\n", + "- Document all data cleaning and aggregation steps using markdown \n", + "- Ensure consistent district naming across datasets\n", + "\n", + "### Visualization Standards:\n", + "- Create clear, publication-quality heatmaps with appropriate color scales\n", + "- Design effective time series plots for nightlight trends\n", + "- Include proper axis labels, titles, and legends\n", + "- Use consistent formatting across all visualizations\n", + "\n", + "### Reporting Requirements:\n", + "- Clearly state the top 3 most predictive variables with statistical justification\n", + "- Provide ranked lists for nightlight growth districts with supporting metrics\n", + "- Include model performance statistics and interpretation\n", + "- Document all methodological choices and assumptions" + ] + }, + { + "cell_type": "markdown", + "id": "99f0479d", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/assignments/assignment-3.md b/notebooks/assignments/assignment-3.md new file mode 100644 index 0000000..afce3ab --- /dev/null +++ b/notebooks/assignments/assignment-3.md @@ -0,0 +1,106 @@ +# Nightlight Analysis Environment Setup + +## Introduction + +The goal of this assignment is to help you practice Python environment setup, specifically for geospatial data analysis projects. You'll learn to create isolated virtual environments, manage package dependencies, and integrate your work with version control using GitHub. This exercise simulates a real-world scenario where you need to set up a reproducible analysis environment for spatial data processing. + +## Scenario +You're tasked with analyzing nightlight data to understand economic activity patterns across districts and cells. This requires setting up a geospatial analysis environment and sharing your work via GitHub. + +## Data +### Night Lights Dataset +We will use the [2024 annual nightlights file](https://drive.google.com/file/d/1bH-IiSHHsUqJXEkVrbD2uT7xholbIFkN/view?usp=share_link). For this exercise, you don’t need to worry about the technical details of nightlights imagery. If you’re interested in learning more, you can check out our [previous assignment](https://github.com/dmatekenya/AIMS-DSCBI/blob/main/notebooks/assignments/assignment-2.ipynb), which explains nightlights in greater depth. +### Administrative Boundaries + +The administrative boundaries for Rwanda are provided as shapefiles, a widely used GIS data format. Each shapefile consists of at least four associated files, so be sure to download all components—not just the file with the .shp extension. The relevant datasets are: +- [Rwanda national boundaries](https://drive.google.com/drive/folders/1cPwbcclnt0UcSkUPeYCjdFUWlhzyPO9N?usp=share_link). This will be used to clip the global night lights raster. +- [Rwanda admin4 (cell) boundaries](https://drive.google.com/drive/folders/1zC_qFY2svEyi8QAIhjL82C2DJLYSTwZw?usp=share_link). We will use the cells as zones for generating summary statistics. + +--- + +## Part 1: GitHub Repository Setup + +### Tasks: +1. Create a new GitHub repository named `nightlight-analysis-[yourname]` +2. Initialize with README.md +3. Create the following folder structure: +```text +nightlight-analysis/ +├── data/ (leave empty - for provided files) +├── src/ (for Python scripts) +├── outputs/ (for results) +├── requirements.txt +└── README.md +``` +### Deliverables for Submission +1. A link to your GitHub repository + +### Other Requirements +1. Make sure the `data/` folder is included in your `.gitignore` file so that no data files are pushed to GitHub. + + + +## Part 2: Virtual Environment Creation +### Required Setup: +Create a virtual environment using **pip/venv** with these specific package versions: +- python>=3.9,<3.12 +- gdal==3.6.2 +- geopandas==0.12.2 +- rasterio==1.3.6 +- pandas==1.5.3 +- numpy==1.24.3 +- matplotlib==3.6.3 +- seaborn==0.12.2 +- jupyter==1.0.0 + +### Steps: +1. Create virtual environment: `python -m venv .venv-ntl` +2. Activate the environment +3. Install all required packages +4. Create requirements.txt file +5. Test your installation + +### Deliverables for Submission +1. **requirements.txt** pushed to your GitHub repo +2. **Environment test**: Screenshot of Python importing all packages successfully: + ```python + import gdal, geopandas, rasterio, pandas, numpy, matplotlib + print("All packages imported successfully!") + print(f"GDAL version: {gdal.__version__}") + print(f"GeoPandas version: {geopandas.__version__}") + + + +## Spatial Analysis + +In this section, you will replicate the workflow demonstrated in the provided notebook to generate zonal statistics for nightlight intensity across administrative regions in Rwanda. Follow the steps below to complete your analysis: + +### Instructions + +1. **Get Updates from Course Repository** + - Follow instructions from GitHub Workflow + - Ensure you have used to pull to get updates from the course repository + +2. **Copy Materials** + - assignment instructions. This is this markdown + - [assignment-3-zonal-statistics notebook](https://github.com/dmatekenya/AIMS-DSCBI/blob/main/notebooks/assignments/assignment-3-zonal-stats.ipynb). Copy this notebook into your project repo. The repo you create in step-1 + - [spatial_utils](https://github.com/dmatekenya/AIMS-DSCBI/tree/main/src/spatial_utils). Copy this module and add it to the src fodler within your repository. + +3. **Complete Exercise** + - Update the **assignment-3-zonal-statistics notebook** to ensure you use correct file paths. + - Go through and run the notebook cells. + +### Deliverables + +- A Jupyter notebook (.ipynb) that follows the workflow above, with clear code, comments, and outputs. +- The resulting CSV file with zonal statistics. + +## Submission Instructions + +Please provide the following for your assignment submission: + +1. **GitHub Repository:** Share a link to your project repository. +2. **Environment Verification:** Upload a screenshot of your Python environment, ensuring your terminal displays your name. +3. **Zonal Statistics Notebook:** Submit the completed Jupyter notebook. +4. **CSV Output:** Include a GitHub link to the CSV file containing your zonal statistics results. Although the `data/` folder is typically excluded from version control, make an exception to include this CSV file. + diff --git a/notebooks/assignments/demographic_nightlights_notebook.md b/notebooks/assignments/demographic_nightlights_notebook.md new file mode 100644 index 0000000..391490a --- /dev/null +++ b/notebooks/assignments/demographic_nightlights_notebook.md @@ -0,0 +1,395 @@ +# Demographic and Nightlights Data Analysis - Solutions Notebook + +## Overview +This notebook provides complete solutions for the demographic and nightlights data analysis exercise using Rwanda cell-level population and nighttime lights data. + +--- + +## Part A: Variable Generation and Data Integration + +### 1. Import Libraries and Load Data + +```python +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +import seaborn as sns +from scipy import stats +from sklearn.linear_model import LinearRegression +from sklearn.metrics import r2_score +from sklearn.preprocessing import StandardScaler +import warnings +warnings.filterwarnings('ignore') + +# Set plotting style +plt.style.use('default') +sns.set_palette("husl") + +# Load datasets +pop_df = pd.read_csv('rwacellpop.csv') +ntl_df = pd.read_csv('cellntl201520202024.csv') + +# Display basic info about datasets +print("Population Dataset Shape:", pop_df.shape) +print("Nightlight Dataset Shape:", ntl_df.shape) +print("\nPopulation Dataset Columns:", list(pop_df.columns)) +print("\nNightlight Dataset Columns:", list(ntl_df.columns)) +``` + +### 2. Data Cleaning and Preparation + +```python +# Clean population dataset +print("Missing values in population dataset:") +print(pop_df.isnull().sum()) + +# Handle missing values - replace with median for numerical columns +numeric_cols = ['elderly_60_plus_2020', 'general_2020', 'children_under_five_2020', + 'youth_15_24_2020', 'men_2020', 'women_2020', 'building_count'] + +for col in numeric_cols: + if pop_df[col].isnull().sum() > 0: + pop_df[col].fillna(pop_df[col].median(), inplace=True) + +# Clean nightlight dataset +print("\nMissing values in nightlight dataset:") +print(ntl_df.isnull().sum()) + +# Handle missing nightlight values +ntl_numeric_cols = ['total_nightlight', 'mean_nightlight', 'median_nightlight', + 'max_nightlight', 'min_nightlight', 'std_nightlight'] + +for col in ntl_numeric_cols: + if ntl_df[col].isnull().sum() > 0: + ntl_df[col].fillna(0, inplace=True) # Assume 0 for missing nightlight values +``` + +### 3. Create Population Dataset Variables + +```python +# Create derived variables for population dataset +pop_df['working_age_population'] = (pop_df['general_2020'] - + pop_df['children_under_five_2020'] - + pop_df['elderly_60_plus_2020']) + +# Ensure working age population is not negative +pop_df['working_age_population'] = pop_df['working_age_population'].clip(lower=0) + +# Calculate dependency ratio +pop_df['dependency_ratio'] = ((pop_df['children_under_five_2020'] + pop_df['elderly_60_plus_2020']) / + pop_df['working_age_population'] * 100) + +# Handle infinity values in dependency ratio +pop_df['dependency_ratio'] = pop_df['dependency_ratio'].replace([np.inf, -np.inf], np.nan) +pop_df['dependency_ratio'].fillna(pop_df['dependency_ratio'].median(), inplace=True) + +# Calculate people per building +pop_df['people_per_building'] = pop_df['general_2020'] / pop_df['building_count'] +pop_df['people_per_building'] = pop_df['people_per_building'].replace([np.inf, -np.inf], np.nan) +pop_df['people_per_building'].fillna(pop_df['people_per_building'].median(), inplace=True) + +# Create population density (people per unit area proxy) +pop_df['population_density'] = pop_df['general_2020'] # Using total population as proxy + +# Create Infrastructure Index +# Formula: Combines people per building (higher = more pressure), +# dependency ratio (higher = more pressure), and building density +pop_df['building_density'] = pop_df['building_count'] / (pop_df['general_2020'] + 1) # Avoid division by zero +pop_df['infrastructure_index'] = ( + (pop_df['people_per_building'] * 0.4) + # 40% weight: overcrowding pressure + (pop_df['dependency_ratio'] * 0.3) + # 30% weight: demographic pressure + ((1/pop_df['building_density']) * 0.3) # 30% weight: building scarcity (inverse) +) + +print("Population dataset variables created successfully!") +print(f"Infrastructure Index Range: {pop_df['infrastructure_index'].min():.2f} - {pop_df['infrastructure_index'].max():.2f}") +``` + +### 4. Create Nightlight Dataset Variables + +```python +# Pivot nightlight data to get values by year +ntl_pivot = ntl_df.pivot_table( + index=['cell_id', 'province_name', 'district_name', 'sector_name', 'cell_name'], + columns='year', + values=['total_nightlight', 'mean_nightlight', 'lit_pixel_count', 'pixel_count'], + aggfunc='first' +).reset_index() + +# Flatten column names +ntl_pivot.columns = ['_'.join([str(col[0]), str(col[1])]) if col[1] != '' + else str(col[0]) for col in ntl_pivot.columns] + +# Clean column names +ntl_pivot.columns = [col.replace('_', '') if col.endswith('_') else col for col in ntl_pivot.columns] + +# Calculate nightlight changes (2015-2024) +ntl_pivot['nightlight_change_2015_2024'] = ( + (ntl_pivot['total_nightlight_2024'] - ntl_pivot['total_nightlight_2015']) / + (ntl_pivot['total_nightlight_2015'] + 0.001) * 100 # Add small value to avoid division by zero +) + +ntl_pivot['mean_nightlight_change_2015_2024'] = ( + (ntl_pivot['mean_nightlight_2024'] - ntl_pivot['mean_nightlight_2015']) / + (ntl_pivot['mean_nightlight_2015'] + 0.001) * 100 +) + +# Calculate lit pixel percentage for each year +for year in [2015, 2020, 2024]: + ntl_pivot[f'lit_pixel_percentage_{year}'] = ( + ntl_pivot[f'lit_pixel_count_{year}'] / ntl_pivot[f'pixel_count_{year}'] * 100 + ) + +ntl_pivot['lit_pixel_change_2015_2024'] = ( + ntl_pivot['lit_pixel_percentage_2024'] - ntl_pivot['lit_pixel_percentage_2015'] +) + +print("Nightlight variables created successfully!") +print(f"Nightlight change range: {ntl_pivot['nightlight_change_2015_2024'].min():.2f}% - {ntl_pivot['nightlight_change_2015_2024'].max():.2f}%") +``` + +### 5. Data Integration + +```python +# Merge datasets on cell_id +merged_df = pd.merge(pop_df, ntl_pivot, on='cell_id', how='inner') + +print(f"Merged dataset shape: {merged_df.shape}") +print(f"Successful merges: {len(merged_df)} out of {len(pop_df)} population records") + +# Clean merged dataset +merged_df = merged_df.replace([np.inf, -np.inf], np.nan) +numeric_columns = merged_df.select_dtypes(include=[np.number]).columns +merged_df[numeric_columns] = merged_df[numeric_columns].fillna(merged_df[numeric_columns].median()) + +print("Data integration completed successfully!") +``` + +--- + +## Part B: Exploratory Data Analysis + +### 1. Correlation Analysis + +```python +# Select key variables for correlation analysis +key_vars = [ + 'dependency_ratio', 'people_per_building', 'infrastructure_index', + 'population_density', 'nightlight_change_2015_2024', + 'mean_nightlight_change_2015_2024', 'lit_pixel_change_2015_2024', + 'total_nightlight_2024', 'mean_nightlight_2024', 'lit_pixel_percentage_2024' +] + +# Create correlation matrix +corr_matrix = merged_df[key_vars].corr() + +# Create correlation heatmap +plt.figure(figsize=(12, 10)) +mask = np.triu(np.ones_like(corr_matrix, dtype=bool)) +sns.heatmap(corr_matrix, mask=mask, annot=True, cmap='RdBu_r', center=0, + square=True, linewidths=0.5, cbar_kws={"shrink": .8}) +plt.title('Correlation Heatmap: Key Variables', fontsize=16, pad=20) +plt.tight_layout() +plt.show() + +# Find top 3 correlations (excluding diagonal) +corr_pairs = [] +for i in range(len(corr_matrix.columns)): + for j in range(i+1, len(corr_matrix.columns)): + corr_pairs.append({ + 'var1': corr_matrix.columns[i], + 'var2': corr_matrix.columns[j], + 'correlation': corr_matrix.iloc[i, j] + }) + +corr_pairs_df = pd.DataFrame(corr_pairs) +top_corr = corr_pairs_df.nlargest(3, 'correlation') + +print("TOP 3 HIGHEST CORRELATIONS:") +print("="*50) +for idx, row in top_corr.iterrows(): + print(f"{row['var1']} ↔ {row['var2']}: {row['correlation']:.3f}") +``` + +### 2. Nightlight Trend Analysis + +```python +# District-level aggregation for nightlight analysis +district_ntl = merged_df.groupby('district_name_x').agg({ + 'nightlight_change_2015_2024': 'mean', + 'lit_pixel_change_2015_2024': 'mean', + 'total_nightlight_2015': 'mean', + 'total_nightlight_2024': 'mean', + 'lit_pixel_percentage_2015': 'mean', + 'lit_pixel_percentage_2024': 'mean' +}).reset_index() + +# Top 5 districts with highest nightlight growth +top_5_growth = district_ntl.nlargest(5, 'nightlight_change_2015_2024') +bottom_5_growth = district_ntl.nsmallest(5, 'nightlight_change_2015_2024') + +print("TOP 5 DISTRICTS - HIGHEST NIGHTLIGHT GROWTH (2015-2024):") +print("="*60) +for idx, row in top_5_growth.iterrows(): + print(f"{row['district_name_x']}: {row['nightlight_change_2015_2024']:.1f}% growth") + +print("\nBOTTOM 5 DISTRICTS - LOWEST NIGHTLIGHT GROWTH (2015-2024):") +print("="*60) +for idx, row in bottom_5_growth.iterrows(): + print(f"{row['district_name_x']}: {row['nightlight_change_2015_2024']:.1f}% growth") + +# Visualization of extreme districts +fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6)) + +# Top 5 districts +top_5_growth.plot(x='district_name_x', y='nightlight_change_2015_2024', + kind='bar', ax=ax1, color='green', alpha=0.7) +ax1.set_title('Top 5 Districts: Nightlight Growth', fontsize=14) +ax1.set_ylabel('Nightlight Change (%)') +ax1.tick_params(axis='x', rotation=45) + +# Bottom 5 districts +bottom_5_growth.plot(x='district_name_x', y='nightlight_change_2015_2024', + kind='bar', ax=ax2, color='red', alpha=0.7) +ax2.set_title('Bottom 5 Districts: Nightlight Growth', fontsize=14) +ax2.set_ylabel('Nightlight Change (%)') +ax2.tick_params(axis='x', rotation=45) + +plt.tight_layout() +plt.show() +``` + +--- + +## Part C: Modeling + +### 1. Multivariate Linear Regression + +```python +# Prepare variables for modeling +predictor_vars = [ + 'dependency_ratio', 'people_per_building', 'infrastructure_index', + 'nightlight_change_2015_2024', 'mean_nightlight_change_2015_2024', + 'total_nightlight_2024', 'mean_nightlight_2024', 'lit_pixel_percentage_2024', + 'elderly_60_plus_2020', 'youth_15_24_2020', 'building_count' +] + +target_var = 'population_density' + +# Create modeling dataset +model_df = merged_df[predictor_vars + [target_var]].copy() +model_df = model_df.dropna() + +X = model_df[predictor_vars] +y = model_df[target_var] + +# Standardize features +scaler = StandardScaler() +X_scaled = scaler.fit_transform(X) +X_scaled_df = pd.DataFrame(X_scaled, columns=predictor_vars) + +# Fit full model +full_model = LinearRegression() +full_model.fit(X_scaled, y) + +# Calculate R-squared and coefficients +r2_full = r2_score(y, full_model.predict(X_scaled)) +coefficients = pd.DataFrame({ + 'Variable': predictor_vars, + 'Coefficient': full_model.coef_, + 'Abs_Coefficient': np.abs(full_model.coef_) +}).sort_values('Abs_Coefficient', ascending=False) + +print("FULL MODEL RESULTS:") +print("="*40) +print(f"R-squared: {r2_full:.4f}") +print(f"Number of predictors: {len(predictor_vars)}") + +print("\nTOP 3 MOST PREDICTIVE VARIABLES:") +print("="*40) +top_3_vars = coefficients.head(3) +for idx, row in top_3_vars.iterrows(): + print(f"{row['Variable']}: {row['Coefficient']:.4f}") + +# Test top 3 variables model +top_3_model = LinearRegression() +X_top3 = X_scaled_df[top_3_vars['Variable'].tolist()] +top_3_model.fit(X_top3, y) +r2_top3 = r2_score(y, top_3_model.predict(X_top3)) + +print(f"\nTop 3 Variables Model R-squared: {r2_top3:.4f}") +print(f"Performance retention: {(r2_top3/r2_full)*100:.1f}%") + +# Model validation - residual analysis +predictions_full = full_model.predict(X_scaled) +residuals = y - predictions_full + +# Residual plots +fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6)) + +# Residuals vs Fitted +ax1.scatter(predictions_full, residuals, alpha=0.6) +ax1.axhline(y=0, color='r', linestyle='--') +ax1.set_xlabel('Fitted Values') +ax1.set_ylabel('Residuals') +ax1.set_title('Residuals vs Fitted Values') + +# Q-Q plot +stats.probplot(residuals, dist="norm", plot=ax2) +ax2.set_title('Normal Q-Q Plot of Residuals') + +plt.tight_layout() +plt.show() + +# Statistical significance (simplified) +from scipy.stats import t +n = len(y) +p = len(predictor_vars) +mse = np.mean(residuals**2) +se_coefficients = np.sqrt(mse * np.diagonal(np.linalg.inv(X_scaled.T @ X_scaled))) +t_stats = full_model.coef_ / se_coefficients +p_values = 2 * (1 - t.cdf(np.abs(t_stats), n - p - 1)) + +significance_df = pd.DataFrame({ + 'Variable': predictor_vars, + 'Coefficient': full_model.coef_, + 'P_value': p_values, + 'Significant': p_values < 0.05 +}) + +print("\nSTATISTICAL SIGNIFICANCE (p < 0.05):") +print("="*45) +sig_vars = significance_df[significance_df['Significant']].sort_values('P_value') +for idx, row in sig_vars.iterrows(): + print(f"{row['Variable']}: p = {row['P_value']:.4f} ✓") +``` + +--- + +## Summary of Key Findings + +### Infrastructure Index Methodology +The infrastructure index combines three components: +- **People per building (40%)**: Measures overcrowding pressure +- **Dependency ratio (30%)**: Captures demographic pressure on services +- **Building scarcity (30%)**: Inverse of building density relative to population + +### Model Performance Summary +- **Full model R-squared**: [To be calculated from data] +- **Top 3 predictive variables**: [To be determined from analysis] +- **Model assumptions**: Validated through residual analysis + +### District Rankings +- **Highest growth districts**: [To be determined from data] +- **Development patterns**: Analysis of intensification vs. spatial expansion +- **Policy implications**: Infrastructure needs in high-growth areas + +--- + +## Code Quality and Documentation Notes + +1. **Data Cleaning**: Comprehensive handling of missing values and outliers +2. **Variable Engineering**: Well-documented formulas and justifications +3. **Statistical Rigor**: Proper validation of model assumptions +4. **Visualization**: Publication-quality plots with appropriate formatting +5. **Reproducibility**: Clear code structure with detailed comments \ No newline at end of file diff --git a/notebooks/assignments/updated_infrastructure_assignment.md b/notebooks/assignments/updated_infrastructure_assignment.md new file mode 100644 index 0000000..adf4fbd --- /dev/null +++ b/notebooks/assignments/updated_infrastructure_assignment.md @@ -0,0 +1,73 @@ +# Question 1: Infrastructure and Development Analysis (40 points) + +## Part A: Feature Engineering and Data Integration (12 points) + +### Population Dataset Variables (`rwacellpop.csv`): +Create the following derived variables: +- **`dependency_ratio`** - `(children_under_five_2020 + elderly_60_plus_2020) / working_age_population * 100` +- **`people_per_building`** - `general_2020 / building_count` +- **`working_age_population`** - `general_2020 - children_under_five_2020 - elderly_60_plus_2020` +- **`infrastructure_index`** - Your own formula that incorporates `people_per_building` and other relevant variables to measure infrastructure adequacy + +### Nightlight Dataset Variables (`cellntl201520202024.csv`): +Create the following temporal and development indicators: +- **`nightlight_change_2015_2024`** - Percentage change in total nightlight from 2015 to 2024 +- **`mean_nightlight_change_2015_2024`** - Percentage change in mean nightlight from 2015 to 2024 +- **`lit_pixel_percentage`** - Use existing or calculate: `(lit_pixel_count / pixel_count) * 100` + +### Data Integration: +Merge the datasets using `cell_id` and aggregate to **district level** for analysis. Handle missing data appropriately and document your approach. + +Document and justify your `infrastructure_index` methodology, explaining how `people_per_building` and other variables contribute to measuring infrastructure pressure. + +## Part B: Exploratory Data Analysis (15 points) + +### Correlation Analysis: +1. **Correlation Heatmap**: Create a heatmap showing correlations between 10 key variables (mix of demographic, infrastructure, and nightlight variables). +2. **Report the top 3 variable pairs** with the highest correlations and interpret their relationships. +3. **Identify unexpected correlations** and discuss potential explanations. + +### Nightlight Trend Analysis: +1. **District Ranking**: Report the **top 5 districts** with the highest nightlight growth (2015-2024) and **bottom 5 districts** with the most decline or lowest growth. +2. **Lit Pixel Analysis**: Compare these districts using `lit_pixel_percentage` changes to understand whether growth represents intensification or spatial expansion. +3. **Create visualizations** showing nightlight trends for these extreme districts. + +## Part C: Predictive Modeling and Strategic Analysis (13 points) + +### Multivariate Linear Regression: +1. **Model Development**: Build a multivariate linear regression model predicting **population density** using both demographic and nightlight variables as predictors. +2. **Variable Selection**: Test different combinations of variables and report the **top 3 most predictive variables** of population density. +3. **Model Evaluation**: Report R-squared, coefficients, and statistical significance. Interpret what these results tell us about population-infrastructure relationships. + +### Strategic Development Framework: +Based on your regression results and EDA findings: +- **High-Priority Districts**: Identify districts that are **under-predicted** by your model (high actual population but low predicted population) - these may represent infrastructure gaps. +- **Development Recommendations**: Which districts should receive immediate infrastructure investment based on your analysis? +- **Evidence-Based Justification**: Use statistical evidence from your regression model and correlation analysis to support your recommendations. + +--- + +## Technical Requirements + +### Statistical Analysis: +- Properly handle missing data and outliers +- Use appropriate statistical tests and report p-values +- Calculate and interpret correlation coefficients +- Validate regression assumptions (normality, homoscedasticity) + +### Data Management: +- Document all data cleaning and aggregation steps +- Handle temporal alignment between population (2020) and nightlight data +- Ensure consistent district naming across datasets + +### Visualization Standards: +- Create clear, publication-quality heatmaps with appropriate color scales +- Design effective time series plots for nightlight trends +- Include proper axis labels, titles, and legends +- Use consistent formatting across all visualizations + +### Reporting Requirements: +- Clearly state the top 3 most predictive variables with statistical justification +- Provide ranked lists for nightlight growth districts with supporting metrics +- Include model performance statistics and interpretation +- Document all methodological choices and assumptions \ No newline at end of file diff --git a/notebooks/module-1/01-intro-to-jupyter-notebook.ipynb b/notebooks/module-1/01-intro-to-jupyter-notebook.ipynb index c88d1ad..2b84ed5 100644 --- a/notebooks/module-1/01-intro-to-jupyter-notebook.ipynb +++ b/notebooks/module-1/01-intro-to-jupyter-notebook.ipynb @@ -101,18 +101,11 @@ "print('Dunstan')\n", "```" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "base", "language": "python", "name": "python3" }, @@ -126,7 +119,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.5" + "version": "3.13.5" }, "toc": { "base_numbering": 1, diff --git a/notebooks/module-1/02-python-fundamentales.ipynb b/notebooks/module-1/02-python-fundamentales.ipynb new file mode 100644 index 0000000..868c9b0 --- /dev/null +++ b/notebooks/module-1/02-python-fundamentales.ipynb @@ -0,0 +1,2140 @@ +{ + "cells": [ + { + "attachments": { + "image.png": { + "image/png": "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Y29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4yNTg8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MjQxODwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlVzZXJDb21tZW50PlNjcmVlbnNob3Q8L2V4aWY6VXNlckNvbW1lbnQ+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgqeX2GdAAAAHGlET1QAAAACAAAAAAAAAIEAAAAoAAAAgQAAAIEAAYTcKseTFwAAQABJREFUeAHsvQmAZVdd7vuvU2eoee6unsd0Z+ik091JSEISSELCaCKJ4MCTMMhFcbjXCwiiT0QEUbjCU/Gp4EVREBlEueADIoKgCUk6c7rT81zd1TWPZ57e961du+pUdVV1Dafmb3Xv2sPZe+21f2ufvfdZ69vfvySPZEoiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAILRqBEQq4FY68di4AIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAjICGXTgQREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAERWGACEnItcAVo9yIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgIZfOAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQARFYYAISci1wBWj3IiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiAhl84BERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABEVhgAhJyLXAFaPciIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiICGXzgEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAERWGACEnItcAVo9yIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgIZfOAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQARFYYAISci1wBWj3IiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiAhl84BERABERABERABERABERCBFUIgb9l80nK5hGWzCcvlUxgyOPY8hpJhBiUl3nQ+n8fnaSzPuc+DgQoLltZYqLTaSkpKh9fXhAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAgUg4CEXMWgqDxEQAREQAREQAREQAREQAQWPQEKtzIQcOUp5sKQzXE8IuQqgZgrj38UclHExZTPZ/GXQq4ARFwVEHHVYqiRkItwlERABERABERABERABERABERABERABERABERABERABERABIpKQEKuouJUZiIgAiIgAiIgAiIgAiIgAnNLAFKrfM4JrOCX5aatxFtGwRU/8xy2uIxiLI6zzlkrD3ctirmyOTpxcUjjs8zQNnThgpQLI27nu3LReasEIq5ASdhCwRoLB+sh6KrFfHBuD1O5i4AIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIrDgCEnKtuCrXAYuACIiACIiACIiACIjAUiaA8IgMjZiLuxCJTpAFYRbFWXmjUCuD5RxTpOUNznULy7NOtJXFehjcNNaFyMt34KIjlxN+YQ2mQEnISgPlEG5VOReucKjRykKrIOZqwDYht47+iIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiECxCEjIVSySykcEREAEREAEREAEREAERGDOCeQg2Epn+xEisQ/jAYyjluUAYVeG4i4XMjHhRF5cls1S8AVBF8RbzqkLGq1hJy8Ktpyb14gDF/y7LJ9DuEVYc5WWlFsk3ADh1iorDzdbJLTGKiLr3HwgEJ7zY9UOREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEVhYBCblWVn3raEVABERABERABERABERgyRHwwyXSdSubG7R0pseSmW5PzJWhqGvQCboyuSjGMaxDIVfMLaOYKw9xVyAQcCETcznPbWsiCIFAiQVDAcZXtEw6CCFXs1VGNll5ZIMbKsIbsGwNnLoiE2Wh5SIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIwIwIScs0ImzYSAREQAREQAREQAREQAREoJgGKtSCdGnbPoouWwUWLDlwMk8gxBVoZCLkycOJKZ/ow7TtyQbSVgYiLjlyWhKNW0lsXoq6yilILhwMIk1iCfODFlUO2GOO/S3l/gnN04RoScnH5QF8aYRVXWVXZZjhybYSQa6NVYroMzlwBCbk8gPorAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiJQNAISchUNpTISAREQAREQAREQAREQARGYKYF8PoNQiVEIrfwwiXTUorsWXba88ImeiIuhEuG4lafrFsVdnmgrh+3zvugLwi/mVxLIQsRVaqWlJdRoOfEWBVq+dssfF5aZ69KRyxNypSwM0RYduSo4lG20Cgi6ysJrJeQqhKZpERABERABERABERABERABERABERABERABERABERABERCBohCQkKsoGJWJCIiACIiACIiACIiACIjAzAnkIeKC01am11LZXs9tK9tvKbhucchkeyyV7nVOXDkIt+je5Qmz4OLlnLyczRZ2D5EWPLnysN3ilGGaoRJLuPJQ8pZjZoIIiwEIuUJBCLmwSipR4kIrUrxFEVc5wipyHIG4S6EVfaIai4AIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIFIuAhFzFIql8REAEREAEREAEREAEREAELkPAU0/54qt8PgshVmYoDCKFWz0QdFG0hQGiLoZP5JDCsnS62wLBlIWcW5ZB9EURF3aHwXfW8sMkur0MLfQ/u0zBhj+m8IuOXMw0kw46IRcducojG9xQATFXJCwh1zAwTYiACIiACIiACCwrAv7zFA/Kny4UxRdOL6sD18GIgAiIgAiIgAiIgAiIgAiIgAiIwCIhICHXIqkIFUMEREAEREAEREAEREAEljsBCrcyOYZG9AaGTsy40Ilw48oOuCGFcTaD6TxCKmaiEHZhHkMuH7OKqpAF4ZiVy0FkBSEXjLdcByPFWuxodKKtIWGXNz/kv+WUXVOjKyHX1DhpLREQAREQARFYCALjCYsWohzLfZ/ZLJ7ZMhk8a9EF1XM3LS0thdNpwA3L/fh1fCIgAiIgAiIgAiIgAiIgAiIgAiKwkAQk5FpI+tq3CIiACIiACIiACIiACCwbAlRLjYQwHO+wsrkEHLZ6LZnudM5byVSn57YF161sNgpnriQEW96QzaURIpHTaXQiJpF1xkJhdh6WOMEWxVx5DtzRkHjLTTo114iDxNDseMUZd5mEXONi0UIREAEREAERWBQEJOSan2pIJJKWSCTwfJZ14awp4AqFQhYOh914fkqhvYiACIiACIiACIiACIiACIiACIjAyiQgIdfKrHcdtQiIgAiIgAiIgAiIgAjMK4FcLuPEW4lUmyVSFyHmarN4qtWSmGfoRIq1vFCLFGfB/QF/PSMtjJ0ai44Qo4vsi7hGL53dnIRcs+OnrUVABERABERgLglIyDWXdM05cCWTSRscjFosFkNo67Rz4AoGS52Aq7y83CoqKpyga25LotxFQAREQAREQAREQAREQAREQAREYOUSkJBr5da9jlwEREAEREAEREAEREAE5oRADiEU83TSymcw9gY6bqWycOOikAsirmSqfUjQ1QEnrgELl5U6P6/csKMWXLXguIX/nvMWlk/XXWsmBych10yoaRsREAEREIGVTIDh9zhks96Y0/k8B9zHeSOnOBujXC7r1uNyX5A1vpvnyOcM5xcKha2srAzioZAL87eSWRfr2MmfblsUanFgGEWOKeKiG1csFrV4HE6qQ0Iu1gPduCKRiFVWVhgFXb47Fz8rLQ1iCGDA89xY5X2xCq18REAEREAEREAEREAEREAEREAERGCFEJCQa4VUtA5TBERABERABERABERABOaLQAairUy2Hw5cAxhzGPTmEUIxidCKGQxpTKcyPRj3I2RizoKhgCse+n5d8kRc6MjFPMVdLoyis+Ca26OQkGtu+Sp3ERABERCB5UeAIiCG4fOGJMQ/KUulUk4E5Iu7stkMlqXdOvycy5nGE/34IiN+TgHXqlWrbN26ddbU1OjcobhcaXYEKLbr7++33t4+GxgYsGh0EEPMuXDF43FXf6wvT5BnTqQVDAadmC4cjkDIVQZnrkqrrq62urpaq6qqck5drC+KuZREQAREQAREQAREQAREQAREQAREQARmTkBCrpmz05YiIAIiIAIiIAIiIAIiIAKXEMjDaQtuW2mE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34nL38NcuHExb4VW9AnPbjwwMAgR12F77rnnIOg65YR6DJvJsIpkTAdVCrmKlZgnXbl4XpSVldmOHVfYzp07rbl5NZy6wnbjjTcUa1fKRwREQAREQAREQAREQAREQAREQASWNQEJuZZ19ergREAEREAEREAEREAERGD6BOjGlUx32kD8KIbDFkucsWSmCwKuActBwBUIeLETvXA8089/MW8hIddirh2VTQREQAREoJgEeB/PZDJOrMVwiqdPn7YXXjgIMddR6+zsdLvK5XjPn9+YyRJyFaeWKcR7/vkX7Mknn3JhMvv6+i2bzYzKvJhiPNYbB55XlZWVtmXLZgxbrKmp0YLBkN19912j9q0ZERABERABERABERABERABERABERCB8QlIyDU+Fy0VAREQAREQAREQAREQgRVHIJ9PWyYXR6dun8XTbTYYP27RxHGLJc+7Zbl8Ao4K6KRDeKVclp2/eXTWsXN3JNTSUocmIddSr0GVXwREQAREYKoE0um0c+JiuD2GUGT4vWPHjtmpU6edwIth8+jW5Yt9/PFU85/pehJyzZTc6O36+vrsmWeetccff9w5rSUSCbcChVZzkVhvPGd4nlRUVCCk4kbbvHmTNTQ0QMgVtNe85tVzsVvlKQIiIAIiIAIiIAIiIAIiIAIiIALLjoCEXMuuSnVAIiACIiACIiACIiACIjAzAunsAMIpXoBw6xzCKbZi+rzFkxctDTeuLARegVKGO4JsC510FHBlMzl01nnz89W5O7Mjm/pWEnJNnZXWFAEREAERWNoEKOxpbW2FE9cZO3funJtubb0IN64u3Ou9Y/PcN/PDYq75OGIJuYpDmS5rTz31lD366I/tyJGjw25ZFOfNRSopoSPXiJBrw4YNEHNtsPr6eifkuu++n5iL3SpPERABERABERABERABERABERABEVh2BCTkWnZVqgMSAREQAREQAREQAREQgZkRiEO4NRA7bP0IpxhPtloq0w0njqgTcZllPJcFZO38t6DgoohruSUJuZZbjep4REAEREAEJiLA0HvHjh23gwcP2smTJ62rqwsOXVFLpVJDQm0EVXT3+/m94UvINVGNTW95b2+fPfHEE0NCriMWDodd2EOG05yLRKE/647nTHl5uflCLjpylZaW2v333zcXu1WeIiACIiACIiACIiACIiACIiACIrDsCEjIteyq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O3jwoB09egwhFTttAB3iiUSiaEIuCnd4v6M4iC5NDLO3YcP6ofEGW79+PYRdDePeawvLqun5J+CL+Fh3HCj8o5ArGo1aLOa5c40IuUqdeIshFemsRuGWn3wh4HjPU/46GouACCx+AnTY+uA991oMjo3+95ru/1uv32Pv+7vPX3IAX/zoRyHk+sqwG5e/Qhh9Gh95+LtWDxFvYerDPej9d9/tXLj85fx5VhqO2N1vepO98T3v9hcPj4888YT93e992AYRwjGGa9Rbf//37db77x/XIWx4I02IgAiIgAiIgAiIgAiIwBInsKyEXNFExg61xuzplrg915GBCxfeCESHT5AWPt7/JVddDKHowioePY3Qiucsi1BqrlEExzOfiZ1P/PGWRgcgHc12bKixl+1d50Q0V21rtIrykcab+SzXQu9LQq6FqYFEMoMO21K75yUb7c2vu8qu3Tn67a7CUi03IReduP7r6XP25e8etmeOdVsSISdDcClRY+lIrfN6Rfe2SKgEgr8m++l7d9pL92ycsjOXhFwjLCXkGmGhKRFY7AQYUjGF8InJdCvcuFogam2xaPykxVJnEQYjBdFTiXOxYrg/3jP8RvnFdFxswB97P/PKic5hCw2FJCzDuALPoxA9hRB2kEIuOFaFKX7COBJqxH2x4bIOVlM97gyczAYh5OoZfA48T0xLyOUfD4/Jm+bxYcBvEwrTOM17FkMz8qUJ7xjRKUo3rlADhkYn4goH4TQWqodorRrbMUQkQ0MiJCTDQRa4h031mLSeCIiACIjAyiLgCblO2AsvUMh1FGEVO+DGFYVYJ+GEOz6N2TwbBOA0yXsbBT8Mtbdt21YM25yYi05cTXBYKS8v93c1POY+x977hz/UxIIRoKCLIq5EgkKuNM6TEUcuOnBRrDeb8JgLdmDasQiIgEX7+q2ydvwXs3lNPvX88/aJhx4aJczidboa1/YH/+ev222vf/0oil/740/av/3t3+JFF+9FFf/DiYRc//XPX7e//+CHRq3P/Bsh+H3HH37Mtu/Z42fhxkf3P2mf/93fte7zLUPir7xVInzrg7/923bbT75ezlyjaGlGBERABERABERABERgORFYFkKuPByj+uJpe+z0oP37sZidjyLkCp2s8gjBAuMq6riWYnIuQyh7vLvXOl88af0tba7jZzL3obk+ToayycJ1gB1PNRVh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" + } + }, + "cell_type": "markdown", + "id": "e44f3705", + "metadata": {}, + "source": [ + "# DATA SCIENCE CAPACITY BUILDING INITIATIVE\n", + "![image.png](attachment:image.png)" + ] + }, + { + "cell_type": "markdown", + "id": "40e9b128-4271-46c7-b7cb-f92cebff2fae", + "metadata": { + "panel-layout": { + "height": 345.5848388671875, + "visible": true, + "width": 100 + } + }, + "source": [ + "# Python Basics\n", + "\n", + "**What do we learn here?**\n", + "- [Arithmetic Operators](#Arithmetic-Operators)\n", + "- [Logical Operators](#Logical-Operators)\n", + "- [Variables & Data Types](#Varibles-&-Data-Types)\n", + "- [Control Flow](#Control-Flow)\n", + "- [Loops](#Loops)\n", + "- [Writing Functions in Python](#Writing-Functions-in-Python)\n", + "- [Object-Oriented Programming](#Object-Oriented-Programming)\n", + "- [NumPy Package](#NumPy-Package)\n", + "- [Introduction to Pandas Package](#Introduction-to-Pandas-Package)\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "82d33217-d012-4e3a-b997-4b8c058c820e", + "metadata": {}, + "source": [ + "## Arithmetic Operators\n", + "Arithmetic operators are used to perform common mathematical operations in Python. These operators work with numeric data types such as integers and floats.\n", + "\n", + "### Basic Arithmetic Operators\n", + "\n", + "| Operator | Description | Example | Result |\n", + "|----------|---------------------|----------------|--------|\n", + "| `+` | Addition | `5 + 3` | `8` |\n", + "| `-` | Subtraction | `10 - 4` | `6` |\n", + "| `*` | Multiplication | `6 * 7` | `42` |\n", + "| `/` | Division | `8 / 2` | `4.0` |\n", + "| `//` | Floor Division | `7 // 2` | `3` |\n", + "| `%` | Modulus (Remainder) | `7 % 3` | `1` |\n", + "| `**` | Exponentiation | `2 ** 3` | `8` |\n", + "\n", + "### Try it yourself!\n", + "\n", + "```python\n", + "a = 10\n", + "b = 3\n", + "\n", + "print(\"Addition:\", a + b) # 13\n", + "print(\"Subtraction:\", a - b) # 7\n", + "print(\"Multiplication:\", a * b) # 30\n", + "print(\"Division:\", a / b) # 3.333...\n", + "print(\"Floor Division:\", a // b) # 3\n", + "print(\"Modulus:\", a % b) # 1\n", + "print(\"Exponentiation:\", a ** b) # 1000\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "9f9e664b-3c5e-4427-8804-230f5743a5f7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Addition: 13\n", + "Subtraction: 7\n", + "Multiplication: 30\n", + "Division: 3.3333333333333335\n", + "Floor Division: 3\n", + "Modulus: 1\n", + "Exponentiation: 1000\n" + ] + } + ], + "source": [ + "a = 10\n", + "b = 3\n", + "\n", + "print(\"Addition:\", a + b) # 13\n", + "print(\"Subtraction:\", a - b) # 7\n", + "print(\"Multiplication:\", a * b) # 30\n", + "print(\"Division:\", a / b) # 3.333...\n", + "print(\"Floor Division:\", a // b) # 3\n", + "print(\"Modulus:\", a % b) # 1\n", + "print(\"Exponentiation:\", a ** b) # 1000" + ] + }, + { + "cell_type": "markdown", + "id": "0668ef43-77b0-4233-ad3f-f38c788012c0", + "metadata": {}, + "source": [ + "## Logical Operators\n", + "Logical operators are used to combine multiple conditions (Boolean expressions) and return `True` or `False` depending on the logic applied.\n", + "\n", + "### Basic Logical Operators\n", + "\n", + "| Operator | Description | Example | Result |\n", + "|----------|------------------------------|--------------------------|-------------|\n", + "| `and` | Logical AND (both true) | `True and False` | `False` |\n", + "| `or` | Logical OR (at least one) | `True or False` | `True` |\n", + "| `not` | Logical NOT (negation) | `not True` | `False` |\n", + "\n", + "---\n", + "\n", + "### Truth Table\n", + "\n", + "### `and` Operator\n", + "| A | B | A and B |\n", + "|-------|-------|----------|\n", + "| True | True | True |\n", + "| True | False | False |\n", + "| False | True | False |\n", + "| False | False | False |\n", + "\n", + "### `or` Operator\n", + "| A | B | A or B |\n", + "|-------|-------|---------|\n", + "| True | True | True |\n", + "| True | False | True |\n", + "| False | True | True |\n", + "| False | False | False |\n", + "\n", + "### `not` Operator\n", + "| A | not A |\n", + "|-------|-------|\n", + "| True | False |\n", + "| False | True |\n", + "\n", + "---\n", + "\n", + "## Try it yourself\n", + "\n", + "```python\n", + "a = True\n", + "b = False\n", + "\n", + "print(\"a and b:\", a and b) # False\n", + "print(\"a or b:\", a or b) # True\n", + "print(\"not a:\", not a) # False\n", + "\n", + "# Example with comparisons\n", + "x = 5\n", + "print(x > 0 and x < 10) # True\n", + "print(x < 0 or x > 3) # True\n", + "print(not (x == 5)) # False\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "62de541a-cc96-43ce-9c22-1f9b42977b3e", + "metadata": {}, + "outputs": [], + "source": [ + "## YOUR CODE" + ] + }, + { + "cell_type": "markdown", + "id": "265e6d5b-b3be-4835-8e61-f7707b682b80", + "metadata": {}, + "source": [ + "## Varibles & Data Types\n", + "\n", + "In Python, **variables** are used to store data values. You do not need to declare the data type explicitly. Python automatically assigns it based on the value.\n", + "\n", + "### Common Data Types\n", + "\n", + "| Type | Description | Example |\n", + "|--------|--------------------------------------|------------------------------------------|\n", + "| **`int`** | Integer numbers | `x = 5` |\n", + "| **`float`**| Floating-point numbers (decimals) | `pi = 3.14` |\n", + "| **`str`** | Text (string) | `name = \"Bob\"` |\n", + "| **`bool`** | Boolean values (`True` or `False`) | `is_happy = True` |\n", + "| **`list`** | Ordered, mutable sequence | `fruits = [\"apple\", \"banana\"]` |\n", + "| **`tuple`**| Ordered, immutable sequence | `coords = (10, 20)` |\n", + "| **`dict`** | Key-value pairs (dictionary) | `student = {\"name\": \"Alice\", \"age\": 20}` |\n", + "| **`set`** | Unordered collection of unique items | `nums = {1, 2, 3}` |\n", + "\n", + "### Declaring Variables\n", + "\n", + "```python\n", + "x = 10 # integer\n", + "name = \"Alice\" # string\n", + "pi = 3.14 # float\n", + "is_valid = True # boolean\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "810a00f7-4c3b-40e2-bc71-db4a4f785179", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "36a1070e", + "metadata": {}, + "source": [ + "# Control Flow\n", + "Control using if, elif and else in programming allow your program to make decision and react to different situations.\n", + "\n", + "```python\n", + "if CONDITION1:\n", + " if CONDITION1a: # nested if\n", + " do_something\n", + " else:\n", + " do_something_else\n", + "elif CONDITION2:\n", + " do_other_thing\n", + "else:\n", + " do_default_action\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "ba46a9fd", + "metadata": {}, + "source": [ + "**Example**: given x, say x = 11, check if it is a multiple of 2 and print `'11 is a multiple of 2'` else print `'x is not a multiple of 2'`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cb86e61e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11 is not a multiple of 2.\n" + ] + } + ], + "source": [ + "x = 11\n", + "if x % 2 == 0:\n", + " print(x, 'is a multiple of 2.')\n", + "else:\n", + " print(x, 'is not a multiple of 2.')" + ] + }, + { + "cell_type": "markdown", + "id": "64166ac2", + "metadata": {}, + "source": [ + "**Example 2**: solve the quadratic equation $ax^2 + bx + c = 0.$" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "dc92e0f3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "We have two complex (conjugate) solutions.\n" + ] + } + ], + "source": [ + "a, b, c = (1, 2, 2)\n", + "delta = b ** 2 - 4 * a * c\n", + "\n", + "if delta > 0:\n", + " print('We have two distinct real solutions.')\n", + "elif delta < 0:\n", + " print('We have two complex (conjugate) solutions.')\n", + "else:\n", + " print('We have a double real solution.')" + ] + }, + { + "cell_type": "markdown", + "id": "749ad4cc", + "metadata": {}, + "source": [ + "This can be written in two condition only with a nested loop when `delta >= 0`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1310dfcf", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: Write the code above using if with nested if and else." + ] + }, + { + "cell_type": "markdown", + "id": "96ce135d-5ff2-40ce-86f1-82dcd92493fa", + "metadata": {}, + "source": [ + "# Loops\n", + "\n", + "Loops are used to execute a block of code repeatedly. Python supports two main types of loops: `for` loops and `while` loops.\n", + "\n", + "---\n", + "\n", + "### 1. `for` Loop\n", + "\n", + "A `for` loop is used to iterate over a sequence such as a list, tuple, string, or range.\n", + "\n", + "#### Syntax\n", + "\n", + "A variable takes each value in the sequence one at a time, and the loop executes once for each value.\n", + "```python\n", + "for variable in sequence: \n", + " # code block\n", + "```\n", + "---\n", + "\n", + "### 2. `while` Loop\n", + "\n", + "A `while` loop continues to execute as long as a specified condition is `True`.\n", + "\n", + "#### Syntax\n", + "The condition is evaluated before each iteration. If the condition becomes `False`, the loop stops.\n", + "\n", + "---\n", + "\n", + "## Loop Control Statements\n", + "\n", + "Python includes special statements that change the normal flow of loops:\n", + "\n", + "| Statement | Description |\n", + "|-----------|-----------------------------------------|\n", + "| `break` | Exits the loop immediately |\n", + "| `continue`| Skips the current iteration |\n", + "| `pass` | Does nothing; used as a placeholder |\n", + "\n", + "---\n", + "\n", + "## `else` with Loops\n", + "\n", + "Both `for` and `while` loops can have an optional `else` block.\n", + "\n", + "- The `else` block runs **only if the loop completes without a `break`**.\n", + "- If the loop ends due to a `break` statement, the `else` block is skipped.\n", + "\n", + "---\n", + "\n", + "## List Comprehension\n", + "\n", + "List comprehension provides a concise way to create lists using a single line of code. It is more readable and often faster than traditional loops.\n", + "\n", + "### Syntax\n", + "It combines `for` loops and optional conditional logic into a single expression.\n", + "\n", + "- Can include an `if` condition to filter elements.\n", + "- Can be nested or used with functions for transformations.\n", + "\n", + "List comprehensions are ideal when:\n", + "- You want to create a new list from an existing iterable.\n", + "- The transformation logic is simple and readable in one line.\n", + "\n", + "```python\n", + "[x for x in range(3) if x == 3]\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "edaca66b-b1de-459b-91ee-e7eab4f1c398", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 2, 4]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[x for x in range(5) if x % 2 == 0] # returns a list of even numbers between 0 and 4." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cc39d7c0-8da5-4f21-82b1-8c413f431c78", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 2, 4]\n" + ] + } + ], + "source": [ + "L = [] # this is how we define a list in Python. You can go to ...\n", + "for i in range(5):\n", + " if i % 2 == 0:\n", + " L.append(i)\n", + " else:\n", + " continue\n", + "\n", + "# another line code to print L. Pff! what a boring life\n", + "print(L)" + ] + }, + { + "cell_type": "markdown", + "id": "6f8d79ee-719d-4996-8a49-fbf9fab60706", + "metadata": {}, + "source": [ + "The following code block is optional.\n", + "```python\n", + "else:\n", + " continue\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "1f4f242a-0593-40ab-97d5-e7ef663ce8a9", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: Use a for loop to save all odd number between 0 and 10 in a list." + ] + }, + { + "cell_type": "markdown", + "id": "d7a57a6f-3b1b-419f-8cda-7950b3d737c5", + "metadata": {}, + "source": [ + "## Writing Functions in Python\n", + "\n", + "Functions are reusable blocks of code that perform a specific task. They help organize code, avoid repetition, and improve readability.\n", + "\n", + "### Defining a Function\n", + "\n", + "In Python, functions are defined using the `def` keyword, followed by the function name, parentheses with optional parameters, and a colon. The code block inside the function is indented.\n", + "\n", + "#### Example:\n", + "```python\n", + "def greet():\n", + " print(\"Hello, world!\")\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "42c26286-82b5-4847-a782-18b852025b46", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello, world!\n" + ] + } + ], + "source": [ + "def greet():\n", + " print(\"Hello, world!\")\n", + "\n", + "greet()" + ] + }, + { + "cell_type": "markdown", + "id": "793088f1-19d0-46cd-9843-110bc7828d35", + "metadata": {}, + "source": [ + "#### Parameters and Arguments\n", + "- Parameters are variables listed in the function definition.\n", + "- Arguments are values passed into the function when it is called." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "908a9e74-507c-4d62-8211-ae15c0563197", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello, Guest\n", + "Hello, Alice\n" + ] + } + ], + "source": [ + "def greet(name=\"Guest\"):\n", + " print(\"Hello,\", name)\n", + "\n", + "greet() # Uses default\n", + "greet(\"Alice\") # Overrides default" + ] + }, + { + "cell_type": "markdown", + "id": "befae3f1-8f9d-47a3-89bb-aab9655af8a7", + "metadata": {}, + "source": [ + "### Return Statement\n", + "Functions can return values using the return statement." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "64c7d48b-349e-4641-946a-c6f545fb48c4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n" + ] + } + ], + "source": [ + "def add(a, b):\n", + " return a + b\n", + "\n", + "result = add(5, 3)\n", + "print(result)" + ] + }, + { + "cell_type": "markdown", + "id": "bb9046ac-fcd0-479c-91fb-891b416e5799", + "metadata": {}, + "source": [ + "### Variable-Length Arguments\n", + "Use `*args` for any number of positional arguments, and `**kwargs` for keyword arguments." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "6b12c041-1f80-4bc8-b2c1-5c3f1d604992", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "3\n", + "4\n" + ] + } + ], + "source": [ + "def print_numbers(*args):\n", + " for number in args:\n", + " print(number)\n", + "\n", + "print_numbers(1, 2, 3, 4)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a56adcfc-822f-4cf3-9b89-6ff7ae645e4e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name : Alice\n", + "age : 25\n" + ] + } + ], + "source": [ + "def print_info(**kwargs):\n", + " for key, value in kwargs.items():\n", + " print(key, \":\", value)\n", + "\n", + "print_info(name=\"Alice\", age=25)" + ] + }, + { + "cell_type": "markdown", + "id": "e6ae2d08-2d98-4568-9b09-25e4587d6f7e", + "metadata": {}, + "source": [ + "### Scope of Variables\n", + "- Local variables exist only within a function.\n", + "- Global variables are accessible throughout the program." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "c22fa508-6fbd-4abb-9e98-26b2e39f3314", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Inside function: 5\n", + "Outside function: 10\n" + ] + } + ], + "source": [ + "x = 10 # global\n", + "\n", + "def show():\n", + " x = 5 # local\n", + " print(\"Inside function:\", x)\n", + "\n", + "show()\n", + "print(\"Outside function:\", x)" + ] + }, + { + "cell_type": "markdown", + "id": "5f13b443-268b-40a8-9c97-885e477ce4ff", + "metadata": {}, + "source": [ + "If `x` is defined outside all functions (i.e., at the `global` level), and you want to update it from inside a function, use the global keyword:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "f0b82bb0-0da2-465f-9494-f75ab1d201bf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "10" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = 10 # in the global environment\n", + "\n", + "def use_global():\n", + " \n", + " global x\n", + " return x\n", + "\n", + "use_global()" + ] + }, + { + "cell_type": "markdown", + "id": "182e79d3-cf15-4c90-a4c0-7bb5e165a649", + "metadata": {}, + "source": [ + "If `x` is defined in an outer function (`not global`), and you want to update it in an inner (nested) function, use the `nonlocal` keyword." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "45be4fc0-3a60-4063-b2c4-3fd5e9c6675c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20\n" + ] + } + ], + "source": [ + "def outer():\n", + " x = 10 # enclosing scope\n", + "\n", + " def inner():\n", + " nonlocal x\n", + " x = 20\n", + "\n", + " inner()\n", + " print(x)\n", + "\n", + "outer()" + ] + }, + { + "cell_type": "markdown", + "id": "59319da0-a50e-4d02-85dc-7946ffb82e6a", + "metadata": {}, + "source": [ + "# Object-Oriented Programming\n", + "\n", + "Object-Oriented Programming (OOP) is a programming paradigm based on the concept of **objects**, which can contain data (**attributes**) and code (**methods**). Python supports OOP and makes it easy to create and use classes and objects.\n", + "\n", + "---\n", + "\n", + "## Key Concepts\n", + "\n", + "| Concept | Description |\n", + "|--------------|-----------------------------------------------------------------------------|\n", + "| Class | A blueprint for creating objects |\n", + "| Object | An instance of a class |\n", + "| Attribute | A variable that belongs to a class or object |\n", + "| Method | A function that belongs to a class |\n", + "| `__init__` | The constructor method called when an object is created |\n", + "| `self` | A reference to the current instance of the class |\n", + "| Inheritance | A way to create a new class using properties and methods of an existing one |\n", + "| Encapsulation| Bundling of data and methods that operate on that data |\n", + "| Polymorphism | Ability to redefine methods for different types of objects |\n", + "\n", + "---\n", + "\n", + "## Defining a Class\n", + "\n", + "A class is defined using the `class` keyword. The `__init__()` method is the constructor, used to initialize attributes when an object is created.\n", + "\n", + "### Example:\n", + "```python\n", + "class Person:\n", + " def __init__(self, name, age):\n", + " self.name = name\n", + " self.age = age\n", + "\n", + " def greet(self):\n", + " print(f\"Hello, my name is {self.name}\")\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "f74eda6b-3a3a-465d-b764-1d6ad26275b7", + "metadata": {}, + "outputs": [], + "source": [ + "class Person:\n", + " def __init__(self, name, age):\n", + " self.name = name\n", + " self.age = age\n", + "\n", + " def greet(self):\n", + " print(f\"Hello, my name is {self.name}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "e28d0651-2910-4dc5-97b9-57b4835197fa", + "metadata": {}, + "outputs": [], + "source": [ + "lema = Person('Lema', 39)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "1ff6b58e-a607-40d2-880e-0029ee2893cd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "39 Lema\n", + "Hello, my name is Lema\n" + ] + } + ], + "source": [ + "print(lema.age, lema.name)\n", + "lema.greet()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9484e0f1-5194-4ebb-b5e2-8a245c81bef3", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "4789f834", + "metadata": {}, + "source": [ + "# NumPy Package\n", + "NumPy is a Python library for numerical computing. It provides support for large, multi-dimensional arrays and a variety of high-performance mathematical functions." + ] + }, + { + "cell_type": "markdown", + "id": "2f8d8f29", + "metadata": {}, + "source": [ + "## Installion\n", + "\n", + "```bash\n", + "pip install numpy # or pip install --upgrade if you are upgrading numpy\n", + "```\n", + "\n", + "## Loading\n", + "```python\n", + "import numpy as np\n", + "```\n", + "\n", + "## Creating Arrays\n", + "```python\n", + "np.array([1, 2, 3]) # 1D array\n", + "np.zeros((2, 3)) # 2x3 array of zeros\n", + "np.ones((3, 2)) # 3x2 array of ones\n", + "np.full((2, 2), 7) # 2x2 array filled with 7\n", + "np.eye(3) # 3x3 identity matrix\n", + "np.arange(0, 10, 2) # [0, 2, 4, 6, 8]\n", + "np.linspace(0, 1, 5) # 5 evenly spaced numbers\n", + "np.random.rand(2, 2) # Random values in [0, 1)\n", + "np.random.randint(1, 10, 5) # 5 random ints from 1 to 9\n", + "```\n", + "\n", + "Try all the commands on your own.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "272c31e3", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: try all the commands above\n", + "# pip install numpy # uncomment and run if you have not yet installed numpy\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "id": "0fa7c5a0", + "metadata": {}, + "source": [ + "## Array Properties\n", + "\n", + "```python\n", + "a.shape # Dimensions (rows, cols)\n", + "a.ndim # Number of dimensions\n", + "a.size # Total number of elements\n", + "a.dtype # Data type of elements\n", + "```\n", + "\n", + "for a given array `a`." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "e7aff21b", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: define an ndarray from the previous subsection (Creating Arrays), name it a, and check its properties." + ] + }, + { + "cell_type": "markdown", + "id": "1c24be59", + "metadata": {}, + "source": [ + "## Reshaping & Flattening\n", + "```python\n", + "a.reshape(3, 2) # Change shape\n", + "a.flatten() # Convert to 1D\n", + "a.T # Transpose\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "940daaef", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[2. 2.2 2.4 2.6]\n", + " [2.8 3. 3.2 3.4]\n", + " [3.6 3.8 4. 4.2]\n", + " [4.4 4.6 4.8 5. ]\n", + " [5.2 5.4 5.6 5.8]\n", + " [6. 6.2 6.4 6.6]\n", + " [6.8 7. 7.2 7.4]\n", + " [7.6 7.8 8. 8.2]\n", + " [8.4 8.6 8.8 9. ]\n", + " [9.2 9.4 9.6 9.8]]\n" + ] + } + ], + "source": [ + "# Example of reshaping\n", + "a = np.arange(2, 10, 0.2) # arithmetic sequence from 2 with comment difference 2.\n", + "n = len(a) # 40 element\n", + "\n", + "b = a.reshape(10, 4) # return a 10 by 4 matrix.\n", + "print(b)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "4873cdac", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: run a.reshape(2, 5, 4). Assign it to another variable and check its properties." + ] + }, + { + "cell_type": "markdown", + "id": "1f0982a7", + "metadata": {}, + "source": [ + "An example of reshaping is when you have a flat list of 784 pixels from an [MNIST](https://www.kaggle.com/datasets/hichamachahboun/mnist-handwritten-digits) (Modified National Institute of Standards and Technology) image that you need to reshape into a $28\\times28$ array.\n", + "\n", + "Now, run \n", + "```python \n", + "a.flatten()\n", + "```\n", + "What do you see?" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "81329639", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: test if b flattened b is equal to the array a." + ] + }, + { + "cell_type": "markdown", + "id": "ab5e1be5", + "metadata": {}, + "source": [ + "## Indexing & Slicing\n", + "Some examples:\n", + "\n", + "```python\n", + "b[1] # Element at index 1\n", + "b[1:4] # Slice elements 1 to 3\n", + "b[:, 0] # All rows, column 0\n", + "b[1, :] # Row 1, all columns\n", + "b[-1] # Last element\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "61d1fb49", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[2. , 2.2, 2.4, 2.6],\n", + " [2.8, 3. , 3.2, 3.4],\n", + " [3.6, 3.8, 4. , 4.2],\n", + " [4.4, 4.6, 4.8, 5. ],\n", + " [5.2, 5.4, 5.6, 5.8]],\n", + "\n", + " [[6. , 6.2, 6.4, 6.6],\n", + " [6.8, 7. , 7.2, 7.4],\n", + " [7.6, 7.8, 8. , 8.2],\n", + " [8.4, 8.6, 8.8, 9. ],\n", + " [9.2, 9.4, 9.6, 9.8]]])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# TODO: do it yourself.\n", + "a.reshape(2, 5, 4) " + ] + }, + { + "cell_type": "markdown", + "id": "d4816804", + "metadata": {}, + "source": [ + "## Mathematical Operations\n", + "Let `a = 5`, `b=6`, and `c = [a, b, a - 1, b * 2]`. Run the following commands in the console.\n", + "\n", + "```python\n", + "a + b # Element-wise addition\n", + "a * b # Element-wise multiplication\n", + "np.dot(a, b) # Matrix multiplication\n", + "np.sum(a) # Sum of elements\n", + "np.mean(a) # Mean\n", + "np.std(a) # Standard deviation\n", + "np.max(a) # Max value\n", + "np.min(a) # Min value\n", + "np.argmax(a) # Index of max\n", + "np.cumsum(a) # Cumulative sum\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "4ed50be5", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: Run the above commands. Use print to have all outputs.\n", + "a = 5; b = 6; c = [a, b, a - 1, b * 2]" + ] + }, + { + "cell_type": "markdown", + "id": "e4438848", + "metadata": {}, + "source": [ + "## Boolean Operations\n", + "Boolean operations on `NumPy` arrays let you compare elements, filter data, and combine conditions efficiently all in a vectorized way (no loops needed).\n", + "\n", + "```python\n", + "age = np.array([11, 33, 91, 1, 39, 29, 93, 4, 53, 37])\n", + "age > 5 # Element-wise comparison\n", + "age[age > 5] # Filter elements > 5\n", + "np.where(age > 5) # Indexes of all elements > 5\n", + "np.where(age > 5, 1, 0) # Conditional replacement equivalent \n", + " # to (age > 5).astype(int) or np.int64(age > 5)\n", + "np.any(age > 0) # Any True?\n", + "np.all(age > 0) # All True?\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "d6542059", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: Run the above example\n", + "age = np.array([11, 33, 91, 1, 39, 29, 93, 4, 53, 37])" + ] + }, + { + "cell_type": "markdown", + "id": "9f4a8212", + "metadata": {}, + "source": [ + "### Counts\n", + "Knowing that True and False are respectively 1 and 0 numerically. Summing `age > 5` gives the number of observations/participants above 5." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "7d89d078", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: Check it out." + ] + }, + { + "cell_type": "markdown", + "id": "7f4cbccf", + "metadata": {}, + "source": [ + "## Stacking Arrays\n", + "In NumPy, stacking arrays means combining multiple arrays into a single array along a new or existing axis.\n", + "\n", + "```python\n", + "a = np.array([[1, 2], [3, 4]])\n", + "b = np.array([[5, 6], [7, 8]])\n", + "\n", + "print(np.hstack((a, b)))\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "db9cdd84", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1 2]\n", + " [3 4]\n", + " [5 6]\n", + " [7 8]]\n" + ] + } + ], + "source": [ + "a = np.array([[1, 2], [3, 4]])\n", + "b = np.array([[5, 6], [7, 8]])\n", + "\n", + "print(np.vstack((a, b))) # v is for vertical which means row-wise. TODO: Try hstack for column-wise stacking" + ] + }, + { + "cell_type": "markdown", + "id": "afa6e661", + "metadata": {}, + "source": [ + "## Explore other functions\n", + "\n", + "| Function | Axis Behavior | When to Use |\n", + "|----------------|--------------------|--------------------------------------|\n", + "| `hstack` | Columns (side-by-side) | Merge arrays horizontally (must have same number of rows) |\n", + "| `dstack` | Depth (axis=2) | Stack arrays along a third dimension (must match in rows & columns) |\n", + "| `stack` | New axis anywhere | Full control over where the new axis is placed |\n", + "| `column_stack` | Columns | Stack 1D arrays as columns into a 2D array |\n", + "| `row_stack` | Rows | Stack 1D arrays as rows into a 2D array |\n", + "| `concatenate([...], axis)`| Existing axis (no new one)| Join arrays along an existing axis (shape must match on all other dimensions)|" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "f2ccb886", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1, 2],\n", + " [3, 4],\n", + " [5, 6],\n", + " [7, 8]])" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.concatenate([a, b]) # axis=0 by default. The same as print(np.vstack((a, b)))" + ] + }, + { + "cell_type": "markdown", + "id": "2a2ae599", + "metadata": {}, + "source": [ + "## Copying Arrays\n", + "Deep `copy` prevents the modification on the original variable.\n", + "\n", + "```python\n", + "age_copy = age.copy() # Deep copy (not a reference)\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "7217565f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[99 33 91 1 39 29 93 4 53 37]\n", + "[11 33 91 1 39 29 93 4 53 37]\n", + "[99 33 91 1 39 29 93 4 53 37]\n" + ] + } + ], + "source": [ + "age_copy = age.copy()\n", + "age_copy1 = age # reference\n", + "# Now, let's make changes on age_copy1\n", + "age_copy1[0] = 99\n", + "# Pring the 3 variables\n", + "print(age)\n", + "print(age_copy)\n", + "print(age_copy1)" + ] + }, + { + "cell_type": "markdown", + "id": "ce66381f", + "metadata": {}, + "source": [ + "## Saving and Loading data\n", + "NumPy can:\n", + "\n", + "* Store data in its own fast, compact binary format (.npy) with np.save() and reload it with `np.load()`.\n", + "* Save arrays as text files like CSV using `np.savetxt()` for human-readable or spreadsheet use.\n", + "* Load text data (e.g., CSV) back into arrays with `np.genfromtxt()`.\n", + "\n", + "```python\n", + "np.save('data.npy', age) # Save binary\n", + "np.load('data.npy') # Load binary\n", + "np.savetxt('data.csv', age, delimiter=',') # Save as CSV\n", + "np.genfromtxt('data.csv', delimiter=',') # Load CSV\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "a1c56f56", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[99 33 91 1 39 29 93 4 53 37]\n" + ] + } + ], + "source": [ + "np.save('data.npy', age)\n", + "age_import = np.load('data.npy')\n", + "print(age_import)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "a7bcd2db", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([99., 33., 91., 1., 39., 29., 93., 4., 53., 37.])" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.savetxt('data.csv', age, delimiter=\",\")\n", + "np.genfromtxt('data.csv')" + ] + }, + { + "cell_type": "markdown", + "id": "23a9e039", + "metadata": {}, + "source": [ + "# Introduction to Pandas Package\n", + "\n", + "```bash\n", + "# Install Pandas\n", + "pip install pandas\n", + "```\n", + "\n", + "```python\n", + "# Loading Pandas\n", + "import pandas as pd\n", + "```\n", + "\n", + "## Creating data frames\n", + "We can create a pandas DataFrame from:\n", + "* dictionaries of lists" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "f9e4dc65", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
NameAge
0Alice25
1Bob30
2Denyse35
\n", + "
" + ], + "text/plain": [ + " Name Age\n", + "0 Alice 25\n", + "1 Bob 30\n", + "2 Denyse 35" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "data = {'Name': ['Alice', 'Bob', 'Denyse'], 'Age': [25, 30, 35]}\n", + "df_age = pd.DataFrame(data)\n", + "df_age" + ] + }, + { + "cell_type": "markdown", + "id": "222caa06", + "metadata": {}, + "source": [ + "* list of dictionaries" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "5331f9ac", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
NameAge
0Alice25
1Bob30
\n", + "
" + ], + "text/plain": [ + " Name Age\n", + "0 Alice 25\n", + "1 Bob 30" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = [{'Name': 'Alice', 'Age': 25}, {'Name': 'Bob', 'Age': 30}]\n", + "df = pd.DataFrame(data)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "4244f630", + "metadata": {}, + "source": [ + "* list of lists/tuples" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "a081db45", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Name Height\n", + "0 Alice 1.75\n", + "1 Bob 1.63\n", + " Name Height\n", + "0 Alice 1.75\n", + "1 Bob 1.63\n" + ] + } + ], + "source": [ + "data = [['Alice', 1.75], ['Bob', 1.63]]\n", + "data2 = [('Alice', 1.75), ('Bob', 1.63)]\n", + "df_height = pd.DataFrame(data, columns=['Name', 'Height']) # here, we have to specify column names\n", + "df_height2 = pd.DataFrame(data2, columns=['Name', 'Height']) # here, we have to specify column names\n", + "print(df_height)\n", + "print(df_height2)" + ] + }, + { + "cell_type": "markdown", + "id": "0e695d97", + "metadata": {}, + "source": [ + "* NumPy arrays\n", + "```python\n", + "arr = np.array([['Alice', 25], ['Bob', 30]])\n", + "df = pd.DataFrame(arr)\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "8ea0389d", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: Run the above example. The first column is the column of names and the second is the one for ages." + ] + }, + { + "cell_type": "markdown", + "id": "21689cc7", + "metadata": {}, + "source": [ + "## Saving data\n", + "| File Format | Function | Example Code | Notes |\n", + "|-------------|------------------------|-----------------------------------------------------|-------|\n", + "| CSV | `to_csv()` | `df.to_csv('data.csv', index=False)` | Human-readable, widely used, supports delimiters |\n", + "| Excel | `to_excel()` | `df.to_excel('data.xlsx', index=False)` | Requires `openpyxl` or `xlsxwriter` installed |\n", + "| JSON | `to_json()` | `df.to_json('data.json', orient='records')` | Good for web apps and APIs |\n", + "| Pickle | `to_pickle()` | `df.to_pickle('data.pkl')` | Binary format, fast to read/write, Python-specific |\n", + "| HDF5 | `to_hdf()` | `df.to_hdf('data.h5', key='df', mode='w')` | Efficient for large datasets, requires `tables` |\n", + "| Parquet | `to_parquet()` | `df.to_parquet('data.parquet')`\n", + "\n", + "**Note**: Parquet is a modern, efficient, and highly optimized columnar storage file format commonly used in data engineering and data science workflows. It's particularly popular in big data contexts because it allows for faster reading, smaller storage, and better compression compared to traditional row-based formats like CSV." + ] + }, + { + "cell_type": "markdown", + "id": "7c1c64d4", + "metadata": {}, + "source": [ + "## Loading data\n", + "| File Format | Function | Example Code | Notes |\n", + "|-------------|------------------------|-----------------------------------------------------|-------|\n", + "| CSV | `pd.read_csv()` | `df = pd.read_csv('data.csv')` | Most common, human-readable, supports delimiters and encoding options |\n", + "| Excel | `pd.read_excel()` | `df = pd.read_excel('data.xlsx')` | Requires `openpyxl` or `xlrd`, supports multiple sheets |\n", + "| JSON | `pd.read_json()` | `df = pd.read_json('data.json')` | Good for web APIs, can specify `orient` |\n", + "| Pickle | `pd.read_pickle()` | `df = pd.read_pickle('data.pkl')` | Fast binary read/write, Python-specific |\n", + "| HDF5 | `pd.read_hdf()` | `df = pd.read_hdf('data.h5', key='df')` | Efficient for large datasets, requires `tables` |\n", + "| Parquet | `pd.read_parquet()` | `df = pd.read_parquet('data.parquet')` | Columnar format, fast, efficient for big data |\n", + "| SQL | `pd.read_sql()` | `df = pd.read_sql('SELECT * FROM table', conn)` | Reads from SQL database, requires DB connection |" + ] + }, + { + "cell_type": "markdown", + "id": "c65ea2c8", + "metadata": {}, + "source": [ + "## Exploring data\n", + "```python\n", + "df.head() # First 5 rows\n", + "df.tail() # Last 5 rows\n", + "df.info() # Summary\n", + "df.describe() # Stats\n", + "df.shape # Rows and columns\n", + "df.columns # Column names\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "3ffee7a1", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: load the pickle file 'df_data.pkl' using pandas." + ] + }, + { + "cell_type": "markdown", + "id": "f4a37e8f", + "metadata": {}, + "source": [ + "# Group discussion" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "a473d67f", + "metadata": {}, + "outputs": [], + "source": [ + "# Importing CSV (comma separated data in Python)\n", + "rwpop = pd.read_csv(\"./Data/rwa_admpop_adm2_2023.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "bebec9d2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['year', 'ISO3', 'ADM0_FR', 'ADM0_PCODE', 'ADM1_FR', 'ADM1_PCODE',\n", + " 'ADM2_FR', 'ADM2_PCODE', 'F_TL', 'M_TL', 'T_TL', 'F_00_04', 'F_05_09',\n", + " 'F_10_14', 'F_15_19', 'F_20_24', 'F_25_29', 'F_30_34', 'F_35_39',\n", + " 'F_40_44', 'F_45_49', 'F_50_54', 'F_55_59', 'F_60_64', 'F_65_69',\n", + " 'F_70_74', 'F_75_79', 'F_80Plus', 'M_00_04', 'M_05_09', 'M_10_14',\n", + " 'M_15_19', 'M_20_24', 'M_25_29', 'M_30_34', 'M_35_39', 'M_40_44',\n", + " 'M_45_49', 'M_50_54', 'M_55_59', 'M_60_64', 'M_65_69', 'M_70_74',\n", + " 'M_75_79', 'M_80Plus', 'T_00_04', 'T_05_09', 'T_10_14', 'T_15_19',\n", + " 'T_20_24', 'T_25_29', 'T_30_34', 'T_35_39', 'T_40_44', 'T_45_49',\n", + " 'T_50_54', 'T_55_59', 'T_60_64', 'T_65_69', 'T_70_74', 'T_75_79',\n", + " 'T_80Plus'],\n", + " dtype='object')" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "### Data description\n", + "rwpop.head() # displays the first 5 rows of rwpop \n", + "rwpop.shape # number of rows and columns\n", + "rwpop.columns" + ] + }, + { + "cell_type": "markdown", + "id": "d4f609c5", + "metadata": {}, + "source": [ + "As you can see, the data is presented in a wide format and the columns names `F_TL` (Total number of Female) has two information which are Gender and Value. Also, `M_20_24` means count of male in the age category` 20-24`.\n", + "\n", + "The task is to reshape the data from wide to long format. For that, the pandas `melt` could be used as follows." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "39da1cce", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearISO3ADM0_FRADM0_PCODEADM1_FRADM1_PCODEADM2_FRADM2_PCODEvariablePopulation
02023RWARwandaRWEastern ProvinceRW5BugeseraRW57F_TL236613
12023RWARwandaRWEastern ProvinceRW5GatsiboRW53F_TL348552
22023RWARwandaRWEastern ProvinceRW5KayonzaRW54F_TL277298
32023RWARwandaRWEastern ProvinceRW5KireheRW55F_TL241160
42023RWARwandaRWEastern ProvinceRW5NgomaRW56F_TL230804
\n", + "
" + ], + "text/plain": [ + " year ISO3 ADM0_FR ADM0_PCODE ADM1_FR ADM1_PCODE ADM2_FR \\\n", + "0 2023 RWA Rwanda RW Eastern Province RW5 Bugesera \n", + "1 2023 RWA Rwanda RW Eastern Province RW5 Gatsibo \n", + "2 2023 RWA Rwanda RW Eastern Province RW5 Kayonza \n", + "3 2023 RWA Rwanda RW Eastern Province RW5 Kirehe \n", + "4 2023 RWA Rwanda RW Eastern Province RW5 Ngoma \n", + "\n", + " ADM2_PCODE variable Population \n", + "0 RW57 F_TL 236613 \n", + "1 RW53 F_TL 348552 \n", + "2 RW54 F_TL 277298 \n", + "3 RW55 F_TL 241160 \n", + "4 RW56 F_TL 230804 " + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cat_vars = ['year', 'ISO3', 'ADM0_FR', 'ADM0_PCODE', 'ADM1_FR', 'ADM1_PCODE',\n", + " 'ADM2_FR', 'ADM2_PCODE']\n", + "rwpop_melted = pd.melt(rwpop, id_vars=cat_vars, value_name=\"Population\")\n", + "rwpop_melted.head()" + ] + }, + { + "cell_type": "markdown", + "id": "b9ca2319", + "metadata": {}, + "source": [ + "Now, let's filter out rows containing totals `T_`, `_TL`" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "e013548b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearISO3ADM0_FRADM0_PCODEADM1_FRADM1_PCODEADM2_FRADM2_PCODEvariablePopulation
902023RWARwandaRWEastern ProvinceRW5BugeseraRW57F_00_0432472
912023RWARwandaRWEastern ProvinceRW5GatsiboRW53F_00_0444454
922023RWARwandaRWEastern ProvinceRW5KayonzaRW54F_00_0436097
932023RWARwandaRWEastern ProvinceRW5KireheRW55F_00_0430422
942023RWARwandaRWEastern ProvinceRW5NgomaRW56F_00_0430312
.................................
11052023RWARwandaRWWestern ProvinceRW3NyabihuRW34M_80Plus296
11062023RWARwandaRWWestern ProvinceRW3NyamashekeRW37M_80Plus504
11072023RWARwandaRWWestern ProvinceRW3RubavuRW33M_80Plus339
11082023RWARwandaRWWestern ProvinceRW3RusiziRW36M_80Plus418
11092023RWARwandaRWWestern ProvinceRW3RutsiroRW32M_80Plus360
\n", + "

1020 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " year ISO3 ADM0_FR ADM0_PCODE ADM1_FR ADM1_PCODE ADM2_FR \\\n", + "90 2023 RWA Rwanda RW Eastern Province RW5 Bugesera \n", + "91 2023 RWA Rwanda RW Eastern Province RW5 Gatsibo \n", + "92 2023 RWA Rwanda RW Eastern Province RW5 Kayonza \n", + "93 2023 RWA Rwanda RW Eastern Province RW5 Kirehe \n", + "94 2023 RWA Rwanda RW Eastern Province RW5 Ngoma \n", + "... ... ... ... ... ... ... ... \n", + "1105 2023 RWA Rwanda RW Western Province RW3 Nyabihu \n", + "1106 2023 RWA Rwanda RW Western Province RW3 Nyamasheke \n", + "1107 2023 RWA Rwanda RW Western Province RW3 Rubavu \n", + "1108 2023 RWA Rwanda RW Western Province RW3 Rusizi \n", + "1109 2023 RWA Rwanda RW Western Province RW3 Rutsiro \n", + "\n", + " ADM2_PCODE variable Population \n", + "90 RW57 F_00_04 32472 \n", + "91 RW53 F_00_04 44454 \n", + "92 RW54 F_00_04 36097 \n", + "93 RW55 F_00_04 30422 \n", + "94 RW56 F_00_04 30312 \n", + "... ... ... ... \n", + "1105 RW34 M_80Plus 296 \n", + "1106 RW37 M_80Plus 504 \n", + "1107 RW33 M_80Plus 339 \n", + "1108 RW36 M_80Plus 418 \n", + "1109 RW32 M_80Plus 360 \n", + "\n", + "[1020 rows x 10 columns]" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "rwpop_melted['variable'][30]\n", + "indx = np.array([x[0] in [\"F\", \"M\"] and \"TL\" not in x.split(\"_\") for x in rwpop_melted['variable']]) # type: ignore\n", + "rwpop_melted = rwpop_melted[indx]\n", + "rwpop_melted" + ] + }, + { + "cell_type": "markdown", + "id": "31f5b6b4", + "metadata": {}, + "source": [ + "Bingo! We've removed all the totals from the data. Now, the next cleaning is to separate the column variable into `variable` in to `gender` and `age_group`. After that, decode `F` to `Female` and `M` to `Male`." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "5fa5555b", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: Separate variable to gender and age_group\n", + "rwpop_melted['age_group'] = [x[2:] for x in rwpop_melted.variable]\n", + "# rwpop_melted['Gender'] = [x.split(\"_\")[0] for x in rwpop_melted.variable]\n", + "rwpop_melted['Gender'] = [x[:1] for x in rwpop_melted.variable]\n", + "\n", + "# TODO: decode the variable gender\n", + "rwpop_melted.loc[:, 'Gender'] = rwpop_melted['Gender'].replace({'F':'Female', 'M':'Male'})" + ] + }, + { + "cell_type": "markdown", + "id": "5fa5f01a", + "metadata": {}, + "source": [ + "You need to install the `matplotlib` and `seaborn` libraries.\n", + "```bash\n", + "!pip install matplotlib seaborn\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "dd00d9bf", + "metadata": {}, + "source": [ + "If all goes well, you will be able to draw the following chart." + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "3f10e720", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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0iVpn0uXLiE0NBQKhQJ2dnZ44okncODAgXrjKykpwauvvgpHR0e0bt0aw4YNw8mTJ5vselQzieSJiIiIHo9vv/0WL730EmbPno2zZ89i3bp12Lx5MxYtWqTR76OPPsKkSZNw4sQJdO/eHWFhYZg2bRqioqLwyy+/AABef/11qX9paSmeeeYZHDhwAMePH8eIESMwatQoXLt2rdY4RFHEyJEjUVBQgH379iE7Oxv9+vXD008/jb/++qvpLgBM5LadMRr83jaYyawbvX9j7k8TERHp0549ezQKMQcHB6OwsBDz5s2T3r7RuXNnfPTRR5g7dy6io6Olvi+//DLGjh0LAHjnnXcwcOBAvP/++xgxYgQA4I033sDLL78s9e/bty/69u0rfV+4cCF27dqFb775RiPJqvb9998jJycHRUVF0mvSPv74Y+zevRs7duzAq6++qscroYnJExEREdVq6NChWLt2rfTd1tYWHh4eyMrK0phpqqysxN27d3Hnzh3Y2NgAAPr06SNtr36VWu/evTXa7t69C5VKhdatW+P27dtYsGAB9uzZg7y8PNy7dw9lZWV1zjxlZ2ejtLQU7dq102gvKyvTuB3YFJg8ERERUa2qk6UHVVVVYcGCBRg9enSN/g/WTnrwga3qsjq1tVVVVQEA5syZg2+//RYff/wxPDw8YG1tjX/+858oLy+vNbaqqioolUqkp6fX2Obg4KDdCTYSkydjIooQKisA3L/3W42FMImIyFj069cP586d03u5gh9//BHh4eF4/vnnAdz/e/DKlSv1xlFQUABzc3N06tRJr7E0hMmTEREqK2B/ahsAIDR0m9TOl/8SEZGx+OCDD/Dss8/CxcUFL7zwAlq1aoVTp04hJycHCxcubPS4Hh4e+OqrrzBq1CgIgoD3339fmpWqzfDhwzFw4EA899xzWLJkCbp164a8vDzs27cPzz33HHx9fRsdS0OYPBERERlAc30waMSIEdizZw8+/PBDLF26FBYWFujevTv+9a9/PdK4n3zyCaZMmYJBgwahffv2eOedd6BSqersLwgC9u3bh3fffRdTpkzB9evX4eTkhMGDB0trrJqK0bzbrlOnTrh69WqN9hkzZmDNmjW1Vjr18/NDZmZmg2NfuXIF7u7utW77f//v/+GFF14AABw7dgzvvPMOsrKyYGZmhjFjxmDFihU6zfpUvxun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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "sns.barplot(x = \"Population\", y = \"age_group\", hue='Gender', data=rwpop_melted)\n", + "plt.ylabel(\"Age group\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5f7da13d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + }, + "panel-cell-order": [ + "40e9b128-4271-46c7-b7cb-f92cebff2fae", + "683d021f-9a45-4124-877f-3d7faa5951f3" + ] + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/module-1/data.csv b/notebooks/module-1/data.csv new file mode 100644 index 0000000..c0a9963 --- /dev/null +++ b/notebooks/module-1/data.csv @@ -0,0 +1,10 @@ +9.900000000000000000e+01 +3.300000000000000000e+01 +9.100000000000000000e+01 +1.000000000000000000e+00 +3.900000000000000000e+01 +2.900000000000000000e+01 +9.300000000000000000e+01 +4.000000000000000000e+00 +5.300000000000000000e+01 +3.700000000000000000e+01 diff --git a/notebooks/module-1/data.npy b/notebooks/module-1/data.npy new file mode 100644 index 0000000..44fa1ca Binary files /dev/null and b/notebooks/module-1/data.npy differ diff --git a/notebooks/module-5/01-connecting-to-databases.ipynb b/notebooks/module-5/01-connecting-to-databases.ipynb new file mode 100644 index 0000000..9fc26ee --- /dev/null +++ b/notebooks/module-5/01-connecting-to-databases.ipynb @@ -0,0 +1,384 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a080151f", + "metadata": {}, + "source": [ + "# Connecting to PostgreSQL from Python\n", + "\n", + "In this notebook, we will learn how to connect a PostgreSQL database to Python. \n", + "This is an essential skill if you want to:\n", + "- Explore your data directly in **pandas** DataFrames \n", + "- Build **data pipelines (ETL/ELT)** to refresh your tables regularly \n", + "- Power **machine learning or LLM-based applications** that rely on structured data \n", + "- Prototype **dashboards and APIs** that serve insights to end-users \n", + "\n", + "We will go step by step:\n", + "1. Load database credentials securely from a `.env` file \n", + "2. Connect to PostgreSQL using **SQLAlchemy** and **psycopg2** \n", + "3. Run sanity checks to confirm the connection \n", + "4. Query our nightlights and population tables into pandas \n", + "5. Perform simple summaries, joins, and a time-series query " + ] + }, + { + "cell_type": "markdown", + "id": "88d556cd", + "metadata": {}, + "source": [ + "## Required Python Packages\n", + "Ensure that you installed the required packages." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "491440a6", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from dotenv import load_dotenv\n", + "from sqlalchemy import create_engine, text\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "id": "ef232a12", + "metadata": {}, + "source": [ + "## PostgreSQL Environment Variables\n", + "To connect, PostgreSQL needs a few basic pieces of information:\n", + "\n", + "- **PGHOST** → The host where PostgreSQL is running. \n", + " For local setups this is usually `localhost`. \n", + "- **PGPORT** → The port PostgreSQL listens on. \n", + " Default is `5432`. \n", + "- **PGDATABASE** → The database name you created for this lab, e.g. `ntl_pop`. \n", + "- **PGUSER** → Your PostgreSQL username. \n", + " This is usually the same as your system username when running locally. \n", + "\n", + "⚠️ **Note:** On a local setup, you usually don’t need a password if PostgreSQL is configured to trust local connections. \n", + "In that case, we will not use `PGPASSWORD`. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15f789d9", + "metadata": {}, + "outputs": [], + "source": [ + "# 1) Load environment variables\n", + "# The .env file should be in the repo root with keys:\n", + "# PGHOST, PGPORT, PGDATABASE, PGUSER, PGPASSWORD\n", + "\n", + "# looks for .env in current directory by default\n", + "load_dotenv() \n", + "\n", + "PGHOST = os.getenv(\"PGHOST\")\n", + "PGPORT = os.getenv(\"PGPORT\", \"5432\")\n", + "PGDATABASE = os.getenv(\"PGDATABASE\")\n", + "PGUSER = os.getenv(\"PGUSER\")\n", + "PGPASSWORD = os.getenv(\"PGPASSWORD\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "90dd0055", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'5432'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "PGPORT" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ef54c927", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PostgreSQL Connection Settings:\n", + "Host: localhost\n", + "Port: 5432\n", + "Database: ntl_pop\n", + "User: dmatekenya\n", + "Password: [NOT SET]\n" + ] + } + ], + "source": [ + "print(\"PostgreSQL Connection Settings:\")\n", + "print(f\"Host: {PGHOST}\")\n", + "print(f\"Port: {PGPORT}\")\n", + "print(f\"Database: {PGDATABASE}\")\n", + "print(f\"User: {PGUSER}\")\n", + "print(f\"Password: {'[SET]' if PGPASSWORD else '[NOT SET]'}\")" + ] + }, + { + "cell_type": "markdown", + "id": "729bbf71", + "metadata": {}, + "source": [ + "## Create SQLAlchemy engine \n", + "At this stage, we are establishing the **connection between Python and PostgreSQL**. \n", + "The `SQLAlchemy` package plays the role of a **database toolkit and Object Relational Mapper (ORM)**. In our case, we are mainly using it as a **bridge**: it translates Python code into SQL statements that PostgreSQL can understand, and it manages the underlying connection details for us (user, host, port, database). By creating an **engine object**, we set up a reusable gateway that allows us to open sessions, run queries, and easily pull results into Python tools such as **pandas** for analysis. While `psycopg2` handles the low-level communication with PostgreSQL, `SQLAlchemy` provides a higher-level, more user-friendly interface. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "be1eecf7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Connection psql string: postgresql+psycopg2://dmatekenya:@localhost:5432/ntl_pop\n" + ] + } + ], + "source": [ + "# Create SQLAlchemy engine (no password needed for local connections)\n", + "connection_string = f\"postgresql+psycopg2://{PGUSER}:{PGPASSWORD}@{PGHOST}:{PGPORT}/{PGDATABASE}\"\n", + "print(\"Connection psql string:\", connection_string)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3c2ec747", + "metadata": {}, + "outputs": [], + "source": [ + "engine = create_engine(\n", + " connection_string,\n", + " pool_pre_ping=True,\n", + ")\n", + "\n", + "# Test the connection\n", + "with engine.connect() as conn:\n", + " who = conn.execute(text(\"SELECT current_user, current_database();\")).fetchone()\n", + " print(\"Connected as:\", who)" + ] + }, + { + "cell_type": "markdown", + "id": "9ef873a3", + "metadata": {}, + "source": [ + "## Running SQL Commands\n", + "Once the connection is established through the SQLAlchemy engine, we can begin sending SQL commands from Python. \n", + "What happens in the background is: \n", + "\n", + "1. **You write a SQL query as a string in Python** (e.g., `\"SELECT * FROM ntl_annual LIMIT 5;\"`). \n", + "2. **SQLAlchemy passes this query to the underlying driver (`psycopg2`)**, which handles the low-level communication with PostgreSQL. \n", + "3. **PostgreSQL executes the query on the database** and returns the results (rows and columns). \n", + "4. **SQLAlchemy collects the results** and makes them available to Python. \n", + "5. If we use `pandas.read_sql`, the results are automatically converted into a **DataFrame** for analysis, filtering, and visualization. \n", + "\n", + "In short: Python → SQLAlchemy → psycopg2 → PostgreSQL → back to Python as DataFrame. \n", + "This allows us to stay in a familiar Python environment while still harnessing the power of SQL. \n", + "\n", + "In the same way, we can also **create new tables**, **update existing tables with additional data**, or even **delete records**—all from within Python. \n", + "For example: \n", + "- Use `CREATE TABLE` statements to define new tables. \n", + "- Use `INSERT` or `COPY` to add more rows of data. \n", + "- Use `UPDATE` to modify existing records. \n", + "- Use `DROP` to remove tables you no longer need. \n", + "\n", + "This makes Python a powerful interface for both **querying** and **managing** your database directly. \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8f3cc4c", + "metadata": {}, + "outputs": [], + "source": [ + "def peek(sql: str) -> pd.DataFrame:\n", + " \"\"\"Run a SQL query and return the results as a pandas DataFrame.\"\"\"\n", + " return pd.read_sql(sql, engine)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f9b26b3b", + "metadata": {}, + "outputs": [], + "source": [ + "# ========== 3. Sanity checks ==========\n", + "tables = [\"cells\", \"pop\", \"ntl_annual\", \"ntl_monthly\"]\n", + "\n", + "print(\"\\n--- Table counts ---\")\n", + "for t in tables:\n", + " cnt = peek(f\"SELECT COUNT(*) AS n FROM {t};\")\n", + " print(f\"{t}: {cnt.loc[0, 'n']} rows\")\n", + "\n", + "print(\"\\n--- First 5 rows from cells ---\")\n", + "print(peek(\"SELECT * FROM cells LIMIT 5\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "385c2f3b", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# ========== 4. Annual summaries ==========\n", + "print(\"\\n--- Average ntl_mean per year ---\")\n", + "annual_avg = peek(\"\"\"\n", + "SELECT year, AVG(ntl_mean) AS avg_ntl_mean\n", + "FROM ntl_annual\n", + "GROUP BY year\n", + "ORDER BY year;\n", + "\"\"\")\n", + "print(annual_avg.head())\n", + "\n", + "print(\"\\n--- Top 5 brightest cells in 2023 ---\")\n", + "brightest = peek(\"\"\"\n", + "SELECT cell_id, ntl_mean\n", + "FROM ntl_annual\n", + "WHERE year = 2023\n", + "ORDER BY ntl_mean DESC\n", + "LIMIT 5;\n", + "\"\"\")\n", + "print(brightest)\n", + "\n", + "\n", + "# ========== 5. Join with population ==========\n", + "print(\"\\n--- Light per capita (2023) ---\")\n", + "per_capita = peek(\"\"\"\n", + "SELECT\n", + " c.cell_name,\n", + " c.district_name,\n", + " a.year,\n", + " a.ntl_sum / NULLIF(p.general_pop, 0) AS light_per_capita,\n", + " a.ntl_sum,\n", + " p.general_pop\n", + "FROM ntl_annual a\n", + "JOIN cells c ON a.cell_id = c.cell_id\n", + "JOIN pop p ON a.cell_id = p.cell_id\n", + "WHERE a.year = 2023\n", + "ORDER BY light_per_capita DESC NULLS LAST\n", + "LIMIT 10;\n", + "\"\"\")\n", + "print(per_capita)" + ] + }, + { + "cell_type": "markdown", + "id": "bf0dbfd5", + "metadata": {}, + "source": [ + "# Exercise: Working with Your Database\n", + "\n", + "Now that you’ve seen how to connect and query PostgreSQL from Python, it’s time to practice. \n", + "In this exercise, you will write and run your own SQL commands inside Python. \n", + "\n", + "### Tasks\n", + "\n", + "1. **Create a New Table** \n", + " - Write a SQL command in Python to create a small table called `demo_cells` with the following columns: \n", + " - `id` (integer, primary key) \n", + " - `cell_name` (text) \n", + " - `population` (integer) \n", + "\n", + "2. **Insert Data** \n", + " - Insert at least **two rows** of data into `demo_cells`. \n", + " - Hint: use `INSERT INTO demo_cells (...) VALUES (...);`. \n", + "\n", + "3. **Query Your Data** \n", + " - Select all rows from `demo_cells` and load them into a pandas DataFrame. \n", + " - Display the results. \n", + "\n", + "4. **Update Data** \n", + " - Update one of the rows (for example, change the population of a cell). \n", + " - Run a `SELECT` again to confirm the update worked. \n", + "\n", + "5. **Cleanup (Optional)** \n", + " - Drop the table when you are done: `DROP TABLE demo_cells;`. \n", + "\n", + "---\n", + "\n", + "💡 *Tip:* Remember that you can use the `engine.execute(text(\"SQL HERE\"))` pattern for commands like `CREATE`, `INSERT`, `UPDATE`, or `DROP`, and `pd.read_sql(\"SQL HERE\", engine)` when you want to return results into a DataFrame. \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "e2edcf84", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "## Summary: Working with PostgreSQL in Python\n", + "\n", + "In this notebook, you learned how to connect Python to a PostgreSQL database, configure the connection using environment variables, and create a SQLAlchemy engine that acts as a bridge between Python and SQL. You executed key operations such as checking table counts, exploring data with a helper function, and running queries to analyze nightlight trends, identify the brightest cells, and compute light-per-capita statistics by joining nightlights with population data. In the same way, Python can interact with many other databases — whether they are hosted locally on your machine, running on a server in the cloud, or provided as enterprise solutions. This includes both proprietary systems such as Microsoft SQL Server and Oracle, as well as open-source databases like MySQL, MariaDB, and SQLite. Thanks to libraries like SQLAlchemy, the workflow you practiced here is portable: once you learn how to query and manage data in Python, you can apply the same approach across different database platforms.\n", + "\n", + "## Next Steps: Exploring Databases with Python\n", + "After learning how to connect Python to PostgreSQL and run queries, you can explore: \n", + "\n", + "- **Advanced SQL**: joins, window functions, subqueries, CTEs \n", + "- **Database management**: creating/updating tables, indexes, transactions \n", + "- **Python integration**: automate queries, build ETL pipelines, visualize results \n", + "- **Other databases**: SQLite, MySQL/MariaDB, SQL Server, Oracle \n", + "- **Scaling up**: cloud-hosted databases, connection pooling, performance tuning \n", + "- **Applications**: power ML workflows, LLM-based apps (RAG), dashboards, or APIs " + ] + }, + { + "cell_type": "markdown", + "id": "fef87e9a", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/module-5/03-web-scraping.ipynb b/notebooks/module-5/03-web-scraping.ipynb new file mode 100644 index 0000000..cb3054d --- /dev/null +++ b/notebooks/module-5/03-web-scraping.ipynb @@ -0,0 +1,143 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "422cffd5", + "metadata": {}, + "outputs": [], + "source": [ + "# %% [markdown]\n", + "# # Web scraping demo: Books to Scrape\n", + "# https://books.toscrape.com/\n", + "# - Scrapes title, price, rating, availability, and product URL\n", + "# - Follows pagination (Next →)\n", + "# - Optional: scrape a specific category\n", + "\n", + "# %%\n", + "import time, re\n", + "from urllib.parse import urljoin\n", + "import requests\n", + "from bs4 import BeautifulSoup\n", + "import pandas as pd\n", + "from requests.adapters import HTTPAdapter\n", + "from urllib3.util.retry import Retry\n", + "\n", + "BASE = \"https://books.toscrape.com/\"\n", + "\n", + "def make_session():\n", + " s = requests.Session()\n", + " s.headers.update({\n", + " \"User-Agent\": \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 \"\n", + " \"(KHTML, like Gecko) Chrome Safari\"\n", + " })\n", + " retries = Retry(\n", + " total=5,\n", + " backoff_factor=0.4,\n", + " status_forcelist=[429, 500, 502, 503, 504],\n", + " allowed_methods=[\"GET\"]\n", + " )\n", + " s.mount(\"http://\", HTTPAdapter(max_retries=retries))\n", + " s.mount(\"https://\", HTTPAdapter(max_retries=retries))\n", + " return s\n", + "\n", + "def clean_price(txt):\n", + " # '£51.77' -> 51.77\n", + " if not txt: return None\n", + " m = re.search(r\"(\\d+(?:\\.\\d+)?)\", txt.replace(\",\", \"\"))\n", + " return float(m.group(1)) if m else None\n", + "\n", + "def get_soup(session, url, sleep=0.2, timeout=15):\n", + " resp = session.get(url, timeout=timeout)\n", + " resp.raise_for_status()\n", + " time.sleep(sleep) # be polite\n", + " return BeautifulSoup(resp.text, \"html.parser\")\n", + "\n", + "def parse_book_card(card, page_url):\n", + " # Each book is inside
\n", + " title_el = card.select_one(\"h3 a\")\n", + " title = title_el.get(\"title\") if title_el else None\n", + " rel_link = title_el.get(\"href\") if title_el else None\n", + " product_url = urljoin(page_url, rel_link) if rel_link else None\n", + "\n", + " price = clean_price(card.select_one(\".price_color\").get_text(strip=True) if card.select_one(\".price_color\") else None)\n", + "\n", + " # Rating is in class, e.g.,

\n", + " rating_el = card.select_one(\".star-rating\")\n", + " rating = None\n", + " if rating_el:\n", + " classes = rating_el.get(\"class\", [])\n", + " # classes like [\"star-rating\", \"Three\"]\n", + " for c in classes:\n", + " if c in {\"One\",\"Two\",\"Three\",\"Four\",\"Five\"}:\n", + " rating = c\n", + "\n", + " # availability appears on product page; on list page it may not be present\n", + " availability = card.select_one(\".availability\")\n", + " availability = availability.get_text(strip=True) if availability else None\n", + "\n", + " return {\n", + " \"title\": title,\n", + " \"price\": price,\n", + " \"rating\": rating,\n", + " \"availability\": availability,\n", + " \"product_url\": product_url,\n", + " \"page_url\": page_url,\n", + " }\n", + "\n", + "def iter_pages(start_url, session, limit_pages=None):\n", + " \"\"\"Yield soup & url for each page, following 'next' links.\"\"\"\n", + " url = start_url\n", + " pages = 0\n", + " while url:\n", + " soup = get_soup(session, url)\n", + " yield soup, url\n", + " pages += 1\n", + " if limit_pages and pages >= limit_pages:\n", + " break\n", + " next_link = soup.select_one(\"li.next a\")\n", + " url = urljoin(url, next_link.get(\"href\")) if next_link else None\n", + "\n", + "def scrape_books(category_url=None, limit_pages=None):\n", + " \"\"\"\n", + " Scrape all books from the main listing or a specific category.\n", + " - category_url example: 'https://books.toscrape.com/catalogue/category/books/travel_2/index.html'\n", + " \"\"\"\n", + " session = make_session()\n", + " start = category_url or urljoin(BASE, \"catalogue/page-1.html\") # main listing\n", + " rows = []\n", + "\n", + " for soup, page_url in iter_pages(start, session, limit_pages=limit_pages):\n", + " cards = soup.select(\"article.product_pod\")\n", + " for c in cards:\n", + " rows.append(parse_book_card(c, page_url))\n", + " print(f\"[info] {page_url} -> +{len(cards)} items (total {len(rows)})\")\n", + "\n", + " return pd.DataFrame(rows)\n", + "\n", + "# %% Run: scrape first 2 pages of all books (quick classroom run)\n", + "df_demo = scrape_books(limit_pages=2)\n", + "df_demo.head(), df_demo.shape\n", + "\n", + "# %% Optional: scrape full site (all pages). Comment back in if you want the full run.\n", + "# df_all = scrape_books(limit_pages=None)\n", + "# df_all.to_csv(\"books_all.csv\", index=False)\n", + "# print(\"Saved books_all.csv with\", len(df_all), \"rows\")\n", + "\n", + "# %% Optional: pick a category\n", + "# How to find a category: browse homepage → click a category → copy its URL\n", + "# Example (Travel):\n", + "# cat_url = \"https://books.toscrape.com/catalogue/category/books/travel_2/index.html\"\n", + "# df_travel = scrape_books(category_url=cat_url, limit_pages=None)\n", + "# df_travel.to_csv(\"books_travel.csv\", index=False)\n" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/module-5/Lilongwe b/notebooks/module-5/Lilongwe new file mode 100644 index 0000000..f20b9b0 --- /dev/null +++ b/notebooks/module-5/Lilongwe @@ -0,0 +1,41 @@ +Date,tempF,tempF_min,tempF_max,humidity,City +2025-09-17,303.76,302.75,302.75,28,Lilongwe +2025-09-17,300.53,298.67,298.67,29,Lilongwe +2025-09-17,296.7,296.7,296.7,38,Lilongwe +2025-09-18,295.66,295.66,295.66,40,Lilongwe +2025-09-18,294.35,294.35,294.35,42,Lilongwe +2025-09-18,298.68,298.68,298.68,35,Lilongwe +2025-09-18,303.05,303.05,303.05,26,Lilongwe +2025-09-18,304.92,304.92,304.92,19,Lilongwe +2025-09-18,302.98,302.98,302.98,25,Lilongwe +2025-09-18,299.11,299.11,299.11,37,Lilongwe +2025-09-18,297.49,297.49,297.49,41,Lilongwe +2025-09-19,296.22,296.22,296.22,44,Lilongwe +2025-09-19,295.55,295.55,295.55,51,Lilongwe +2025-09-19,298.45,298.45,298.45,44,Lilongwe +2025-09-19,302.87,302.87,302.87,33,Lilongwe +2025-09-19,304.59,304.59,304.59,25,Lilongwe +2025-09-19,303.54,303.54,303.54,25,Lilongwe +2025-09-19,300.0,300.0,300.0,33,Lilongwe +2025-09-19,298.37,298.37,298.37,42,Lilongwe +2025-09-20,296.72,296.72,296.72,51,Lilongwe +2025-09-20,294.82,294.82,294.82,64,Lilongwe +2025-09-20,297.3,297.3,297.3,53,Lilongwe +2025-09-20,302.43,302.43,302.43,34,Lilongwe +2025-09-20,304.02,304.02,304.02,27,Lilongwe +2025-09-20,302.95,302.95,302.95,25,Lilongwe +2025-09-20,299.69,299.69,299.69,29,Lilongwe +2025-09-20,297.17,297.17,297.17,36,Lilongwe +2025-09-21,295.09,295.09,295.09,43,Lilongwe +2025-09-21,294.46,294.46,294.46,48,Lilongwe +2025-09-21,297.5,297.5,297.5,44,Lilongwe +2025-09-21,302.24,302.24,302.24,30,Lilongwe +2025-09-21,304.35,304.35,304.35,22,Lilongwe +2025-09-21,302.92,302.92,302.92,24,Lilongwe +2025-09-21,299.48,299.48,299.48,31,Lilongwe +2025-09-21,297.42,297.42,297.42,34,Lilongwe +2025-09-22,295.52,295.52,295.52,41,Lilongwe +2025-09-22,294.48,294.48,294.48,46,Lilongwe +2025-09-22,297.88,297.88,297.88,42,Lilongwe +2025-09-22,302.89,302.89,302.89,29,Lilongwe +2025-09-22,304.98,304.98,304.98,22,Lilongwe diff --git a/notebooks/module-5/download-ntl.ipynb b/notebooks/module-5/download-ntl.ipynb new file mode 100644 index 0000000..87fe044 --- /dev/null +++ b/notebooks/module-5/download-ntl.ipynb @@ -0,0 +1,1138 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "10f90f1b", + "metadata": {}, + "source": [ + "# Night Lights Data Download and Preprocessing\n", + "In this notebook, we first download nightlights using the ```blackmarblePY```-A Python package for interacting with NASA's Black Marble night lights imagery data repository. \n", + "For the downloads, we download annual composites-this combines daily nighlight images into a single image for the whole year utilzing alot of processing to deal with cloud cpve and noise. We also download momthly composites which are geenrated a simialr way as annual composites. The data covers the perios of 2012 to present. We do download 2012 to 2024.\n", + "\n", + "Next, we generate zonal statistics using spatial processing. Zonal statics computes summary statics for all pixels withing a zone. In our case, the zones are cells. For each zone, we calculate mean, median, sum, min and maximum. Also, we calculate number of pixels per cell.\n", + "\n", + "We then export these summary statistics intoCSV files which we will import into the database." + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "id": "fc847c86", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n", + "The watermark extension is already loaded. To reload it, use:\n", + " %reload_ext watermark\n", + "Last updated: Sat Sep 13 2025\n", + "\n", + "Python implementation: CPython\n", + "Python version : 3.12.7\n", + "IPython version : 9.5.0\n", + "\n", + "blackmarble: 2025.6.3\n", + "\n" + ] + } + ], + "source": [ + "import os\n", + "import glob\n", + "import re\n", + "from pathlib import Path\n", + "import datetime\n", + "import logging\n", + "from tqdm import tqdm\n", + "\n", + "import colorcet as cc\n", + "import contextily as cx\n", + "import geopandas as gpd\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "from rasterstats import zonal_stats\n", + "from bokeh.plotting import figure, output_notebook, show\n", + "from bokeh.models import HoverTool, Title\n", + "\n", + "from pyproj.enums import WktVersion\n", + "\n", + "# Monkey-patch the default `to_wkt()` behavior to always return WKT1\n", + "import pyproj.crs.crs\n", + "\n", + "from blackmarble import BlackMarble\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "logging.getLogger(\"blackmarblepy\").setLevel(logging.INFO)\n", + "load_dotenv()\n", + "\n", + "%load_ext autoreload\n", + "%load_ext watermark\n", + "%autoreload 2\n", + "%watermark -v -u -n -p blackmarble" + ] + }, + { + "cell_type": "markdown", + "id": "56933690", + "metadata": {}, + "source": [ + "# Setup Input Directories" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "5c02c608", + "metadata": {}, + "outputs": [], + "source": [ + "DIR_WORKSPACE = Path.cwd().parents[1]\n", + "DIR_DATA = DIR_WORKSPACE / \"data\"\n", + "DIR_NTL = DIR_DATA / \"ntl\"\n", + "DIR_POP = DIR_DATA / \"population-demography\"\n", + "DIR_RASTERS_ANNUAL = DIR_NTL / \"rasters/annual\"\n", + "DIR_RASTERS_MONTHLY = DIR_NTL / \"rasters/monthly\"\n", + "DIR_STATS_ANNUAL = DIR_NTL / \"stats/annual\"\n", + "DIR_STATS_MONTHLY = DIR_NTL / \"stats/monthly\"\n", + "DIR_DB_DATA = DIR_DATA / \"tmp-db-data\"\n", + "FILE_SHP_ADM4_POP = DIR_DATA / \"geospatial/pop-demo-infra/adm4-pop-buildings.shp\"\n", + "FILE_SHP_ADM4 = DIR_DATA / \"geospatial/adm-bounds/gadm41_RWA_4.json\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "af5bacc7", + "metadata": {}, + "outputs": [], + "source": [ + "# Load Rwanda Admin 0 Boundaries\n", + "gdf = geopandas.read_file(FILE_SHP_ADM0\n", + ")\n", + "# gdf.explore(tiles=\"CartoDB dark_matter\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fcb67a25", + "metadata": {}, + "outputs": [], + "source": [ + "gdf.plot(figsize=(8, 8), edgecolor=\"k\", alpha=0.5)" + ] + }, + { + "cell_type": "markdown", + "id": "6b77db2a", + "metadata": {}, + "source": [ + "# A Patch to Deal with CRS Issue in the Package" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "98a34168", + "metadata": {}, + "outputs": [], + "source": [ + "_original_to_wkt = pyproj.crs.crs.CRS.to_wkt\n", + "\n", + "def patched_to_wkt(self, version=WktVersion.WKT1_GDAL, *args, **kwargs):\n", + " return _original_to_wkt(self, version=version, *args, **kwargs)\n", + "\n", + "pyproj.crs.crs.CRS.to_wkt = patched_to_wkt\n" + ] + }, + { + "cell_type": "markdown", + "id": "0db2a632", + "metadata": {}, + "source": [ + "# Download Annual Composites for 2012 to 2024" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "6f8a2b4b", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the BlackMarble interface.\n", + "bm = BlackMarble(output_directory=DIR_RASTERS_ANNUAL)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5dd4d37", + "metadata": {}, + "outputs": [], + "source": [ + "# Loop over years\n", + "for year in range(2012, 2025): # 2025 is exclusive, so it ends at 2024\n", + " print(f\"Downloading for {year}...\")\n", + " try:\n", + " bm.raster(\n", + " gdf=gdf,\n", + " product_id=\"VNP46A4\", # Annual composite\n", + " date_range=f\"{year}-01-01\",\n", + " )\n", + " except Exception as e:\n", + " print(f\"Failed to download for {year}: {e}\")" + ] + }, + { + "cell_type": "markdown", + "id": "0baad957", + "metadata": {}, + "source": [ + "# Download Monthly data for 2012 to 2024" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e6e3c09d", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the BlackMarble interface.\n", + "bm = BlackMarble(output_directory=DIR_RASTERS_MONTHLY, output_skip_if_exists=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1308cc74", + "metadata": {}, + "outputs": [], + "source": [ + "# Generate list of year-month combinations\n", + "year_months = [(year, month) for year in range(2012, 2025) for month in range(1, 13)]\n", + "\n", + "# Iterate with progress bar\n", + "for year, month in tqdm(year_months, desc=\"Downloading monthly composites\"):\n", + " start_date = f\"{year}-{month:02d}-01\"\n", + "\n", + " try:\n", + " bm.raster(\n", + " gdf=gdf,\n", + " product_id=\"VNP46A3\", # Monthly Black Marble product\n", + " date_range=start_date,\n", + " )\n", + " except Exception as e:\n", + " print(f\"❌ Failed for {start_date}: {e}\")" + ] + }, + { + "cell_type": "markdown", + "id": "a9085beb", + "metadata": {}, + "source": [ + "# Generate Zonal Statistics " + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "id": "139ba80d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Processing 300 raster files...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 300/300 [05:05<00:00, 1.02s/it]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "✅ All zonal stats saved to /Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/data/ntl/stats/monthly/merged-zonal-stats-2012-2024.csv\n", + "✅ Individual CSVs saved in folder: /Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/data/ntl/stats/monthly\n" + ] + } + ], + "source": [ + "# === CONFIGURATION ===\n", + "RASTER_FOLDER = DIR_RASTERS_MONTHLY # Folder containing .tif files\n", + "SINGLE_CSV_FOLDER = DIR_STATS_MONTHLY\n", + "COMBINED_CSV_FILE = DIR_STATS_MONTHLY / \"merged-zonal-stats-2012-2024.csv\"\n", + "\n", + "\n", + "# Load polygons\n", + "gdf = gpd.read_file(FILE_SHP_ADM4_POP)\n", + "\n", + "# List all .tif files\n", + "tif_files = sorted(glob.glob(os.path.join(RASTER_FOLDER, \"*.tif\")))\n", + "\n", + "# Store all rows for combined CSV\n", + "all_stats = []\n", + "\n", + "print(f\"Processing {len(tif_files)} raster files...\")\n", + "\n", + "for tif_path in tqdm(tif_files):\n", + " filename = os.path.basename(tif_path)\n", + " \n", + " # Parse year and optionally month from filename using regex\n", + " year, month = None, None\n", + " match_ym = re.search(r\"(\\d{4})[_-]?(\\d{2})\", filename) # e.g., 2023_01\n", + " match_y = re.search(r\"(\\d{4})\", filename) # fallback if only year\n", + "\n", + " if match_ym:\n", + " year, month = int(match_ym.group(1)), int(match_ym.group(2))\n", + " elif match_y:\n", + " year = int(match_y.group(1))\n", + "\n", + " # Compute zonal statistics\n", + " stats = zonal_stats(\n", + " gdf,\n", + " tif_path,\n", + " stats=[\"mean\", \"median\", \"min\", \"max\", \"sum\", \"count\"],\n", + " nodata=None,\n", + " geojson_out=True\n", + " )\n", + "\n", + " # Extract polygon properties and add raster info\n", + " rows = []\n", + " for zone in stats:\n", + " row = zone[\"properties\"].copy()\n", + " # row.update(zone[\"stats\"])\n", + " row[\"raster\"] = filename\n", + " row[\"year\"] = year\n", + " if month:\n", + " row[\"month\"] = month\n", + " rows.append(row)\n", + " all_stats.append(row)\n", + "\n", + " # Save individual file\n", + " df_raster = pd.DataFrame(rows)\n", + " single_csv_path = os.path.join(SINGLE_CSV_FOLDER, f\"{filename.replace('.tif', '.csv')}\")\n", + " df_raster.to_csv(single_csv_path, index=False)\n", + "\n", + "df_all = pd.DataFrame(all_stats)\n", + "df_all.rename(columns={'province_n': 'province_name', 'district_n':'district_name', 'sector_nam': 'sector_name',\n", + " 'min': 'ntl_mean', 'max':'ntl_max', 'mean':'ntl_mean', 'count':'pixel_count','min':'ntl_min',\n", + " 'sum':'ntl_sum', 'median':'ntl_median', 'raster':'raster_filename'}, inplace=True)\n", + "\n", + "df_all = df_all[['cell_id', 'ntl_mean', 'ntl_median', 'ntl_min', 'ntl_max', 'ntl_sum', 'pixel_count', 'raster_filename', 'year', 'month']]\n", + "df_all.to_csv(COMBINED_CSV_FILE, index=False)\n", + "print(f\"\\n✅ All zonal stats saved to {COMBINED_CSV_FILE}\")\n", + "print(f\"✅ Individual CSVs saved in folder: {SINGLE_CSV_FOLDER}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "id": "c0d056f2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cell_idntl_meanntl_medianntl_minntl_maxntl_sumpixel_countraster_filenameyearmonth
0RWA.1.1.1.1_10.00.00.00.00.026VNP46A3.A2012001.h20v09.001.2021124111708.tif2012NaN
1RWA.1.1.1.2_10.00.00.00.00.027VNP46A3.A2012001.h20v09.001.2021124111708.tif2012NaN
2RWA.1.1.1.3_10.00.00.00.00.027VNP46A3.A2012001.h20v09.001.2021124111708.tif2012NaN
3RWA.1.1.1.4_10.00.00.00.00.043VNP46A3.A2012001.h20v09.001.2021124111708.tif2012NaN
4RWA.1.1.2.1_10.00.00.00.00.064VNP46A3.A2012001.h20v09.001.2021124111708.tif2012NaN
\n", + "
" + ], + "text/plain": [ + " cell_id ntl_mean ntl_median ntl_min ntl_max ntl_sum \\\n", + "0 RWA.1.1.1.1_1 0.0 0.0 0.0 0.0 0.0 \n", + "1 RWA.1.1.1.2_1 0.0 0.0 0.0 0.0 0.0 \n", + "2 RWA.1.1.1.3_1 0.0 0.0 0.0 0.0 0.0 \n", + "3 RWA.1.1.1.4_1 0.0 0.0 0.0 0.0 0.0 \n", + "4 RWA.1.1.2.1_1 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + " pixel_count raster_filename year month \n", + "0 26 VNP46A3.A2012001.h20v09.001.2021124111708.tif 2012 NaN \n", + "1 27 VNP46A3.A2012001.h20v09.001.2021124111708.tif 2012 NaN \n", + "2 27 VNP46A3.A2012001.h20v09.001.2021124111708.tif 2012 NaN \n", + "3 43 VNP46A3.A2012001.h20v09.001.2021124111708.tif 2012 NaN \n", + "4 64 VNP46A3.A2012001.h20v09.001.2021124111708.tif 2012 NaN " + ] + }, + "execution_count": 122, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_all.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32e2dfcf", + "metadata": {}, + "outputs": [], + "source": [ + "{'province_n': 'province_name', 'district_n':'district_name', 'sector_nam': 'sector_name',\n", + " 'min': 'ntl_mean', 'max':'ntl_max', 'mean':'ntl_mean', 'count':'pixel_count',\n", + " 'sum':'ntl_sum', 'median':'ntl_median', 'raster':'raster_filename'}" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "id": "0f20ad15", + "metadata": {}, + "outputs": [], + "source": [ + "# Save combined file\n", + "df = pd.read_csv(DIR_DB_DATA / \"population.csv\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "id": "1b4f3c1d", + "metadata": {}, + "outputs": [], + "source": [ + "df[['elderly_60', 'general_pop', 'children_under5',\n", + " 'youth_15_24', 'men_2020', 'women_2020', 'building_count']] = df[['elderly_60', 'general_pop', 'children_under5',\n", + " 'youth_15_24', 'men_2020', 'women_2020', 'building_count']].astype(int)" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "id": "70958d6f", + "metadata": {}, + "outputs": [], + "source": [ + "df.to_csv(DIR_DB_DATA / \"population.csv\", index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "id": "7bd03c85", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['cell_id', 'elderly_60', 'general_pop', 'children_under5',\n", + " 'youth_15_24', 'men_2020', 'women_2020', 'building_count'],\n", + " dtype='object')" + ] + }, + "execution_count": 132, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "beb29011", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/4k/7vm8r4rj2g90lf39dt0pqwbr0000gn/T/ipykernel_27417/1666416216.py:1: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df.rename(columns={'min': 'ntl_mean', 'max':'ntl_max', 'mean':'ntl_mean', 'count':'pixel_count','min':'ntl_min',\n" + ] + } + ], + "source": [ + "df.rename(columns={'min': 'ntl_mean', 'max':'ntl_max', 'mean':'ntl_mean', 'count':'pixel_count','min':'ntl_min',\n", + " 'sum':'ntl_sum', 'median':'ntl_median', 'raster':'raster_filename'}, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "id": "02902b6e", + "metadata": {}, + "outputs": [], + "source": [ + "df.to_csv(DIR_DB_DATA / \"ntl-annual-2012-2024.csv\", index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "id": "1c3f84ee", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cell_idminmaxmeancountsummedianrasteryear
0RWA.1.1.1.1_10.00.00.00260.00.00VNP46A4.A2012001.h20v09.001.2021124123213.tif2012
1RWA.1.1.1.2_10.00.00.00270.00.00VNP46A4.A2012001.h20v09.001.2021124123213.tif2012
2RWA.1.1.1.3_10.00.00.00270.00.00VNP46A4.A2012001.h20v09.001.2021124123213.tif2012
3RWA.1.1.1.4_10.00.00.00430.00.00VNP46A4.A2012001.h20v09.001.2021124123213.tif2012
4RWA.1.1.2.1_10.00.00.00640.00.00VNP46A4.A2012001.h20v09.001.2021124123213.tif2012
..............................
52051RWA.5.3.9.4_144.844.844.80144.844.80VNP46A4.A2023001.h21v09.001.2024022210517.tif2023
52052RWA.5.3.10.2_118.218.218.20118.218.20VNP46A4.A2023001.h21v09.001.2024022210517.tif2023
52053RWA.5.3.10.1_1NaNNaNNaN0NaNNaNVNP46A4.A2023001.h21v09.001.2024022210517.tif2023
52054RWA.5.3.10.3_131.333.132.20264.432.20VNP46A4.A2023001.h21v09.001.2024022210517.tif2023
52055RWA.5.3.10.4_122.025.123.55247.123.55VNP46A4.A2023001.h21v09.001.2024022210517.tif2023
\n", + "

52056 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " cell_id min max mean count sum median \\\n", + "0 RWA.1.1.1.1_1 0.0 0.0 0.00 26 0.0 0.00 \n", + "1 RWA.1.1.1.2_1 0.0 0.0 0.00 27 0.0 0.00 \n", + "2 RWA.1.1.1.3_1 0.0 0.0 0.00 27 0.0 0.00 \n", + "3 RWA.1.1.1.4_1 0.0 0.0 0.00 43 0.0 0.00 \n", + "4 RWA.1.1.2.1_1 0.0 0.0 0.00 64 0.0 0.00 \n", + "... ... ... ... ... ... ... ... \n", + "52051 RWA.5.3.9.4_1 44.8 44.8 44.80 1 44.8 44.80 \n", + "52052 RWA.5.3.10.2_1 18.2 18.2 18.20 1 18.2 18.20 \n", + "52053 RWA.5.3.10.1_1 NaN NaN NaN 0 NaN NaN \n", + "52054 RWA.5.3.10.3_1 31.3 33.1 32.20 2 64.4 32.20 \n", + "52055 RWA.5.3.10.4_1 22.0 25.1 23.55 2 47.1 23.55 \n", + "\n", + " raster year \n", + "0 VNP46A4.A2012001.h20v09.001.2021124123213.tif 2012 \n", + "1 VNP46A4.A2012001.h20v09.001.2021124123213.tif 2012 \n", + "2 VNP46A4.A2012001.h20v09.001.2021124123213.tif 2012 \n", + "3 VNP46A4.A2012001.h20v09.001.2021124123213.tif 2012 \n", + "4 VNP46A4.A2012001.h20v09.001.2021124123213.tif 2012 \n", + "... ... ... \n", + "52051 VNP46A4.A2023001.h21v09.001.2024022210517.tif 2023 \n", + "52052 VNP46A4.A2023001.h21v09.001.2024022210517.tif 2023 \n", + "52053 VNP46A4.A2023001.h21v09.001.2024022210517.tif 2023 \n", + "52054 VNP46A4.A2023001.h21v09.001.2024022210517.tif 2023 \n", + "52055 VNP46A4.A2023001.h21v09.001.2024022210517.tif 2023 \n", + "\n", + "[52056 rows x 9 columns]" + ] + }, + "execution_count": 117, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = df [['cell_id', 'min', 'max', 'mean', 'count', 'sum',\n", + " 'median', 'raster', 'year']]\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "0890e4f4", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv((DIR_DATA / \"population-demography/adm4-population-buildings.csv\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "1f17ba9a", + "metadata": {}, + "outputs": [], + "source": [ + "df2 = df[['cell_id', 'elderly_60', 'general_20', 'children_under5',\n", + " 'youth_15_24', 'men_2020', 'women_2020', 'building_count']]\n", + "df2.to_csv(DIR_DB_DATA / \"population.csv\", index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "id": "6064f752", + "metadata": {}, + "outputs": [], + "source": [ + "df[['cell_id', 'province_name', 'district_name', 'sector_name ',\n", + " 'cell_name']].to_csv(DIR_DB_DATA / \"cells.csv\", index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "id": "04d428dc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cell_idelderly_60general_popchildren_under5youth_15_24men_2020women_2020building_count
0RWA.1.1.1.1_12413855495758185020041435
1RWA.1.1.1.2_1229366947072017611907884
2RWA.1.1.1.3_11091756225345843913530
3RWA.1.1.1.4_131851746661016248226911512
4RWA.1.1.2.1_133560468331264288031662036
\n", + "
" + ], + "text/plain": [ + " cell_id elderly_60 general_pop children_under5 youth_15_24 \\\n", + "0 RWA.1.1.1.1_1 241 3855 495 758 \n", + "1 RWA.1.1.1.2_1 229 3669 470 720 \n", + "2 RWA.1.1.1.3_1 109 1756 225 345 \n", + "3 RWA.1.1.1.4_1 318 5174 666 1016 \n", + "4 RWA.1.1.2.1_1 335 6046 833 1264 \n", + "\n", + " men_2020 women_2020 building_count \n", + "0 1850 2004 1435 \n", + "1 1761 1907 884 \n", + "2 843 913 530 \n", + "3 2482 2691 1512 \n", + "4 2880 3166 2036 " + ] + }, + "execution_count": 133, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c560ded5", + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " VNP46A4_2024 = bm.raster(gdf, product_id=\"VNP46A4\",\n", + " date_range=(\"2024-01-01\", \"2024-12-31\"))\n", + "except KeyError as e:\n", + " if str(e) == \"'name'\":\n", + " raise RuntimeError(\n", + " \"No granules returned (empty manifest) or manifest schema changed. \"\n", + " \"Broaden date_range, check AOI/token, or upgrade blackmarble.\"\n", + " )\n", + " else:\n", + " raise\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "77002aa3", + "metadata": {}, + "outputs": [], + "source": [ + "# Annual data: raster for 2024\n", + "VNP46A4_2024 = bm.raster(\n", + " gdf,\n", + " product_id=\"VNP46A4\",\n", + " date_range=(\"2024-01-01\", \"2024-12-31\"),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a09881b9", + "metadata": {}, + "outputs": [], + "source": [ + "gdf = geopandas.read_file(\n", + " \"https://geodata.ucdavis.edu/gadm/gadm4.1/json/gadm41_GHA_1.json.zip\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "id": "8ddf9775", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 51912.000000\n", + "mean 3.579215\n", + "std 23.235693\n", + "min 0.000000\n", + "25% 0.000000\n", + "50% 0.000000\n", + "75% 0.000000\n", + "max 894.000000\n", + "Name: ntl_sum, dtype: float64" + ] + }, + "execution_count": 147, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_an.ntl_sum.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "id": "c9a76b45", + "metadata": {}, + "outputs": [], + "source": [ + "df_an = pd.read_csv(DIR_DB_DATA / \"ntl-annual-2012-2024.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "id": "797f2178", + "metadata": {}, + "outputs": [], + "source": [ + "df_an['id'] = df_an.index + 1" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "id": "f9e9f894", + "metadata": {}, + "outputs": [], + "source": [ + "df_an[['id', 'cell_id', 'ntl_min', 'ntl_max', 'ntl_mean', 'pixel_count', 'ntl_sum',\n", + " 'ntl_median', 'raster_filename', 'year']].to_csv(DIR_DB_DATA / \"annual.csv\", index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "id": "766e5c55", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['cell_id', 'ntl_min', 'ntl_max', 'ntl_mean', 'pixel_count', 'ntl_sum',\n", + " 'ntl_median', 'raster_filename', 'year', 'id'],\n", + " dtype='object')" + ] + }, + "execution_count": 143, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_an.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "id": "5dab55ee", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 150, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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NjJ9+nQzAFpnWwEAABQ55GgLzHPPPSfffvutCTV6Y0ANONpXqHSat8500psAauuOzoqaPXu293jtZlq1apWZTaXhp3z58iasTJgwwSuj08c10Og9d7QbTO/NM2/ePHMul3aNnT592txfR4OSTkdfu3btVYORAQBAyVWkkKP3wSmM3n1Y73mjy7XExsb+5Cyj9u3by549ewoto/fP0QUAAKAgfHcVAACwEiEHAABYiZADAACsRMgBAABWIuQAAAArEXIAAICVCDkAAMBKhBwAAGAlQg4AALASIQcAAFiJkAMAAKxEyAEAAFYi5AAAACsRcgAAgJUIOQAAwEqEHAAAYCVCDgAAsBIhBwAAWImQAwAArETIAQAAViLkAAAAKxFyAACAlQg5AADASoQcAABgJUIOAACwEiEHAABYiZADAACsRMgBAABWIuQAAAArEXIAAICVCDkAAMBKhBwAAGAlQg4AALASIQcAAFiJkAMAAKxEyAEAAFYi5AAAACsRcgAAgJUIOQAAwEqEHAAAYCVCDgAAsBIhBwAAWImQAwAArETIAQAAViLkAAAAKxFyAACAlQg5AADASoQcAABgJUIOAACwEiEHAABYiZADAACsRMgBAABWIuQAAAArEXIAAICVCDkAAMBKhBwAAGAlQg4AALASIQcAAFiJkAMAAKxEyAEAAFYi5AAAACsVKeQkJyfLfffdJxUrVpTq1avLE088IUeOHPErc/nyZUlMTJSqVatKhQoVpEePHnLq1Cm/MsePH5du3bpJuXLlzHlGjhwpV65c8SuzefNmadmypURGRkq9evVk4cKFV13PrFmzJC4uTqKioqRt27aSmppatFcPAACsVaSQs2XLFhNgtm/fLhs2bJCcnBzp0qWLXLx40SszfPhwWblypaxYscKUP3nypHTv3t07npubawJOdna2bNu2TRYtWmQCzJgxY7wyx44dM2U6dOgge/fulWHDhsmAAQNk3bp1Xplly5bJiBEjZOzYsbJ7925p1qyZJCQkSHp6+s2/KwAAoPhzbkJ6erqjp9iyZYvZzsjIcCIiIpwVK1Z4ZQ4dOmTKpKSkmO01a9Y44eHhTlpamldmzpw5TnR0tJOVlWW2R40a5TRq1MjvuXr27OkkJCR4223atHESExO97dzcXKdmzZpOcnLydV//2bNnzbXpOpCys7Od999/37nn5ZVO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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df_an.ntl_sum.hist(bins=100)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24ac01ca", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv-sp", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/module-5/intro-to-APIs.ipynb b/notebooks/module-5/intro-to-APIs.ipynb new file mode 100644 index 0000000..567debf --- /dev/null +++ b/notebooks/module-5/intro-to-APIs.ipynb @@ -0,0 +1,1544 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "WioWyjbZy1Y8" + }, + "source": [ + "\n", + "# Accessing APIs\n", + "\n", + "## Introduction\n", + "\n", + "This notebook will guide you through the fundamentals of accessing and working with web APIs using Python. APIs (Application Programming Interfaces) are essential tools for modern data science, allowing you to access real-time data from countless sources including government databases, weather services, financial markets, and research institutions.\n", + "\n", + "We'll work with real-world APIs to gather data about Rwanda, demonstrating practical techniques you can apply to any data science project. You'll learn to handle different types of APIs, from completely free services to those requiring authentication, while following professional best practices.\n", + "\n", + "### Why This Matters\n", + "\n", + "APIs are everywhere in modern data science. Whether you're building economic analysis dashboards, environmental monitoring systems, or social research platforms, the ability to programmatically access external data sources is crucial. This workshop teaches you not just how to make API calls, but how to do so reliably, ethically, and professionally.\n", + "\n", + "## Learning Outcomes\n", + "\n", + "By the end of this workshop, you will be able to:\n", + "\n", + "1. **Make successful API requests** using Python's `requests` library, handling different authentication methods and response formats\n", + "2. **Process and analyze JSON data** returned by APIs, converting it into pandas DataFrames for further analysis\n", + "3. **Implement professional practices** including error handling, rate limiting, retry logic, and proper credential management\n", + "4. **Work with multiple API types** from free government APIs to commercial services requiring API keys\n", + "5. **Combine data from multiple sources** to create comprehensive datasets for analysis\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rnDTWGbVy1ZA" + }, + "source": [ + "# Python Setup\n", + "Lets make sure we import the required libraries" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "executionInfo": { + "elapsed": 1308, + "status": "ok", + "timestamp": 1676355712059, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": -60 + }, + "id": "90gISwGey1ZA" + }, + "outputs": [], + "source": [ + "import os\n", + "from dotenv import load_dotenv\n", + "import requests\n", + "from matplotlib.pyplot import figure\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "import json\n", + "from IPython.display import Image" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "load_dotenv() # take environment variables from .env." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "P1OgIEvYy1ZC" + }, + "source": [ + "# Accessing a Useless API Just to Learn\n", + "The [Open Notify API](http://open-notify.org) is an open source project to provide a simple programming interface for some of NASA’s data related\n", + "space and spacecrafts. Even though this is a toy example, the process of using APIs is similar for any \n", + "API you will need to access in the future. For this tutorial, the task is to find the latest position of the Internation Space Station(ISS)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jtGizhjMy1ZE" + }, + "source": [ + "## Understanding The API\n", + "As mentioned during the introductory lecture, its important to read the API documentation \n", + "and understand the available **endpoints**. Also, to determine the exact endpoint for the data we are interested in getting.\n", + "- **Base URL:** For this API, the base url is: ```http://api.open-notify.org```. So, our full url which we will pass to requests will be ```base-url + endpoint```\n", + "- **Available Endpoints/Data:** You can check [here](http://open-notify.org/Open-Notify-API/) for avaible endpoints\n", + "- **Target Endpoint:** For our task, the endpoint is ```iss-now.json```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TIhr_FqXy1ZE" + }, + "source": [ + "## Making the Request\n", + "Now, lets request for the data. We create a simple function which makes the requests \n", + "and prints the status code to see if we got a good result." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "executionInfo": { + "elapsed": 2, + "status": "ok", + "timestamp": 1676355720957, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": -60 + }, + "id": "2W26MBZDy1ZF" + }, + "outputs": [], + "source": [ + "base_url = 'http://api.open-notify.org/'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "executionInfo": { + "elapsed": 4, + "status": "ok", + "timestamp": 1676355724874, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": -60 + }, + "id": "JIdqHoHty1ZF" + }, + "outputs": [], + "source": [ + "# endpoint for current position of ISS\n", + "pos_now = 'iss-now.json'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "executionInfo": { + "elapsed": 454, + "status": "ok", + "timestamp": 1676355734562, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": -60 + }, + "id": "-av0o7kVy1ZG", + "outputId": "b028759b-c0ae-4f79-e6a3-07e3813f5e88" + }, + "outputs": [], + "source": [ + "# base_url + endpoint = full url which we can use in requests.\n", + "full_url = base_url + pos_now\n", + "full_url" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "executionInfo": { + "elapsed": 545, + "status": "ok", + "timestamp": 1676355741426, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": -60 + }, + "id": "UGG5bl2ry1ZH" + }, + "outputs": [], + "source": [ + "# Make a request using requests package\n", + "response = requests.get(full_url)\n", + "print(response.status_code)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 3, + "status": "ok", + "timestamp": 1676355744242, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": -60 + }, + "id": "FiUgfAgey1ZI", + "outputId": "6a681363-ad39-4532-b54d-a508682efcf1" + }, + "outputs": [], + "source": [ + "response.status_code" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "F3N7CM4Py1ZI" + }, + "source": [ + "## Use json() to retrieve the json object/data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 554, + "status": "ok", + "timestamp": 1676355751619, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": -60 + }, + "id": "4iW9ywixy1ZJ", + "outputId": "88bbbba3-6dd1-4e71-f481-c1e8037d2937" + }, + "outputs": [], + "source": [ + "# Get the data\n", + "dict_obj_from_json = response.json()\n", + "type(dict_obj_from_json)\n", + "print(dict_obj_from_json),type(dict_obj_from_json)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dict_obj_from_json.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 472, + "status": "ok", + "timestamp": 1676355792404, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": -60 + }, + "id": "If79Qft-y1ZJ", + "outputId": "da8e8f38-baf9-483e-b8fd-a98d33768179" + }, + "outputs": [], + "source": [ + "geo_info = dict_obj_from_json['iss_position']\n", + "geo_info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 304, + "status": "ok", + "timestamp": 1676355802552, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": -60 + }, + "id": "wDUomxYWy1ZK", + "outputId": "13398c09-ace8-4c24-ab4a-b421a7aa7633" + }, + "outputs": [], + "source": [ + "lon = geo_info['longitude']\n", + "print(lon)\n", + "lat = geo_info['latitude']\n", + "print(lat)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 452, + "status": "ok", + "timestamp": 1676355809727, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": -60 + }, + "id": "IRGRizV5y1ZK", + "outputId": "c06f3727-2c96-4b22-9c6f-e59ddc452ccf" + }, + "outputs": [], + "source": [ + "geo_info = dict_obj_from_json['iss_position']\n", + "lon = geo_info['longitude']\n", + "lat = geo_info['latitude']\n", + "print(lat,'--', lon)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 324, + "status": "ok", + "timestamp": 1676355852267, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": -60 + }, + "id": "AUiikw8ay1ZL", + "outputId": "e97cd0fe-db3b-44b7-ab5e-f3b7450d8cd3" + }, + "outputs": [], + "source": [ + "base_url = 'http://api.open-notify.org/'\n", + "#endpoint for current position of ISS\n", + "pos_now = 'iss-now.json'\n", + "# Full url\n", + "full_url = base_url + pos_now\n", + "\n", + "\n", + "# Make a request using requests package\n", + "r = requests.get(full_url)\n", + "\n", + "# Get the data\n", + "dict_obj_from_json = r.json()\n", + "\n", + "# Extract Lat/Lon\n", + "geo_info = dict_obj_from_json['iss_position']\n", + "lon = geo_info['longitude']\n", + "lat = geo_info['latitude']\n", + "print(lat,'--', lon)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "code_folding": [ + 0 + ], + "executionInfo": { + "elapsed": 397, + "status": "ok", + "timestamp": 1676355873977, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": -60 + }, + "id": "7tld9iMgy1ZM" + }, + "outputs": [], + "source": [ + "def request_iss_position(endpoint_url=None):\n", + " # Make a get request \n", + " response = requests.get(endpoint_url)\n", + "\n", + " # Print the status code of the response.\n", + " status_code = response.status_code\n", + " if status_code == 200:\n", + " print('Hooray!!, it worked')\n", + " \n", + " # access the returned data\n", + " dict_obj_from_json = response.json()\n", + " print('Type: {}'.format(type(dict_obj_from_json)))\n", + " print('This is the nested dictionary returned: \\n {}'.format(dict_obj_from_json))\n", + " lat = dict_obj_from_json['iss_position']['latitude']\n", + " lon = dict_obj_from_json['iss_position']['longitude']\n", + " print('ISS is passing on Lat: {}, and Lon: {} right about now'.format(lat, lon))\n", + " else:\n", + " print('What happened, lets see the code we got: {}'.format(status_code))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 516, + "status": "ok", + "timestamp": 1675397180435, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": 480 + }, + "id": "5kTLElRIy1ZM", + "outputId": "009d6af7-a92f-4b24-b2d7-4fe6e117a8c4" + }, + "outputs": [], + "source": [ + "base_url = 'http://api.open-notify.org/'\n", + "iss_pos = base_url + 'iss-now.json'\n", + "request_iss_position(endpoint_url=iss_pos)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 3, + "status": "ok", + "timestamp": 1675397182738, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": 480 + }, + "id": "eUTXnt5my1ZM", + "outputId": "bc23a02c-783c-4d34-c2b5-7c8e27661ee5" + }, + "outputs": [], + "source": [ + "# Now, try to enter a wrong endpoint and see what happens\n", + "iss_pos2 = base_url + 'iss-today.json'\n", + "request_iss_position(endpoint_url=iss_pos2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gOZbdoOyy1ZN" + }, + "source": [ + "# Accessing the Data\n", + "Now, lets change our function so that we print the Latitude and Longitude of where ISS is right now." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 1208, + "status": "ok", + "timestamp": 1676355892406, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": -60 + }, + "id": "XnVOmqLey1ZN", + "outputId": "9ddc5b09-a010-470b-eab8-a47e7902959f" + }, + "outputs": [], + "source": [ + "request_iss_position(endpoint_url='http://api.open-notify.org/iss-now.json')\n", + "request_iss_position" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "O2Y7O61ky1ZN" + }, + "source": [ + "# EXERCISE-1:\n", + "Using the same API, check how many Astronouts are in space right now?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "code_folding": [ + 0 + ], + "colab": { + "base_uri": "https://localhost:8080/", + "height": 235 + }, + "executionInfo": { + "elapsed": 486, + "status": "error", + "timestamp": 1675397797196, + "user": { + "displayName": "Michael Nana Kameni", + "userId": "10368762142761029516" + }, + "user_tz": 480 + }, + "id": "I5IDdQP3y1ZO", + "outputId": "998a323a-a991-4848-d868-1714b950e26a" + }, + "outputs": [], + "source": [ + "# base-url is same as above\n", + "# end point for this data: please check documentation\n", + "num_astros = 'http://api.open-notify.org/astros.json'\n", + "\n", + "# full_url number of astronouts\n", + "num_astros_url =\"http://api.open-notify.org/astros.json?callback=CALLBACK\" \n", + " \n", + "# Make request\n", + "response = requests.get(num_astros_url)\n", + "\n", + "# Get data if response is 200\n", + "if response.status_code == 200:\n", + " # Extract the dict object from the JSON response\n", + " res = response.json().loads(response)\n", + " \n", + " # please print the dict object above so you can inspect it and see how to retrieve the required data\n", + " print(res)\n", + " \n", + " # Get the number of people in spacw\n", + " #YOUR CODE\n", + " \n", + " # print number of people\n", + " #YOUR CODE" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WArb3fRky1ZO" + }, + "source": [ + "# Accessing the Open Weather API\n", + "## About the API\n", + "You can read all about it [here](https://openweathermap.org). In summary, they provide weather data for cities across the world. When you read the API documentation there are several things you need to be aware of and check as follows:\n", + "1. How to get credentials to enable access to the API. We only need an API key in this case. Did you get yours?\n", + "2. How to make API calls. What type of parameters are required to make and API call to this particular API. In this case, you will note that you will need location.\n", + "3. What type of information is available\n", + "4. Whats the cost of accessing the data. If free, are there any limits.\n", + "\n", + "## Potential Use Cases\n", + "1. **A Weather app on a Smartphone.** Extract data from the API and use it on your app\n", + "\n", + "2. **Historical climate data analysisis for multiple cities.** With climate change being a big thing now, you may want to do analysis comparing weather information across multiple cities.\n", + "\n", + "The API has many versions and subscriptions plans but in our exercise, we will use their 2.5 version which is the one which doesnt require subscription." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example Task: Get current weather data and forecasts for a given city or multiple cities\n", + "Given a city name, lets get current weather data and forecasts and then save that information as a CSV file. \n", + "We are only interested in the following variables:\n", + "- **Weather:** temp, min and max temperature, humidity\n", + "- **Other:** Date, with no time\n", + "\n", + "### Approach\n", + "We will achieve this by defining three main functions:\n", + "1. A small helper function to retrieve city ID from given city name just because using ID is easier than name\n", + "2. A function to make thr API call and retrieve the weather data\n", + "3. A function to take the returned data, put it into a pandas dataframe.\n", + "4. A function putting everything together " + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "code_folding": [ + 0 + ], + "id": "OCai_fwxy1ZO" + }, + "outputs": [], + "source": [ + "def get_weather(base_url, category='forecast', api_key=None, city_id=None, lat=None, lon=None):\n", + " \"\"\"\n", + " Use request to make a get request to the open weather API\n", + " :param api_key: This is taken from the API documentation\n", + " :param category: Wether to get current weather, forecast or other type. Check API docs for details.\n", + " :param city_id: ID for the city we need taken from the city.list.json provided by the API\n", + " :param api_key: The API key you got from the API \n", + " :param lon: Longitude in case we want to use latitude and longitude\n", + " :param lat: Latitude in case we want to use latitude and longitude\n", + " \n", + " :return: A JSON oobject with the data\n", + " \"\"\"\n", + " # Create full_url based on whether we are using lat/lon, city ID\n", + " if city_id:\n", + " full_url = \"{}{}?id={}&APPID={}\".format(base_url, category, city_id, api_key)\n", + " \n", + " # use requests to retrieve data from the API\n", + " response = requests.get(full_url)\n", + "\n", + " # retrieve JSON from the response object\n", + " if response.status_code == 200:\n", + " json_obj = response.json()\n", + " else:\n", + " print('Something went wrong, see error below')\n", + " print(response.status_code)\n", + "\n", + " # return the JSON object\n", + " return json_obj" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "def city_id_from_name(city_file, name):\n", + " \"\"\"\n", + " Retrieve city ID given city name\n", + " :param city_file: JSON file with list of city names and corresponding IDs provided by open weather API\n", + " :param name: Name of city which we want to retrieve ID for\n", + " :return: An integer representing city ID\n", + " \"\"\"\n", + " # Load JSON file\n", + " fopen = open(city_file, encoding=\"utf8\")\n", + " city_list = json.load(fopen)\n", + " \n", + " # Get city ID which matches with city name\n", + " for c in city_list:\n", + " if c['name'] == name:\n", + " return c['id'] " + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "def weather_json_to_pandas_df(weather_json):\n", + " \"\"\"\n", + " Converts the JSON with weather data into a pandas Dataframe\n", + " :param weather_json:The JSON object with weather information\n", + " :return: A pandas Dataframe\n", + " \"\"\"\n", + " \n", + " # using method for accessing a dictionary\n", + " # put weather items in a list\n", + " weather_items = weather_json['list']\n", + " \n", + " # save into a dataframe\n", + " data = [] # will hold our data\n", + " \n", + " for i in weather_items:\n", + " # get forecast time and truncate to date only\n", + " date_str = i['dt_txt'][:10]\n", + " \n", + " # get temperature, rain and humidity\n", + " temp = i['main']['temp']\n", + " temp_min = i['main']['temp_min']\n", + " temp_max = i['main']['temp_max']\n", + " hum = i['main']['humidity']\n", + " \n", + " data_item = {'Date': date_str, 'tempF': temp,'tempF_min': temp_min, \n", + " 'tempF_max': temp_min, 'humidity': hum}\n", + " \n", + " # append to list of create earlier on\n", + " data.append(data_item)\n", + " \n", + "\n", + " # create dataframe\n", + " df = pd.DataFrame(data)\n", + " \n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "def save_weather_data(city_name, csv_filename, city_list_file):\n", + " \"\"\"\n", + " Puts everything together and saves weather into CSV file\n", + " :param city_name: Target city name\n", + " :param csv_filename: Full path of CSV filen to save data\n", + " :param city_list_file: File containing city names and IDs\n", + " :return: Saves data into CSV\n", + " \"\"\"\n", + " # ==============================\n", + " # GET WEATHER DATA\n", + " # ==============================\n", + " # Retrieve city ID and get data\n", + " cityid = city_id_from_name(city_list_file, city_name)\n", + " print('City-ID for {} is {}'.format(city_name, cityid))\n", + " \n", + " weather_data = get_weather(base_url=BASE_URL, api_key=API_KEY,\n", + " city_id=cityid)\n", + " \n", + " # Put data into Pandas Dataframe\n", + " df = weather_json_to_pandas_df(weather_json=weather_data)\n", + " \n", + " # Add city name \n", + " df['City'] = city_name\n", + " print()\n", + " print('First few rows of the data')\n", + " print(df.head())\n", + " \n", + " # Save data into CSV\n", + " df.to_csv(city_name, index=False)\n", + " \n", + " print()\n", + " print('Successfully Saved CSV file')\n", + " print(\"============================\")\n", + " \n", + " return df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simple Request on Weather API Using City Name\n", + "- ```BASE_URL: https://api.openweathermap.org/data/2.5/```\n", + "### Parameters:\n", + "- version: 2.5 for free plans\n", + "- category: weather \n", + " - weather (current weather by city)\n", + " - forecast (up to 16 days forecast)\n", + "- Location (city name, lat/lon, city id)\n", + "- API key" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://api.openweathermap.org/data/2.5/weather?q=Kigali&APPID=15b6dcf6a90d01c149cd46da48646612\n", + "Status: 200\n", + "Body: {\"coord\":{\"lon\":30.0588,\"lat\":-1.95},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"base\":\"stations\",\"main\":{\"temp\":299.11,\"feels_like\":299.11,\"temp_min\":299.11,\"temp_max\":299.86,\"pressure\":1010,\"humidity\":47,\"sea_level\":1010,\"grnd_level\":849},\"visibility\":10000,\"wind\":{\"speed\":3.09,\"deg\":160},\"rain\":{\"1h\":0.2},\"clouds\":{\"all\":40},\"dt\":1758112628,\"sys\":{\"type\":2,\"id\":47683,\"country\":\"RW\",\"sunrise\":1758081081,\"sunset\":1758124644},\"timezone\":7200,\"id\":202061,\"name\":\"Kigali\",\"cod\":200}\n" + ] + } + ], + "source": [ + "# ========================================================\n", + "# HARD CODE BASE INFORMAITON AND USE THEM AS GLOBAL VARS\n", + "# ========================================================\n", + "# Harcode base URL, we use the 2.5 version which seems to be the free version with no need to subscribe\n", + "BASE_URL = \"https://api.openweathermap.org/data/2.5/\"\n", + "\n", + "API_KEY = os.getenv(\"OPENWEATHER_API_KEY\")\n", + "\n", + "# Create full URL for current weather in Kigali\n", + "category = 'weather'\n", + "city_name = \"Kigali\"\n", + "full_url = \"{}{}?q={}&APPID={}\".format(BASE_URL, category, city_name, API_KEY)\n", + "print(full_url)\n", + "\n", + "\n", + "# Send request\n", + "response = requests.get(full_url)\n", + "print(\"Status:\", response.status_code)\n", + "print(\"Body:\", response.text) # if 401, body text is usually explicit\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'coord': {'lon': 30.0588, 'lat': -1.95}, 'weather': [{'id': 500, 'main': 'Rain', 'description': 'light rain', 'icon': '10d'}], 'base': 'stations', 'main': {'temp': 299.11, 'feels_like': 299.11, 'temp_min': 299.11, 'temp_max': 299.86, 'pressure': 1010, 'humidity': 47, 'sea_level': 1010, 'grnd_level': 849}, 'visibility': 10000, 'wind': {'speed': 3.09, 'deg': 160}, 'rain': {'1h': 0.2}, 'clouds': {'all': 40}, 'dt': 1758112628, 'sys': {'type': 2, 'id': 47683, 'country': 'RW', 'sunrise': 1758081081, 'sunset': 1758124644}, 'timezone': 7200, 'id': 202061, 'name': 'Kigali', 'cod': 200}\n" + ] + } + ], + "source": [ + "weather_today_kigali = response.json()\n", + "print(weather_today_kigali)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "299.11" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "weather_today_kigali['main']['temp'] # temperature in Kelvin\n" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Temperature in Kigali:\n", + "Kelvin: 299.11K\n", + "Celsius: 25.96°C\n" + ] + } + ], + "source": [ + "# Get temperature in Kelvin from the weather data\n", + "temp_kelvin = weather_today_kigali['main']['temp']\n", + "\n", + "# Convert to Celsius (K - 273.15)\n", + "temp_celsius = temp_kelvin - 273.15\n", + "\n", + "print(f\"Temperature in Kigali:\")\n", + "print(f\"Kelvin: {temp_kelvin:.2f}K\")\n", + "print(f\"Celsius: {temp_celsius:.2f}°C\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1758112628" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "weather_today_kigali['dt']\n" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Weather data timestamp: 2025-09-17 14:37:08\n" + ] + } + ], + "source": [ + "from datetime import datetime\n", + "\n", + "# Get timestamp from weather data\n", + "timestamp = weather_today_kigali['dt']\n", + "\n", + "# Convert to datetime object and format\n", + "readable_time = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')\n", + "print(f\"Weather data timestamp: {readable_time}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['coord', 'weather', 'base', 'main', 'visibility', 'wind', 'rain', 'clouds', 'dt', 'sys', 'timezone', 'id', 'name', 'cod'])" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "weather_today_kigali.keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Use Functions to Get 16 Days Forecast" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "City-ID for Lilongwe is 927967\n", + "\n", + "First few rows of the data\n", + " Date tempF tempF_min tempF_max humidity City\n", + "0 2025-09-17 303.76 302.75 302.75 28 Lilongwe\n", + "1 2025-09-17 300.53 298.67 298.67 29 Lilongwe\n", + "2 2025-09-17 296.70 296.70 296.70 38 Lilongwe\n", + "3 2025-09-18 295.66 295.66 295.66 40 Lilongwe\n", + "4 2025-09-18 294.35 294.35 294.35 42 Lilongwe\n", + "\n", + "Successfully Saved CSV file\n", + "============================\n" + ] + } + ], + "source": [ + "# =======================================\n", + "# GET WEATHER FORECAST DATA FOR LILONGWE\n", + "# =======================================\n", + "city = 'Kigali'\n", + "city_json = \"/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/data/city.list.json\"\n", + "out_csv = \"LL-weather.csv\"\n", + "df_weather = save_weather_data(city_name=city, csv_filename=out_csv, city_list_file=city_json)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
DatetempFtempF_mintempF_maxhumidityCity
02025-09-17303.76302.75302.7528Lilongwe
12025-09-17300.53298.67298.6729Lilongwe
22025-09-17296.70296.70296.7038Lilongwe
32025-09-18295.66295.66295.6640Lilongwe
42025-09-18294.35294.35294.3542Lilongwe
52025-09-18298.68298.68298.6835Lilongwe
62025-09-18303.05303.05303.0526Lilongwe
72025-09-18304.92304.92304.9219Lilongwe
82025-09-18302.98302.98302.9825Lilongwe
92025-09-18299.11299.11299.1137Lilongwe
102025-09-18297.49297.49297.4941Lilongwe
112025-09-19296.22296.22296.2244Lilongwe
122025-09-19295.55295.55295.5551Lilongwe
132025-09-19298.45298.45298.4544Lilongwe
142025-09-19302.87302.87302.8733Lilongwe
152025-09-19304.59304.59304.5925Lilongwe
162025-09-19303.54303.54303.5425Lilongwe
172025-09-19300.00300.00300.0033Lilongwe
182025-09-19298.37298.37298.3742Lilongwe
192025-09-20296.72296.72296.7251Lilongwe
202025-09-20294.82294.82294.8264Lilongwe
212025-09-20297.30297.30297.3053Lilongwe
222025-09-20302.43302.43302.4334Lilongwe
232025-09-20304.02304.02304.0227Lilongwe
242025-09-20302.95302.95302.9525Lilongwe
252025-09-20299.69299.69299.6929Lilongwe
262025-09-20297.17297.17297.1736Lilongwe
272025-09-21295.09295.09295.0943Lilongwe
282025-09-21294.46294.46294.4648Lilongwe
292025-09-21297.50297.50297.5044Lilongwe
302025-09-21302.24302.24302.2430Lilongwe
312025-09-21304.35304.35304.3522Lilongwe
322025-09-21302.92302.92302.9224Lilongwe
332025-09-21299.48299.48299.4831Lilongwe
342025-09-21297.42297.42297.4234Lilongwe
352025-09-22295.52295.52295.5241Lilongwe
362025-09-22294.48294.48294.4846Lilongwe
372025-09-22297.88297.88297.8842Lilongwe
382025-09-22302.89302.89302.8929Lilongwe
392025-09-22304.98304.98304.9822Lilongwe
\n", + "
" + ], + "text/plain": [ + " Date tempF tempF_min tempF_max humidity City\n", + "0 2025-09-17 303.76 302.75 302.75 28 Lilongwe\n", + "1 2025-09-17 300.53 298.67 298.67 29 Lilongwe\n", + "2 2025-09-17 296.70 296.70 296.70 38 Lilongwe\n", + "3 2025-09-18 295.66 295.66 295.66 40 Lilongwe\n", + "4 2025-09-18 294.35 294.35 294.35 42 Lilongwe\n", + "5 2025-09-18 298.68 298.68 298.68 35 Lilongwe\n", + "6 2025-09-18 303.05 303.05 303.05 26 Lilongwe\n", + "7 2025-09-18 304.92 304.92 304.92 19 Lilongwe\n", + "8 2025-09-18 302.98 302.98 302.98 25 Lilongwe\n", + "9 2025-09-18 299.11 299.11 299.11 37 Lilongwe\n", + "10 2025-09-18 297.49 297.49 297.49 41 Lilongwe\n", + "11 2025-09-19 296.22 296.22 296.22 44 Lilongwe\n", + "12 2025-09-19 295.55 295.55 295.55 51 Lilongwe\n", + "13 2025-09-19 298.45 298.45 298.45 44 Lilongwe\n", + "14 2025-09-19 302.87 302.87 302.87 33 Lilongwe\n", + "15 2025-09-19 304.59 304.59 304.59 25 Lilongwe\n", + "16 2025-09-19 303.54 303.54 303.54 25 Lilongwe\n", + "17 2025-09-19 300.00 300.00 300.00 33 Lilongwe\n", + "18 2025-09-19 298.37 298.37 298.37 42 Lilongwe\n", + "19 2025-09-20 296.72 296.72 296.72 51 Lilongwe\n", + "20 2025-09-20 294.82 294.82 294.82 64 Lilongwe\n", + "21 2025-09-20 297.30 297.30 297.30 53 Lilongwe\n", + "22 2025-09-20 302.43 302.43 302.43 34 Lilongwe\n", + "23 2025-09-20 304.02 304.02 304.02 27 Lilongwe\n", + "24 2025-09-20 302.95 302.95 302.95 25 Lilongwe\n", + "25 2025-09-20 299.69 299.69 299.69 29 Lilongwe\n", + "26 2025-09-20 297.17 297.17 297.17 36 Lilongwe\n", + "27 2025-09-21 295.09 295.09 295.09 43 Lilongwe\n", + "28 2025-09-21 294.46 294.46 294.46 48 Lilongwe\n", + "29 2025-09-21 297.50 297.50 297.50 44 Lilongwe\n", + "30 2025-09-21 302.24 302.24 302.24 30 Lilongwe\n", + "31 2025-09-21 304.35 304.35 304.35 22 Lilongwe\n", + "32 2025-09-21 302.92 302.92 302.92 24 Lilongwe\n", + "33 2025-09-21 299.48 299.48 299.48 31 Lilongwe\n", + "34 2025-09-21 297.42 297.42 297.42 34 Lilongwe\n", + "35 2025-09-22 295.52 295.52 295.52 41 Lilongwe\n", + "36 2025-09-22 294.48 294.48 294.48 46 Lilongwe\n", + "37 2025-09-22 297.88 297.88 297.88 42 Lilongwe\n", + "38 2025-09-22 302.89 302.89 302.89 29 Lilongwe\n", + "39 2025-09-22 304.98 304.98 304.98 22 Lilongwe" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_weather" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eZknSpF3y1ZP" + }, + "source": [ + "## EXERCISE-1: Instead of using city ID, lets use latitude and longitude to get the same information.\n", + "\n", + "### Task description:\n", + "- Modify the ```get_weather()``` so that it takes in latitude and longitude and returns today's temperature in degress Celsius.\n", + "- To test your function, get current weather data for 'lon': 30.1289, 'lat': -1.9695 and print out the **temperature, place name and country**. The result will look like screenshot below.\n", + "\n", + "### Tips:\n", + "- Go to the API documentation to find out how to use lat and lon in the API call\n", + "- Also, use the API documentation to check how to change the units " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={API key}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/module-dividers/module1.md b/notebooks/module-dividers/module1.md deleted file mode 100644 index 2039135..0000000 --- a/notebooks/module-dividers/module1.md +++ /dev/null @@ -1,8 +0,0 @@ -# Module 1: Python Foundations - -This module covers the fundamentals of Python programming for data science. - -## Notebooks in this section: - -- **Assignment 1**: Practice problems for Python foundations -- **Assignment 1 Solutions**: Solutions to the practice problems diff --git a/notebooks/module-dividers/module2.md b/notebooks/module-dividers/module2.md deleted file mode 100644 index 597c289..0000000 --- a/notebooks/module-dividers/module2.md +++ /dev/null @@ -1,9 +0,0 @@ -# Module 2: Data Analysis - -This module covers data analysis techniques using pandas and other Python libraries. - -## Notebooks in this section: - -- **Pandas Basics**: Introduction to pandas for data manipulation -- **Data Processing with Pandas**: Advanced data processing techniques -- **Statistical Analysis with Python**: Statistical methods and analysis diff --git a/notebooks/module-dividers/module3.md b/notebooks/module-dividers/module3.md deleted file mode 100644 index 79c3adb..0000000 --- a/notebooks/module-dividers/module3.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module 3: Spatial Data - -This module covers working with spatial data in Python. - -## Notebooks in this section: - -- **Assessment Instructions**: Instructions for the spatial data assessment diff --git a/notebooks/module1.md b/notebooks/module1.md deleted file mode 100644 index 57a308e..0000000 --- a/notebooks/module1.md +++ /dev/null @@ -1,8 +0,0 @@ -# Module 1: Python Foundations - -This module covers the fundamentals of Python programming for data science. - -## Contents - -- Assignment 1 -- Assignment 1 Solutions diff --git a/notebooks/module2.md b/notebooks/module2.md deleted file mode 100644 index 4572152..0000000 --- a/notebooks/module2.md +++ /dev/null @@ -1,9 +0,0 @@ -# Module 2: Data Analysis - -This module covers data analysis techniques using pandas and other Python libraries. - -## Contents - -- Pandas Basics -- Data Processing with Pandas -- Statistical Analysis with Python diff --git a/notebooks/module3.md b/notebooks/module3.md deleted file mode 100644 index efb4890..0000000 --- a/notebooks/module3.md +++ /dev/null @@ -1,7 +0,0 @@ -# Module 3: Spatial Data - -This module covers working with spatial data in Python. - -## Contents - -- Assessment Instructions diff --git a/requirements-llms.txt b/requirements-llms.txt new file mode 100644 index 0000000..aefbd83 --- /dev/null +++ b/requirements-llms.txt @@ -0,0 +1,180 @@ +aiohappyeyeballs==2.6.1 +aiohttp==3.12.15 +aiosignal==1.4.0 +annotated-types==0.7.0 +anyio==4.10.0 +appnope==0.1.4 +argon2-cffi==25.1.0 +argon2-cffi-bindings==25.1.0 +arrow==1.3.0 +asttokens==3.0.0 +async-lru==2.0.5 +attrs==25.3.0 +audioop-lts==0.2.2 +audioread==3.0.1 +babel==2.17.0 +beautifulsoup4==4.13.4 +bleach==6.2.0 +bs4==0.0.2 +certifi==2025.8.3 +cffi==1.17.1 +charset-normalizer==3.4.3 +comm==0.2.3 +dataclasses-json==0.6.7 +datasets==4.0.0 +debugpy==1.8.16 +decorator==5.2.1 +defusedxml==0.7.1 +dill==0.3.8 +distro==1.9.0 +executing==2.2.0 +fastjsonschema==2.21.2 +filelock==3.19.1 +fqdn==1.5.1 +frozenlist==1.7.0 +fsspec==2025.3.0 +h11==0.16.0 +hf-xet==1.1.8 +httpcore==1.0.9 +httpx==0.28.1 +httpx-sse==0.4.1 +huggingface-hub==0.34.4 +idna==3.10 +imageio==2.37.0 +imageio-ffmpeg==0.6.0 +ipykernel==6.30.1 +ipython==9.4.0 +ipython_pygments_lexers==1.1.1 +isoduration==20.11.0 +jedi==0.19.2 +Jinja2==3.1.6 +jiter==0.10.0 +joblib==1.5.2 +json5==0.12.1 +jsonpatch==1.33 +jsonpointer==3.0.0 +jsonschema==4.25.1 +jsonschema-specifications==2025.4.1 +jupyter-events==0.12.0 +jupyter-lsp==2.2.6 +jupyter_client==8.6.3 +jupyter_core==5.8.1 +jupyter_server==2.17.0 +jupyter_server_terminals==0.5.3 +jupyterlab==4.4.6 +jupyterlab_pygments==0.3.0 +jupyterlab_server==2.27.3 +langchain==0.3.27 +langchain-community==0.3.27 +langchain-core==0.3.74 +langchain-openai==0.3.31 +langchain-text-splitters==0.3.9 +langgraph==0.6.6 +langgraph-checkpoint==2.1.1 +langgraph-prebuilt==0.6.4 +langgraph-sdk==0.2.3 +langsmith==0.4.16 +lark==1.2.2 +lazy_loader==0.4 +librosa==0.11.0 +llvmlite==0.44.0 +MarkupSafe==3.0.2 +marshmallow==3.26.1 +matplotlib-inline==0.1.7 +mistune==3.1.3 +moviepy==2.2.1 +mpmath==1.3.0 +msgpack==1.1.1 +multidict==6.6.4 +multiprocess==0.70.16 +mypy_extensions==1.1.0 +nbclient==0.10.2 +nbconvert==7.16.6 +nbformat==5.10.4 +nest-asyncio==1.6.0 +networkx==3.5 +notebook==7.4.5 +notebook_shim==0.2.4 +numba==0.61.2 +numpy==2.2.6 +openai==1.101.0 +orjson==3.11.2 +ormsgpack==1.10.0 +packaging==25.0 +pandas==2.3.2 +pandocfilters==1.5.1 +parso==0.8.5 +pexpect==4.9.0 +pillow==11.3.0 +platformdirs==4.3.8 +pooch==1.8.2 +proglog==0.1.12 +prometheus_client==0.22.1 +prompt_toolkit==3.0.51 +propcache==0.3.2 +psutil==7.0.0 +ptyprocess==0.7.0 +pure_eval==0.2.3 +pyarrow==21.0.0 +pycparser==2.22 +pydantic==2.11.7 +pydantic-settings==2.10.1 +pydantic_core==2.33.2 +pydub==0.25.1 +Pygments==2.19.2 +pypdf==6.0.0 +python-dateutil==2.9.0.post0 +python-dotenv==1.1.1 +python-json-logger==3.3.0 +pytz==2025.2 +PyYAML==6.0.2 +pyzmq==27.0.2 +referencing==0.36.2 +regex==2025.7.34 +requests==2.32.5 +requests-toolbelt==1.0.0 +rfc3339-validator==0.1.4 +rfc3986-validator==0.1.1 +rfc3987-syntax==1.1.0 +rpds-py==0.27.0 +safetensors==0.6.2 +scikit-learn==1.7.1 +scipy==1.16.1 +Send2Trash==1.8.3 +setuptools==80.9.0 +six==1.17.0 +sniffio==1.3.1 +soundfile==0.13.1 +soupsieve==2.7 +soxr==0.5.0.post1 +SQLAlchemy==2.0.43 +stack-data==0.6.3 +standard-aifc==3.13.0 +standard-chunk==3.13.0 +standard-sunau==3.13.0 +sympy==1.14.0 +tenacity==9.1.2 +terminado==0.18.1 +threadpoolctl==3.6.0 +tiktoken==0.11.0 +tinycss2==1.4.0 +tokenizers==0.21.4 +torch==2.8.0 +tornado==6.5.2 +tqdm==4.67.1 +traitlets==5.14.3 +transformers==4.55.4 +types-python-dateutil==2.9.0.20250822 +typing-inspect==0.9.0 +typing-inspection==0.4.1 +typing_extensions==4.14.1 +tzdata==2025.2 +uri-template==1.3.0 +urllib3==2.5.0 +wcwidth==0.2.13 +webcolors==24.11.1 +webencodings==0.5.1 +websocket-client==1.8.0 +xxhash==3.5.0 +yarl==1.20.1 +zstandard==0.24.0 diff --git a/requirements-spatial.txt b/requirements-spatial.txt new file mode 100644 index 0000000..4814902 --- /dev/null +++ b/requirements-spatial.txt @@ -0,0 +1,107 @@ +affine==2.4.0 +aiohappyeyeballs==2.6.1 +aiohttp==3.12.15 +aiosignal==1.4.0 +annotated-types==0.7.0 +anyio==4.10.0 +appnope==0.1.4 +asttokens==3.0.0 +attrs==25.3.0 +blackmarblepy==2025.6.3 +bokeh==3.8.0 +bounded-pool-executor==0.0.3 +branca==0.8.1 +certifi==2025.8.3 +charset-normalizer==3.4.3 +click==8.2.1 +click-plugins==1.1.1.2 +cligj==0.7.2 +colorcet==3.1.0 +comm==0.2.3 +contextily==1.6.2 +contourpy==1.3.3 +cycler==0.12.1 +debugpy==1.8.16 +decorator==5.2.1 +executing==2.2.1 +fiona==1.10.1 +folium==0.20.0 +fonttools==4.59.2 +frozenlist==1.7.0 +geographiclib==2.1 +geopandas==1.1.1 +geopy==2.4.1 +h11==0.16.0 +h5py==3.14.0 +httpcore==1.0.9 +httpx==0.28.1 +humanize==4.13.0 +idna==3.10 +importlib_metadata==8.7.0 +ipykernel==6.30.1 +ipython==9.5.0 +ipython_pygments_lexers==1.1.1 +ipywidgets==8.1.7 +jedi==0.19.2 +Jinja2==3.1.6 +joblib==1.5.2 +jupyter_client==8.6.3 +jupyter_core==5.8.1 +jupyterlab_widgets==3.0.15 +kiwisolver==1.4.9 +MarkupSafe==3.0.2 +matplotlib==3.10.6 +matplotlib-inline==0.1.7 +mercantile==1.2.1 +multidict==6.6.4 +narwhals==2.4.0 +nest-asyncio==1.6.0 +numpy==2.3.3 +packaging==25.0 +pandas==2.3.2 +parso==0.8.5 +pexpect==4.9.0 +pillow==11.3.0 +platformdirs==4.4.0 +pqdm==0.2.0 +prompt_toolkit==3.0.52 +propcache==0.3.2 +psutil==7.0.0 +ptyprocess==0.7.0 +pure_eval==0.2.3 +pydantic==2.11.7 +pydantic_core==2.33.2 +Pygments==2.19.2 +pyogrio==0.11.1 +pyparsing==3.2.3 +pyproj==3.7.2 +python-dateutil==2.9.0.post0 +python-dotenv==1.1.1 +pytz==2025.2 +PyYAML==6.0.2 +pyzmq==27.1.0 +rasterio==1.4.3 +rasterstats==0.20.0 +requests==2.32.5 +rioxarray==0.17.0 +setuptools==80.9.0 +shapely==2.1.1 +simplejson==3.20.1 +six==1.17.0 +sniffio==1.3.1 +stack-data==0.6.3 +tenacity==9.1.2 +tornado==6.5.2 +tqdm==4.67.1 +traitlets==5.14.3 +typing-inspection==0.4.1 +typing_extensions==4.15.0 +tzdata==2025.2 +urllib3==2.5.0 +watermark==2.5.0 +wcwidth==0.2.13 +widgetsnbextension==4.0.14 +xarray==2025.9.0 +xyzservices==2025.4.0 +yarl==1.20.1 +zipp==3.23.0 diff --git a/requirements.txt b/requirements.txt index d89119e..aefbd83 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,180 @@ -docutils>=0.18.1 -sphinx>=7.0.0 -myst-parser>=2.0.0 -jupyter-book>=0.15.0 -sphinx-book-theme>=1.0.0 -sphinx-multitoc-numbering>=0.1.3 -sphinx-external-toc>=0.3.1 +aiohappyeyeballs==2.6.1 +aiohttp==3.12.15 +aiosignal==1.4.0 +annotated-types==0.7.0 +anyio==4.10.0 +appnope==0.1.4 +argon2-cffi==25.1.0 +argon2-cffi-bindings==25.1.0 +arrow==1.3.0 +asttokens==3.0.0 +async-lru==2.0.5 +attrs==25.3.0 +audioop-lts==0.2.2 +audioread==3.0.1 +babel==2.17.0 +beautifulsoup4==4.13.4 +bleach==6.2.0 +bs4==0.0.2 +certifi==2025.8.3 +cffi==1.17.1 +charset-normalizer==3.4.3 +comm==0.2.3 +dataclasses-json==0.6.7 +datasets==4.0.0 +debugpy==1.8.16 +decorator==5.2.1 +defusedxml==0.7.1 +dill==0.3.8 +distro==1.9.0 +executing==2.2.0 +fastjsonschema==2.21.2 +filelock==3.19.1 +fqdn==1.5.1 +frozenlist==1.7.0 +fsspec==2025.3.0 +h11==0.16.0 +hf-xet==1.1.8 +httpcore==1.0.9 +httpx==0.28.1 +httpx-sse==0.4.1 +huggingface-hub==0.34.4 +idna==3.10 +imageio==2.37.0 +imageio-ffmpeg==0.6.0 +ipykernel==6.30.1 +ipython==9.4.0 +ipython_pygments_lexers==1.1.1 +isoduration==20.11.0 +jedi==0.19.2 +Jinja2==3.1.6 +jiter==0.10.0 +joblib==1.5.2 +json5==0.12.1 +jsonpatch==1.33 +jsonpointer==3.0.0 +jsonschema==4.25.1 +jsonschema-specifications==2025.4.1 +jupyter-events==0.12.0 +jupyter-lsp==2.2.6 +jupyter_client==8.6.3 +jupyter_core==5.8.1 +jupyter_server==2.17.0 +jupyter_server_terminals==0.5.3 +jupyterlab==4.4.6 +jupyterlab_pygments==0.3.0 +jupyterlab_server==2.27.3 +langchain==0.3.27 +langchain-community==0.3.27 +langchain-core==0.3.74 +langchain-openai==0.3.31 +langchain-text-splitters==0.3.9 +langgraph==0.6.6 +langgraph-checkpoint==2.1.1 +langgraph-prebuilt==0.6.4 +langgraph-sdk==0.2.3 +langsmith==0.4.16 +lark==1.2.2 +lazy_loader==0.4 +librosa==0.11.0 +llvmlite==0.44.0 +MarkupSafe==3.0.2 +marshmallow==3.26.1 +matplotlib-inline==0.1.7 +mistune==3.1.3 +moviepy==2.2.1 +mpmath==1.3.0 +msgpack==1.1.1 +multidict==6.6.4 +multiprocess==0.70.16 +mypy_extensions==1.1.0 +nbclient==0.10.2 +nbconvert==7.16.6 +nbformat==5.10.4 +nest-asyncio==1.6.0 +networkx==3.5 +notebook==7.4.5 +notebook_shim==0.2.4 +numba==0.61.2 +numpy==2.2.6 +openai==1.101.0 +orjson==3.11.2 +ormsgpack==1.10.0 +packaging==25.0 +pandas==2.3.2 +pandocfilters==1.5.1 +parso==0.8.5 +pexpect==4.9.0 +pillow==11.3.0 +platformdirs==4.3.8 +pooch==1.8.2 +proglog==0.1.12 +prometheus_client==0.22.1 +prompt_toolkit==3.0.51 +propcache==0.3.2 +psutil==7.0.0 +ptyprocess==0.7.0 +pure_eval==0.2.3 +pyarrow==21.0.0 +pycparser==2.22 +pydantic==2.11.7 +pydantic-settings==2.10.1 +pydantic_core==2.33.2 +pydub==0.25.1 +Pygments==2.19.2 +pypdf==6.0.0 +python-dateutil==2.9.0.post0 +python-dotenv==1.1.1 +python-json-logger==3.3.0 +pytz==2025.2 +PyYAML==6.0.2 +pyzmq==27.0.2 +referencing==0.36.2 +regex==2025.7.34 +requests==2.32.5 +requests-toolbelt==1.0.0 +rfc3339-validator==0.1.4 +rfc3986-validator==0.1.1 +rfc3987-syntax==1.1.0 +rpds-py==0.27.0 +safetensors==0.6.2 +scikit-learn==1.7.1 +scipy==1.16.1 +Send2Trash==1.8.3 +setuptools==80.9.0 +six==1.17.0 +sniffio==1.3.1 +soundfile==0.13.1 +soupsieve==2.7 +soxr==0.5.0.post1 +SQLAlchemy==2.0.43 +stack-data==0.6.3 +standard-aifc==3.13.0 +standard-chunk==3.13.0 +standard-sunau==3.13.0 +sympy==1.14.0 +tenacity==9.1.2 +terminado==0.18.1 +threadpoolctl==3.6.0 +tiktoken==0.11.0 +tinycss2==1.4.0 +tokenizers==0.21.4 +torch==2.8.0 +tornado==6.5.2 +tqdm==4.67.1 +traitlets==5.14.3 +transformers==4.55.4 +types-python-dateutil==2.9.0.20250822 +typing-inspect==0.9.0 +typing-inspection==0.4.1 +typing_extensions==4.14.1 +tzdata==2025.2 +uri-template==1.3.0 +urllib3==2.5.0 +wcwidth==0.2.13 +webcolors==24.11.1 +webencodings==0.5.1 +websocket-client==1.8.0 +xxhash==3.5.0 +yarl==1.20.1 +zstandard==0.24.0 diff --git a/sql/data_import.sql b/sql/data_import.sql new file mode 100644 index 0000000..b927a33 --- /dev/null +++ b/sql/data_import.sql @@ -0,0 +1,17 @@ + +-- LOAD DATA FROM CSV FILES +COPY cells FROM '/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/data/tmp-db-data/cells.csv' DELIMITER ',' CSV HEADER; + +COPY pop(cell_id, elderly_60, children_under5, youth_15_24, general_pop, men_2020, women_2020, building_count) +FROM '/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/data/tmp-db-data/population.csv' +CSV HEADER; + +COPY ntl_annual (cell_id, ntl_min, ntl_max, ntl_mean, ntl_median, ntl_sum, + pixel_count, raster_filename, year) +FROM '/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/data/tmp-db-data/ntl-annual-2012-2024.csv' +DELIMITER ',' CSV HEADER; + +\COPY ntl_monthly(cell_id, ntl_min, ntl_max, ntl_mean, ntl_median, ntl_sum, + pixel_count, raster_filename, year, month, date) +FROM '/Users/dmatekenya/My Drive (dmatekenya@gmail.com)/TEACHING/AIMS-DSCBI/data/tmp-db-data/ntl-monthly-2012-2024.csv' +CSV HEADER; diff --git a/sql/ntl_pop_db_schema.sql b/sql/ntl_pop_db_schema.sql new file mode 100644 index 0000000..e83519c --- /dev/null +++ b/sql/ntl_pop_db_schema.sql @@ -0,0 +1,54 @@ +-- Cell information +CREATE TABLE cells ( + cell_id TEXT PRIMARY KEY, + province_name TEXT, + district_name TEXT, + sector_name TEXT, + cell_name TEXT +); + +-- Population +CREATE TABLE pop ( + id SERIAL PRIMARY KEY, + cell_id TEXT REFERENCES cells(cell_id), + elderly_60 REAL, + general_pop REAL, + children_under5 REAL, + youth_15_24 REAL, + men_2020 REAL, + women_2020 REAL, + building_count REAL +); + +-- Annual NTL stats +CREATE TABLE ntl_annual ( + id SERIAL PRIMARY KEY, + cell_id TEXT REFERENCES cells(cell_id), + ntl_min REAL, + ntl_max REAL, + ntl_mean REAL, + ntl_median REAL, + ntl_sum REAL, + pixel_count REAL, + raster_filename TEXT, + year INT +); + + +-- Monthly NTL stats +CREATE TABLE ntl_monthly ( + id SERIAL PRIMARY KEY, + cell_id TEXT REFERENCES cells(cell_id), + ntl_min REAL, + ntl_max REAL, + ntl_mean REAL, + ntl_median REAL, + ntl_sum REAL, + pixel_count REAL, + raster_filename TEXT, + year INT, + month INT, + date DATE +); + + diff --git a/sql/sql_basics.sql b/sql/sql_basics.sql new file mode 100644 index 0000000..f1b4d0d --- /dev/null +++ b/sql/sql_basics.sql @@ -0,0 +1,142 @@ +-- ============================================================ +-- basic_sql.sql +-- Basic SQL exploration of ntl_pop database +-- ============================================================ + +-- 1. Quick sanity checks +\echo '--- Sanity checks: tables and counts ---' +\dt + +SELECT 'cells' AS table, COUNT(*) FROM cells +UNION ALL SELECT 'pop', COUNT(*) FROM pop +UNION ALL SELECT 'ntl_annual', COUNT(*) FROM ntl_annual +UNION ALL SELECT 'ntl_monthly', COUNT(*) FROM ntl_monthly; + +SELECT * FROM cells LIMIT 5; +SELECT * FROM pop LIMIT 5; +SELECT * FROM ntl_annual LIMIT 5; +SELECT * FROM ntl_monthly LIMIT 5; + +-- ============================================================ + +-- 2. Annual summaries +\echo '--- Annual summaries ---' +SELECT year, AVG(ntl_mean) AS avg_ntl_mean +FROM ntl_annual +GROUP BY year +ORDER BY year; + +SELECT cell_id, ntl_mean +FROM ntl_annual +WHERE year = 2023 +ORDER BY ntl_mean DESC +LIMIT 5; + +-- ============================================================ + +-- 3. Population filters +\echo '--- Population filters (elderly > 50% of general pop) ---' +SELECT c.cell_name, p.elderly_60, p.general_pop +FROM cells c +JOIN pop p USING (cell_id) +WHERE p.elderly_60 > 0.5 * NULLIF(p.general_pop, 0) +ORDER BY p.elderly_60 DESC; + +-- ============================================================ + +-- 4. Joins and multi-table queries +\echo '--- Annual NTL joined with cell attributes ---' +SELECT + c.cell_name, + c.province_name, + c.district_name, + a.year, + a.ntl_mean, + a.ntl_sum +FROM ntl_annual a +JOIN cells c ON a.cell_id = c.cell_id +WHERE a.year = 2023 +ORDER BY a.ntl_mean DESC; + +\echo '--- Annual NTL + population: per capita light ---' +SELECT + c.cell_name, + c.district_name, + a.year, + a.ntl_sum / NULLIF(p.general_pop, 0) AS light_per_capita, + a.ntl_sum, + p.general_pop +FROM ntl_annual a +JOIN cells c ON a.cell_id = c.cell_id +JOIN pop p ON a.cell_id = p.cell_id +WHERE a.year = 2023 +ORDER BY light_per_capita DESC NULLS LAST; + +\echo '--- District-level aggregate: avg ntl_mean + total ntl_sum ---' +SELECT + c.province_name, + c.district_name, + AVG(a.ntl_mean) AS avg_ntl_mean, + SUM(a.ntl_sum) AS total_ntl_sum +FROM ntl_annual a +JOIN cells c ON a.cell_id = c.cell_id +WHERE a.year = 2023 +GROUP BY c.province_name, c.district_name +ORDER BY total_ntl_sum DESC; + +-- ============================================================ + +-- 5. Monthly time-series queries +\echo '--- Monthly trend for a specific cell ---' +SELECT year, month, ntl_mean +FROM ntl_monthly +WHERE cell_id = 'RW-001-123' +ORDER BY year, month; + +\echo '--- Monthly trend by date ---' +SELECT date, ntl_mean +FROM ntl_monthly +WHERE cell_id = 'RW-001-123' +ORDER BY date; + +\echo '--- Average ntl_mean per month across all cells ---' +SELECT year, month, AVG(ntl_mean) AS avg_ntl_mean +FROM ntl_monthly +GROUP BY year, month +ORDER BY year, month; + +\echo '--- District-level monthly averages (2023) ---' +SELECT + m.year, + m.month, + c.district_name, + AVG(m.ntl_mean) AS avg_ntl_mean +FROM ntl_monthly m +JOIN cells c ON m.cell_id = c.cell_id +WHERE m.year = 2023 +GROUP BY m.year, m.month, c.district_name +ORDER BY m.year, m.month, c.district_name; + +-- ============================================================ + +-- 6. Integrity checks and indexes +\echo '--- Integrity checks ---' +SELECT p.cell_id +FROM pop p +LEFT JOIN cells c USING (cell_id) +WHERE c.cell_id IS NULL; + +\echo '--- Recommended indexes for performance ---' +CREATE INDEX IF NOT EXISTS idx_annual_cell_id_year + ON ntl_annual (cell_id, year); +CREATE INDEX IF NOT EXISTS idx_monthly_cell_id_date + ON ntl_monthly (cell_id, date); +CREATE INDEX IF NOT EXISTS idx_cells_cell_id + ON cells (cell_id); +CREATE INDEX IF NOT EXISTS idx_pop_cell_id + ON pop (cell_id); + +-- ============================================================ +-- END OF SCRIPT +-- ============================================================ + diff --git a/=0.3.2 b/src/spatial_utils/__init__.py similarity index 100% rename from =0.3.2 rename to src/spatial_utils/__init__.py diff --git a/src/spatial_utils/zonal_stats.py b/src/spatial_utils/zonal_stats.py new file mode 100644 index 0000000..a3c00d3 --- /dev/null +++ b/src/spatial_utils/zonal_stats.py @@ -0,0 +1,259 @@ +#!/usr/bin/env python3 +""" +Zonal Statistics Script for Raster Data Analysis + +This script calculates zonal statistics for raster data using polygon boundaries. +It supports multiple administrative levels and various statistical measures. + +Usage: + python zonal_statistics.py --raster path/to/raster.tif --shapefile path/to/shapefile.shp --admin_level NAME_1 --stats mean median std +""" + +import argparse +import sys +import os +import warnings +import geopandas as gpd +import rasterio +import pandas as pd +import numpy as np +from rasterio.mask import mask +from rasterio.warp import calculate_default_transform, reproject, Resampling +import matplotlib.pyplot as plt +import seaborn as sns + +# Suppress warnings for cleaner output +warnings.filterwarnings('ignore', category=FutureWarning) +warnings.filterwarnings('ignore', category=UserWarning) + +class ZonalStatistics: + """Class to handle zonal statistics calculations""" + + def __init__(self, raster_path, shapefile_path, admin_level='NAME_1'): + """ + Initialize ZonalStatistics object + + Parameters: + ----------- + raster_path : str + Path to the raster file + shapefile_path : str + Path to the shapefile + admin_level : str + Column name for administrative level (default: 'NAME_1') + """ + self.raster_path = raster_path + self.shapefile_path = shapefile_path + self.admin_level = admin_level + self.raster = None + self.shapefile = None + + def load_data(self): + """Load raster and shapefile data""" + try: + # Load raster + self.raster = rasterio.open(self.raster_path) + print(f"✓ Loaded raster: {self.raster_path}") + print(f" - Shape: {self.raster.width} x {self.raster.height}") + print(f" - CRS: {self.raster.crs}") + print(f" - Bands: {self.raster.count}") + + # Load shapefile + self.shapefile = gpd.read_file(self.shapefile_path) + print(f"✓ Loaded shapefile: {self.shapefile_path}") + print(f" - Features: {len(self.shapefile)}") + print(f" - CRS: {self.shapefile.crs}") + print(f" - Columns: {list(self.shapefile.columns)}") + + # Check if admin_level exists + if self.admin_level not in self.shapefile.columns: + available_cols = [col for col in self.shapefile.columns if col != 'geometry'] + raise ValueError(f"Admin level '{self.admin_level}' not found. Available columns: {available_cols}") + + # Reproject shapefile to match raster CRS if needed + if self.shapefile.crs != self.raster.crs: + print(f"! Reprojecting shapefile from {self.shapefile.crs} to {self.raster.crs}") + self.shapefile = self.shapefile.to_crs(self.raster.crs) + + except Exception as e: + print(f"✗ Error loading data: {e}") + sys.exit(1) + + def calculate_statistics(self, stats_list=['mean', 'median', 'std', 'min', 'max', 'count']): + """ + Calculate zonal statistics for each polygon + + Parameters: + ----------- + stats_list : list + List of statistics to calculate. Options: 'mean', 'median', 'std', 'min', 'max', 'count', 'sum' + + Returns: + -------- + pandas.DataFrame + DataFrame with calculated statistics + """ + results = [] + total_features = len(self.shapefile) + + print(f"\nCalculating statistics for {total_features} features...") + print(f"Statistics to calculate: {', '.join(stats_list)}") + + for idx, feature in self.shapefile.iterrows(): + try: + # Extract raster values for this polygon + masked_data, masked_transform = mask( + self.raster, + [feature.geometry], + crop=True, + nodata=self.raster.nodata + ) + + # Handle different band counts + if self.raster.count == 1: + values = masked_data[0] # Single band + else: + values = masked_data.mean(axis=0) # Multi-band average + + # Remove nodata values + if self.raster.nodata is not None: + valid_values = values[values != self.raster.nodata] + else: + valid_values = values[~np.isnan(values)] + + # Initialize stats dictionary + stats = { + 'admin_name': feature[self.admin_level], + 'admin_level': self.admin_level, + 'feature_id': idx + } + + # Calculate requested statistics + if len(valid_values) > 0: + if 'mean' in stats_list: + stats['mean'] = np.mean(valid_values) + if 'median' in stats_list: + stats['median'] = np.median(valid_values) + if 'std' in stats_list: + stats['std'] = np.std(valid_values) + if 'min' in stats_list: + stats['min'] = np.min(valid_values) + if 'max' in stats_list: + stats['max'] = np.max(valid_values) + if 'count' in stats_list: + stats['count'] = len(valid_values) + if 'sum' in stats_list: + stats['sum'] = np.sum(valid_values) + else: + # No valid pixels + for stat in stats_list: + stats[stat] = np.nan + if 'count' in stats_list: + stats['count'] = 0 + + results.append(stats) + + # Progress indicator + if (idx + 1) % max(1, total_features // 10) == 0: + print(f" Processed {idx + 1}/{total_features} features ({(idx + 1)/total_features*100:.1f}%)") + + except Exception as e: + print(f" Warning: Error processing feature {idx} ({feature[self.admin_level]}): {e}") + # Add empty record + stats = { + 'admin_name': feature[self.admin_level], + 'admin_level': self.admin_level, + 'feature_id': idx + } + for stat in stats_list: + stats[stat] = np.nan + if 'count' in stats_list: + stats['count'] = 0 + results.append(stats) + + df = pd.DataFrame(results) + print(f"✓ Completed zonal statistics calculation") + return df + + def create_summary_plot(self, stats_df, output_path=None): + """ + Create summary visualizations of the statistics + + Parameters: + ----------- + stats_df : pandas.DataFrame + DataFrame with calculated statistics + output_path : str, optional + Path to save the plot + """ + # Filter numeric columns + numeric_cols = stats_df.select_dtypes(include=[np.number]).columns + numeric_cols = [col for col in numeric_cols if col not in ['feature_id', 'count']] + + if len(numeric_cols) == 0: + print("No numeric columns found for plotting") + return + + # Create subplots + n_cols = min(3, len(numeric_cols)) + n_rows = (len(numeric_cols) + n_cols - 1) // n_cols + + fig, axes = plt.subplots(n_rows, n_cols, figsize=(5*n_cols, 4*n_rows)) + if n_rows == 1 and n_cols == 1: + axes = [axes] + elif n_rows == 1: + axes = axes + else: + axes = axes.flatten() + + for i, col in enumerate(numeric_cols): + if i < len(axes): + valid_data = stats_df[col].dropna() + if len(valid_data) > 0: + axes[i].hist(valid_data, bins=min(20, len(valid_data)), alpha=0.7, edgecolor='black') + axes[i].set_title(f'Distribution of {col.title()}') + axes[i].set_xlabel(col.title()) + axes[i].set_ylabel('Frequency') + else: + axes[i].text(0.5, 0.5, 'No valid data', ha='center', va='center', transform=axes[i].transAxes) + axes[i].set_title(f'Distribution of {col.title()}') + + # Hide empty subplots + for i in range(len(numeric_cols), len(axes)): + axes[i].set_visible(False) + + plt.tight_layout() + + if output_path: + plt.savefig(output_path, dpi=300, bbox_inches='tight') + print(f"✓ Plot saved to: {output_path}") + + plt.show() + + def save_results(self, stats_df, output_path): + """ + Save results to CSV file + + Parameters: + ----------- + stats_df : pandas.DataFrame + DataFrame with calculated statistics + output_path : str + Path to save the CSV file + """ + try: + # Create directory if it doesn't exist + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + # Save to CSV + stats_df.to_csv(output_path, index=False) + print(f"✓ Results saved to: {output_path}") + + # Print summary + print(f"\nSummary:") + print(f" - Total features processed: {len(stats_df)}") + print(f" - Features with valid data: {stats_df['count'].gt(0).sum() if 'count' in stats_df.columns else 'N/A'}") + + except Exception as e: + print(f"✗ Error saving results: {e}") +