-Baggerly, Keith A, and Kevin R Coombes. 2009. “DERIVING CHEMOSENSITIVITY FROM CELL LINES: FORENSIC BIOINFORMATICS AND REPRODUCIBLE RESEARCH IN HIGH-THROUGHPUT BIOLOGY.”Ann. Appl. Stat. 3 (4): 1309–34. https://doi.org/10.2307/27801549.
+Baggerly, Keith A, and Kevin R Coombes. 2009. “DERIVING CHEMOSENSITIVITY FROM CELL LINES: FORENSIC BIOINFORMATICS AND REPRODUCIBLE RESEARCH IN HIGH-THROUGHPUT BIOLOGY.”Ann. Appl. Stat. 3 (4): 1309–34. http://www.jstor.org/stable/27801549.
Markowetz, Florian. 2015. “Five Selfish Reasons to Work Reproducibly.”Genome Biol. 16 (December): 274. https://doi.org/10.1186/s13059-015-0850-7.
diff --git a/core/week-2-old/overview.html b/core/week-2-old/overview.html
index 0b7c94b..115fd4a 100644
--- a/core/week-2-old/overview.html
+++ b/core/week-2-old/overview.html
@@ -149,7 +149,7 @@
total 164K
+drwxr-xr-x 5 runner docker 4.0K Oct 2 14:12 .
+drwxr-xr-x 8 runner docker 4.0K Oct 2 14:01 ..
+drwxr-xr-x 2 runner docker 4.0K Oct 2 14:01 data
+drwxr-xr-x 2 runner docker 4.0K Oct 2 14:01 images
+-rw-r--r-- 1 runner docker 25K Oct 2 14:12 overview.html
+-rw-r--r-- 1 runner docker 1.6K Oct 2 14:01 overview.qmd
+-rw-r--r-- 1 runner docker 184 Oct 2 14:01 study_after_workshop.qmd
+-rw-r--r-- 1 runner docker 4.7K Oct 2 14:01 study_before_workshop.ipynb
+-rw-r--r-- 1 runner docker 13K Oct 2 14:01 study_before_workshop.qmd
+-rw-r--r-- 1 runner docker 57K Oct 2 14:01 workshop.html
+-rw-r--r-- 1 runner docker 8.4K Oct 2 14:01 workshop.qmd
+-rw-r--r-- 1 runner docker 8.4K Oct 2 14:12 workshop.rmarkdown
+drwxr-xr-x 3 runner docker 4.0K Oct 2 14:01 workshop_files
You can move about with the cd command, which stands for “change directory”. You can use it to move into a directory by specifying the path to the directory:
In this workshop we will discuss why reproducibility matters and how to organise your work to make it reproducible. We will cover:
-
What is reproducibility How to achieve reproducibility Rationale for scripting Project-oriented workflow
-
Reproducibility
+
+
+
What is reproducibility
+
How to achieve reproducibility
+
Rationale for scripting
+
Project-oriented workflow
+
Code formatting and style
+
Coding algorithmically
+
Naming things
+
And some handy workflow tips
+
+
+
Slide navigation
+
+
Reproducibility
What is reproducibility?
-
-
Reproducible: Same data + same analysis = identical results. “… obtaining consistent results using the same input data; computational steps, methods, and code; and conditions of analysis. This definition is synonymous with”computational reproducibility”(National Academies of Sciences et al. 2019)
-
Replicable: Different data + same analysis = qualitatively similar results. The work is not dependent on the specificities of the data.
-
Robust: Same data + different analysis = qualitatively similar or identical results. The work is not dependent on the specificities of the analysis.
-
Generalisable: Different data + different analysis = qualitatively similar results and same conclusions.
-
What is reproducibility?
+
Definitions
+
+
+
+
+
Reproducible: Same data + same analysis = identical results. “… obtaining consistent results using the same input data; computational steps, methods, and code; and conditions of analysis. This definition is synonymous with”computational reproducibility”(National Academies of Sciences et al. 2019). This is what we are concentrating on in the Supporting Information.
+
+
Definitions
+
+
+
+
+
Replicable: Different data + same analysis = qualitatively similar results. The work is not dependent on the specificities of the data.
+
+
Definitions
+
+
+
+
+
Robust: Same data + different analysis = qualitatively similar or identical results. The work is not dependent on the specificities of the analysis.
+
+
Definitions
+
+
+
+
+
Generalisable: Different data + different analysis = qualitatively similar results and same conclusions.
+
Why does it matter?
-
Five selfish reasons to work reproducibly (Markowetz 2015). Alternatively, see the very entertaining talk
Many high profile cases of work which did not reproduce e.g. Anil Potti unravelled by Baggerly and Coombes (2009)
+
Five selfish reasons to work reproducibly (Markowetz 2015). Alternatively, see the very entertaining talk
Will become standard in Science and publishing e.g OECD Global Science Forum Building digital workforce capacity and skills for data-intensive science (OECD Global Science Forum 2020)
@@ -464,7 +503,8 @@
Script everything
Organisation: Project-oriented workflows with file and folder structure, naming things
Code: follow a consistent style, organise into sections and scripts (be modular), Code algorithmically
-
Documentation: Readme files, code comments, metadata, version control, continuous integration
@@ -874,7 +904,7 @@
Allaire, J. J., Charles Teague, Carlos Scheidegger, Yihui Xie, and Christophe Dervieux. 2024. “Quarto.”https://doi.org/10.5281/zenodo.5960048.
-Baggerly, Keith A, and Kevin R Coombes. 2009. “DERIVING CHEMOSENSITIVITY FROM CELL LINES: FORENSIC BIOINFORMATICS AND REPRODUCIBLE RESEARCH IN HIGH-THROUGHPUT BIOLOGY.”Ann. Appl. Stat. 3 (4): 1309–34. https://doi.org/10.2307/27801549.
+Baggerly, Keith A, and Kevin R Coombes. 2009. “DERIVING CHEMOSENSITIVITY FROM CELL LINES: FORENSIC BIOINFORMATICS AND REPRODUCIBLE RESEARCH IN HIGH-THROUGHPUT BIOLOGY.”Ann. Appl. Stat. 3 (4): 1309–34. http://www.jstor.org/stable/27801549.
Wilson, Greg, Jennifer Bryan, Karen Cranston, Justin Kitzes, Lex Nederbragt, and Tracy K Teal. 2017. “Good Enough Practices in Scientific Computing.”PLoS Comput. Biol. 13 (6): e1005510. https://doi.org/10.1371/journal.pcbi.1005510.
+
+Xie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.
+
+
+———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
+
-Xie, Yihui. 2024. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.
+———. 2024. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.
Zhu, Hao. 2021. “kableExtra: Construct Complex Table with ’Kable’ and Pipe Syntax.”https://CRAN.R-project.org/package=kableExtra.
diff --git a/core/week-6-old/overview.html b/core/week-6-old/overview.html
index 2d5d7fd..a614a00 100644
--- a/core/week-6-old/overview.html
+++ b/core/week-6-old/overview.html
@@ -157,7 +157,7 @@
-Baggerly, Keith A, and Kevin R Coombes. 2009. “DERIVING CHEMOSENSITIVITY FROM CELL LINES: FORENSIC BIOINFORMATICS AND REPRODUCIBLE RESEARCH IN HIGH-THROUGHPUT BIOLOGY.”Ann. Appl. Stat. 3 (4): 1309–34. https://doi.org/10.2307/27801549.
+Baggerly, Keith A, and Kevin R Coombes. 2009. “DERIVING CHEMOSENSITIVITY FROM CELL LINES: FORENSIC BIOINFORMATICS AND REPRODUCIBLE RESEARCH IN HIGH-THROUGHPUT BIOLOGY.”Ann. Appl. Stat. 3 (4): 1309–34. http://www.jstor.org/stable/27801549.
Markowetz, Florian. 2015. “Five Selfish Reasons to Work Reproducibly.”Genome Biol. 16 (December): 274. https://doi.org/10.1186/s13059-015-0850-7.
diff --git a/images/images.html b/images/images.html
index 1b1c97c..548fe45 100644
--- a/images/images.html
+++ b/images/images.html
@@ -201,7 +201,7 @@
diff --git a/search.json b/search.json
index e10091f..505d186 100644
--- a/search.json
+++ b/search.json
@@ -1,613 +1,404 @@
[
{
- "objectID": "index.html",
- "href": "index.html",
- "title": "Data Analysis for the Group Research Project",
+ "objectID": "structures/structures.html",
+ "href": "structures/structures.html",
+ "title": "Structure Data Analysis for Group Project",
"section": "",
- "text": "You are either\n\nan integrated masters student doing BIO00088H Group Research Project or\nan MSc Bioinformatics student doing BIO00070M Research, Professional and Team Skills\n\nIntegrated masters students doing 88H will be doing one of these projects:\nThe project types are:\n\n\n\n\n\n\n\n\nTitle\nDirector\nData analysis strand\n\n\n\n\nIdentifying transcriptional targets of FGF signalling in Xenopus embryos.\nBetsy Pownall\nTranscriptomics, Emma Rand\n\n\nInvestigating the differentiation of stem cells in healthy bone marrow\nJillian Barlow\nTranscriptomics, Emma Rand\n\n\nInvestigating pathways involved in the Nickel detoxification in Willow\nLiz Rylott\nTranscriptomics, Emma Rand\n\n\nInvestigating differential RNA expression through the Leishmania lifecycle\nPegine Walrad\nTranscriptomics, Emma Rand\n\n\nIdentifying novel proteins regulating synaptophagy\nRichard Maguire\nImage analysis, Richard Bingham\n\n\nDefining pathological cascades in dopaminergic neurons in a Parkinson’s model\nSean Sweeney\nImage analysis, Richard Bingham\n\n\nDiscovery proteins for biotech applications: new classes of antibody mimetics\nMichael Plevin\nStructure Analysis, Jon Agirre\n\n\n\nData Analysis compromises five workshops covering computational skills needed in your project. MSc Bioinformatics students do the Core workshops and the transcriptomics workshops as part of BIO00070M. The data analysis workshops are:\n\n\n\n\n\n\n\nWeek\nData Strand\n\n\n\n\n2\nCore 1 Supporting Information - reproducibility, project-oriented workflow, naming things, cool code, handy shortcuts\n\n\n3\nStrand specific 1\n\n\n4\nStrand specific 2\n\n\n5\nStrand specific 3\n\n\n6\nCore 2 Supporting Information - documenting with a README, curating code, non-coded processes\n\n\n\n\n\n\n\n\n\nStudents who successfully complete this module will be able to\n\nuse appropriate computational techniques to reproducibly process, analyse and visualise data and generate scientific reports based on project work.\n\n\n\n\nAll material is on the VLE so why is this site useful? This site collects everything together in a searchable way. The search icon is on the top right.\n\n\n\nRand E (2024). Data Analysis for Group Project. https://3mmarand.github.io/BIO00088H-data/.\nPages made with R (R Core Team 2024), Quarto (Allaire et al. 2024), knitr [Xie (2024); knitr2; knitr3], kableExtra (Zhu 2021)\nReferences"
+ "text": "There is an RStudio project containing a Quarto version of the the Antibody Mimetics Workshop by Michael Plevin & Jon Agirre. Instructions to obtain the RStudio project are at the bottom of this document after the set up instructions.\nYou might find RStudio useful for Python because you are already familiar with it. It is also a good way to create Quarto documents with code chunks in more than one language. Quarto documents can be used in RStudio, VS Code or Jupyter notebooks\nSome set up is required before you will be able to execute code in antibody_mimetics_workshop_3.qmd. This in contrast to the Colab notebook which is a cloud-based Jupyter notebook and does not require any set up (except installing packages).\n\n🎬 If using your own machine, install Python from https://www.python.org/downloads/. This should not be necessary if you are using a university machine where Python is already installed.\n🎬 If using your own machine and you did not install Quarto in the Core 1 workshop, install it now from https://quarto.org/docs/get-started/. This should not be necessary if you are using a university machine where quarto is already installed.\n🎬 Open RStudio and check you are using a “Git bash” Terminal: Tools | Global Options| Terminal | New Terminal opens with… . If the option to choose Git bash, you will need to install Git from https://git-scm.com/downloads. Quit RStudio first. This should not be necessary if you are using a university machine where Git bash is already installed.\n🎬 If on your own machine: In RStudio, install the quarto and the recticulate packages. This should not be necessary if you are using a university machine where these packages are already installed.\n🎬 Whether you are using your own machine or a university machine, you need to install some python packages. In RStudio and go to the Terminal window (behind the Console window). Run the following commands in the Terminal window:\npython -m pip install --upgrade pip setuptools wheel\nYou may get these warnings about scripts not being on the path. You can ignore these.\n WARNING: The script wheel.exe is installed in 'C:\\Users\\er13\\AppData\\Roaming\\Python\\Python39\\Scripts' which is not on PATH.\n Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.\n WARNING: The scripts pip.exe, pip3.11.exe, pip3.9.exe and pip3.exe are installed in 'C:\\Users\\er13\\AppData\\Roaming\\Python\\Python39\\Scripts' which is not on PATH.\n Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.\nERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\nspyder 5.1.5 requires pyqt5<5.13, which is not installed.\nspyder 5.1.5 requires pyqtwebengine<5.13, which is not installed.\nconda-repo-cli 1.0.4 requires pathlib, which is not installed.\nanaconda-project 0.10.2 requires ruamel-yaml, which is not installed.\nSuccessfully installed pip-23.3.1 setuptools-69.0.2 wheel-0.41.3\npython -m pip install session_info\npython -m pip install wget\npython -m pip install gemmi\nNote: On my windows laptop at home, I also had to install C++ Build Tools to be able to install the gemmi python package. If this is true for you, you will get a fail message telling you to install C++ build tools if you need them. These are from https://visualstudio.microsoft.com/visual-cpp-build-tools/ You need to check the Workloads tab and select C++ build tools.\n\nYou can then install the gemmi package again.\nI think that’s it! You can now download the RStudio project and run each chunk in the quarto document.\nThere is an example RStudio project here: structure-analysis. You can also download the project as a zip file from there but there is some code that will do that automatically for you. Since this is an RStudio Project, do not run the code from inside a project. You may want to navigate to a particular directory or edit the destdir:\n\nusethis::use_course(url = \"3mmaRand/structure-analysis\", destdir = \".\")\n\nYou can agree to deleting the zip. You should find RStudio restarts and you have a new project called structure-analysis-xxxxxx. The xxxxxx is a commit reference - you do not need to worry about that, it is just a way to tell you which version of the repo you downloaded.\nYou should be able to open the antibody_mimetics_workshop_3.qmd file and run each chunk. You can also knit the document to html.",
+ "crumbs": [
+ "Structure Analysis",
+ "Structure Data Analysis for Group Project"
+ ]
},
{
- "objectID": "index.html#module-learning-outcome-linked-to-this-content",
- "href": "index.html#module-learning-outcome-linked-to-this-content",
- "title": "Data Analysis for the Group Research Project",
+ "objectID": "structures/structures.html#programmatic-protein-structure-analysis",
+ "href": "structures/structures.html#programmatic-protein-structure-analysis",
+ "title": "Structure Data Analysis for Group Project",
"section": "",
- "text": "Students who successfully complete this module will be able to\n\nuse appropriate computational techniques to reproducibly process, analyse and visualise data and generate scientific reports based on project work."
+ "text": "There is an RStudio project containing a Quarto version of the the Antibody Mimetics Workshop by Michael Plevin & Jon Agirre. Instructions to obtain the RStudio project are at the bottom of this document after the set up instructions.\nYou might find RStudio useful for Python because you are already familiar with it. It is also a good way to create Quarto documents with code chunks in more than one language. Quarto documents can be used in RStudio, VS Code or Jupyter notebooks\nSome set up is required before you will be able to execute code in antibody_mimetics_workshop_3.qmd. This in contrast to the Colab notebook which is a cloud-based Jupyter notebook and does not require any set up (except installing packages).\n\n🎬 If using your own machine, install Python from https://www.python.org/downloads/. This should not be necessary if you are using a university machine where Python is already installed.\n🎬 If using your own machine and you did not install Quarto in the Core 1 workshop, install it now from https://quarto.org/docs/get-started/. This should not be necessary if you are using a university machine where quarto is already installed.\n🎬 Open RStudio and check you are using a “Git bash” Terminal: Tools | Global Options| Terminal | New Terminal opens with… . If the option to choose Git bash, you will need to install Git from https://git-scm.com/downloads. Quit RStudio first. This should not be necessary if you are using a university machine where Git bash is already installed.\n🎬 If on your own machine: In RStudio, install the quarto and the recticulate packages. This should not be necessary if you are using a university machine where these packages are already installed.\n🎬 Whether you are using your own machine or a university machine, you need to install some python packages. In RStudio and go to the Terminal window (behind the Console window). Run the following commands in the Terminal window:\npython -m pip install --upgrade pip setuptools wheel\nYou may get these warnings about scripts not being on the path. You can ignore these.\n WARNING: The script wheel.exe is installed in 'C:\\Users\\er13\\AppData\\Roaming\\Python\\Python39\\Scripts' which is not on PATH.\n Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.\n WARNING: The scripts pip.exe, pip3.11.exe, pip3.9.exe and pip3.exe are installed in 'C:\\Users\\er13\\AppData\\Roaming\\Python\\Python39\\Scripts' which is not on PATH.\n Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.\nERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\nspyder 5.1.5 requires pyqt5<5.13, which is not installed.\nspyder 5.1.5 requires pyqtwebengine<5.13, which is not installed.\nconda-repo-cli 1.0.4 requires pathlib, which is not installed.\nanaconda-project 0.10.2 requires ruamel-yaml, which is not installed.\nSuccessfully installed pip-23.3.1 setuptools-69.0.2 wheel-0.41.3\npython -m pip install session_info\npython -m pip install wget\npython -m pip install gemmi\nNote: On my windows laptop at home, I also had to install C++ Build Tools to be able to install the gemmi python package. If this is true for you, you will get a fail message telling you to install C++ build tools if you need them. These are from https://visualstudio.microsoft.com/visual-cpp-build-tools/ You need to check the Workloads tab and select C++ build tools.\n\nYou can then install the gemmi package again.\nI think that’s it! You can now download the RStudio project and run each chunk in the quarto document.\nThere is an example RStudio project here: structure-analysis. You can also download the project as a zip file from there but there is some code that will do that automatically for you. Since this is an RStudio Project, do not run the code from inside a project. You may want to navigate to a particular directory or edit the destdir:\n\nusethis::use_course(url = \"3mmaRand/structure-analysis\", destdir = \".\")\n\nYou can agree to deleting the zip. You should find RStudio restarts and you have a new project called structure-analysis-xxxxxx. The xxxxxx is a commit reference - you do not need to worry about that, it is just a way to tell you which version of the repo you downloaded.\nYou should be able to open the antibody_mimetics_workshop_3.qmd file and run each chunk. You can also knit the document to html.",
+ "crumbs": [
+ "Structure Analysis",
+ "Structure Data Analysis for Group Project"
+ ]
},
{
- "objectID": "index.html#what-is-this-site-for",
- "href": "index.html#what-is-this-site-for",
- "title": "Data Analysis for the Group Research Project",
+ "objectID": "core/week-6-old/study_before_workshop.html",
+ "href": "core/week-6-old/study_before_workshop.html",
+ "title": "Independent Study to prepare for workshop",
"section": "",
- "text": "All material is on the VLE so why is this site useful? This site collects everything together in a searchable way. The search icon is on the top right."
+ "text": "📖 Read materials from Core 1 Organising reproducible data analyses and make a note of questions you have\n📖 Read materials from Core 2 File types, workflow tips and other tools and make a note of questions you have.\n📖 Review Stage 1 and 2 (88H students) or 52M (70M students) content to see if there are areas you might benefit from revisiting. You can access these through the past VLE sites but you might find it helpful to use the latest versions, particularly for stage 1.\n\nStage 1\n\nData Analysis in R for Becoming a Bioscientist 1.Core concepts about scientific computing, types of variable, the role of variables in analysis and how to use RStudio to organise analysis and import, summarise and plot data.\nData Analysis in R for Becoming a Bioscientist 2. The logic of hypothesis testing, confidence intervals, what is meant by a statistical model, two-sample tests and one- and two-way analysis of variance (ANOVA).\n\nStage 2\n\nGet Introductory Statistical Tests as Linear models: A guide for R users\nA simple introduction to GLM for analysing Poisson and Binomial responses in R\n\n52M\n\n52M Data Analysis in R. Core concepts about scientific computing, types of variable, the role of variables in analysis and how to use RStudio to organise analysis and import, summarise and plot data, the logic of hypothesis testing, confidence intervals, what is meant by a statistical model, two-sample tests and one-way analysis of variance (ANOVA) and reproducible reports in Quarto."
},
{
- "objectID": "index.html#please-cite-as",
- "href": "index.html#please-cite-as",
- "title": "Data Analysis for the Group Research Project",
+ "objectID": "core/week-6-old/overview.html",
+ "href": "core/week-6-old/overview.html",
+ "title": "Overview",
"section": "",
- "text": "Rand E (2024). Data Analysis for Group Project. https://3mmarand.github.io/BIO00088H-data/.\nPages made with R (R Core Team 2024), Quarto (Allaire et al. 2024), knitr [Xie (2024); knitr2; knitr3], kableExtra (Zhu 2021)\nReferences"
+ "text": "This week’s session is a drop-in and introduces no new material. Instead, it is an opportunity to ask questions about the content from Core 1 and 2 and to revise skills from stage 1 and 2 as needed.\n\nInstructions\n\nPrepare\n\n📖 Review content from Core 1 and 2\n\nWorkshop\n\n💻 Ask questions about the content from Core 1 and 2 as needed\n💻 Revise skills from stage 1 and 2 (88H students) or 52M (70M students) as needed\n\nConsolidate\n\nThere is no consolidation work for this drop-in"
},
{
- "objectID": "transcriptomics/week-4/study_after_workshop.html",
- "href": "transcriptomics/week-4/study_after_workshop.html",
+ "objectID": "core/week-6/study_after_workshop.html",
+ "href": "core/week-6/study_after_workshop.html",
"title": "Independent Study to consolidate this week",
"section": "",
- "text": "You need only do the section for your own project data\n🐸 Frogs\n🎬 Open your frogs-88H Project and script you began in the Consolidation study last week. This is likely to be cont-fgf-s20.R or cont-fgf-s14.R. Use the differential expression analysis you did in the workshop (in cont-fgf-s30.R) as a template to continue your script.\n🐭 Mice\n🎬 Open your mice-88H Project. Make a new script and, using hspc-prog.R as a template, repeat the analysis on a different comparisons.\n🍂 xxxx\n🎬 Follow one of the other examples",
+ "text": "These are suggestions",
"crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
"Consolidate!"
]
},
{
- "objectID": "transcriptomics/week-4/overview.html",
- "href": "transcriptomics/week-4/overview.html",
- "title": "Overview",
- "section": "",
- "text": "This week we cover differential expression analysis on raw counts or log normalised values. The independent study will allow you to check you have what you should have following the Transcriptomics 1: Hello Data workshop and Consolidation study. It will also summarise the concepts and methods we will use in the workshop. In the workshop, you will learn how to perform differential expression analysis on raw counts using DESeq2 (Love, Huber, and Anders 2014) or on logged normalised expression values using scran (Lun, McCarthy, and Marioni 2016) or both.\nWe suggest you sit together with your group in the workshop.\n\nLearning objectives\nThe successful student will be able to:\n\nverify they have the required RStudio Project set up and the data and code files from the previous Workshop and Consolidation study\nexplain the goal of differential expression analysis and the importance of normalisation\nexplain why and how the nature of the input values determines the analysis package used\ndescribe the metadata needed to carry out differential expression analysis and the statistical models used by DESeq2 and scran\nfind genes that are unexpressed or expressed in a a single cell type or treatment group\nperform differential expression analysis on raw counts using DESeq2 or on logged normalised expression values using scran or both.\nexplain the output of differential expression: log fold change, p-value, adjusted p-value,\n\n\n\nInstructions\n\nPrepare\n\n📖 Read what you should have so far and about concepts in differential expression analysis.\n\nWorkshop\n\n💻 Find unexpressed genes and those expressed in a single cell type or treatment group.\n💻 Set up the metadata for differential expression analysis.\n💻 Perform differential expression analysis on raw counts using DESeq2 or on logged normalised expression values using scran or both.\nLook after future you!\n\nConsolidate\n\n💻 Use the work you completed in the workshop as a template to apply to a new case.\n\n\n\n\n\n\n\n\n\n\nReferences\n\nLove, Michael I., Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-Seq Data with DESeq2.” Genome Biology 15: 550. https://doi.org/10.1186/s13059-014-0550-8.\n\n\nLun, Aaron T. L., Davis J. McCarthy, and John C. Marioni. 2016. “A Step-by-Step Workflow for Low-Level Analysis of Single-Cell RNA-Seq Data with Bioconductor.” F1000Res. 5: 2122. https://doi.org/10.12688/f1000research.9501.2.",
+ "objectID": "core/week-6/study_after_workshop.html#bio00088h-group-research-project-students",
+ "href": "core/week-6/study_after_workshop.html#bio00088h-group-research-project-students",
+ "title": "Independent Study to consolidate this week",
+ "section": "BIO00088H Group Research Project students",
+ "text": "BIO00088H Group Research Project students\n\nRevise previous Data Analysis materials. You can find the version you took on the VLE site for 17C / 08C. However, my latest versions (in development) are here: Data Analysis in R. The Becoming a Bioscientist (BABS) modules replace the Laboratory and Professional Skills modules. BABS1 and BABS2 are stage one, and I’ve tried to improve them over 17C / 08C. The site is also searchable (icon top right)",
"crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "About"
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
+ "Consolidate!"
]
},
{
- "objectID": "transcriptomics/week-5/study_after_workshop.html",
- "href": "transcriptomics/week-5/study_after_workshop.html",
+ "objectID": "core/week-6/study_after_workshop.html#msc-bioinformatics-students-doing-bio00070m",
+ "href": "core/week-6/study_after_workshop.html#msc-bioinformatics-students-doing-bio00070m",
"title": "Independent Study to consolidate this week",
- "section": "",
- "text": "You need only do the section for one of the examples.\n🐸 Frogs\n🎬 Open your frogs-88H Project and script you began in the Consolidation study of Transcriptomics 1 and continued to work on in Transcriptomics 2. This is likely to be cont-fgf-s20.R or cont-fgf-s14.R. Use the code you used in the workshop (in cont-fgf-s30.R) as a template to visualise the s20/s14 results.\n🐭 Mice\n🎬 Open your mice-88H Project and the script you began in the Consolidation study of Transcriptomics 2. This is likely to be hspc-lthsc.R or lthsc-prog.R. Use the code you used in the workshop (in hspc-prog.R) as a template to visualise the hspc-lthsc/lthsc-prog results.\n🍂 xxxx\n🎬 Follow one of the other examples",
+ "section": "MSc Bioinformatics students doing BIO00070M",
+ "text": "MSc Bioinformatics students doing BIO00070M\n\nMake sure you carry out the preparatory work for week 2 of 52M",
"crumbs": [
- "Transcriptomics",
- "Week 5: Visualising and Interpreting",
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
"Consolidate!"
]
},
{
- "objectID": "transcriptomics/week-5/overview.html",
- "href": "transcriptomics/week-5/overview.html",
- "title": "Overview",
+ "objectID": "core/week-6/workshop.html",
+ "href": "core/week-6/workshop.html",
+ "title": "Workshop",
"section": "",
- "text": "This week we cover how to visualise and interpret the results of your differential expression analysis. The independent study will allow you to check you have what you should have following the Transcriptomics 2: Statistical Analysis workshop and Consolidation study. It will also summarise the the methods and plots we will go through in the workshop. In the workshop, we will learn how to merge gene information into our results, conduct a Principle Component Analysis (PCA) and plot the results as well as how to create a nicely formatted Volcano plot and heatmap.\nWe suggest you sit together with your group in the workshop.\n\nLearning objectives\nThe successful student will be able to:\n\nverify they have the required RStudio Project set up and the data and code files from the previous Workshop and Consolidation study\nexplain where gene information came from and add it to their results\nperform a PCA and understand how to interpret them\ncreate a heatmap and understand how to interpret them\ncreate a volcano plot and understand how to interpret them\n\n\n\nInstructions\n\nPrepare\n\n📖 Read what you should have so far and about concepts in PCA, volcano plots and heatmaps.\n\nWorkshop\n\n💻 Add gene information to the results of DE\n💻 Perform and plot a PCA\n💻 Visualise results with a heatmap\n💻 Visualise all the results with a volcano plot\nLook after future you!\n\nConsolidate\n\n💻 Use the work you completed in the workshop as a template to apply to a new case.\n\n\n\n\nReferences",
+ "text": "In this workshop we will discuss why reproducibility matters and how to organise your work to make it reproducible. We will cover:",
"crumbs": [
- "Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "About"
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/transcriptomics.html",
- "href": "transcriptomics/transcriptomics.html",
- "title": "Transcriptomics Data Analysis for Group Project",
+ "objectID": "core/week-6/workshop.html#session-overview",
+ "href": "core/week-6/workshop.html#session-overview",
+ "title": "Workshop",
"section": "",
- "text": "This week you will meet your data. There are four datasets, one for each project in this strand. The independent study will concisely cover how each of these four data sets were generated and how they have been processed before being given to you. It will also give an overview of the analysis we will carry out over three workshops. In the workshop, you will learn what steps to take to get a good understanding of transciptomics data before you consider any statistical analysis. This is an often overlooked, but very valuable and informative, part of any data pipeline. It will give you the understanding of the data and R data structures that you will need to code and trouble-shoot code. It will also allow you to spot failed or problematic samples and will inform your decisions on quality control. At the end of this workshop and the following independent study you will have performed quality control by filtering out uninformative genes and samples, and saved this filtered data for use in the next workshop. You will also have a script that you can use to repeat this process on other datasets.\n\n\n\nThis week we cover differential expression analysis on your quality controlled data. The independent study will allow you to check you have what you should have following the Transcriptomics 1: Hello Data workshop and Consolidation study. It then summarises the concepts and methods used to carry out differential expression analysis in workshop. In the workshop, you will perform the differential expression and learn how to compuationally annotate your genes with more information from the databases. This will include the Gene Ontology (GO) terms that describe the biological processes, molecular functions and cellular components that the gene is involved in. At the end of this workshop and the following independent study you will have files containing the genes which are differentially expressed, along with the statistical information, summary information and annotation. You will be able to consider which genes you want to investigates with your Project director and have what you need for the next workshop. You will also have a script that you can use to repeat this process on other datasets.\n\n\n\nThis week you will learn some how to do some common data visualisations for transcriptomic data. You will conduct and present a Principal Component Analysis (PCA) and a Volcano plot. We will also conduct a GO enrichment analysis. The independent study will allow you to check you have what you should have following the Transcriptomics 2: Statistical Analysis workshop and Consolidation study. At the end of this workshop and the following independent study you will at least two figures suitable for including in your report, along with an understanding of the results you can report on. You will also have a script that you can use to repeat this process on other datasets.\nReferences",
+ "text": "In this workshop we will discuss why reproducibility matters and how to organise your work to make it reproducible. We will cover:",
"crumbs": [
- "Transcriptomics",
- "Transcriptomics Data Analysis for Group Project"
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/transcriptomics.html#transcriptomics-1-hello-data",
- "href": "transcriptomics/transcriptomics.html#transcriptomics-1-hello-data",
- "title": "Transcriptomics Data Analysis for Group Project",
- "section": "",
- "text": "This week you will meet your data. There are four datasets, one for each project in this strand. The independent study will concisely cover how each of these four data sets were generated and how they have been processed before being given to you. It will also give an overview of the analysis we will carry out over three workshops. In the workshop, you will learn what steps to take to get a good understanding of transciptomics data before you consider any statistical analysis. This is an often overlooked, but very valuable and informative, part of any data pipeline. It will give you the understanding of the data and R data structures that you will need to code and trouble-shoot code. It will also allow you to spot failed or problematic samples and will inform your decisions on quality control. At the end of this workshop and the following independent study you will have performed quality control by filtering out uninformative genes and samples, and saved this filtered data for use in the next workshop. You will also have a script that you can use to repeat this process on other datasets.",
+ "objectID": "core/week-6/workshop.html#what-is-reproducibility",
+ "href": "core/week-6/workshop.html#what-is-reproducibility",
+ "title": "Workshop",
+ "section": "What is reproducibility?",
+ "text": "What is reproducibility?\n\nReproducible: Same data + same analysis = identical results. “… obtaining consistent results using the same input data; computational steps, methods, and code; and conditions of analysis. This definition is synonymous with”computational reproducibility” (National Academies of Sciences et al. 2019)\nReplicable: Different data + same analysis = qualitatively similar results. The work is not dependent on the specificities of the data.\nRobust: Same data + different analysis = qualitatively similar or identical results. The work is not dependent on the specificities of the analysis.\nGeneralisable: Different data + different analysis = qualitatively similar results and same conclusions. The findings can be generalised\n\n\n\n\nThe Turing Way's definitions of reproducible research",
"crumbs": [
- "Transcriptomics",
- "Transcriptomics Data Analysis for Group Project"
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/transcriptomics.html#transcriptomics-2-statistical-analysis",
- "href": "transcriptomics/transcriptomics.html#transcriptomics-2-statistical-analysis",
- "title": "Transcriptomics Data Analysis for Group Project",
- "section": "",
- "text": "This week we cover differential expression analysis on your quality controlled data. The independent study will allow you to check you have what you should have following the Transcriptomics 1: Hello Data workshop and Consolidation study. It then summarises the concepts and methods used to carry out differential expression analysis in workshop. In the workshop, you will perform the differential expression and learn how to compuationally annotate your genes with more information from the databases. This will include the Gene Ontology (GO) terms that describe the biological processes, molecular functions and cellular components that the gene is involved in. At the end of this workshop and the following independent study you will have files containing the genes which are differentially expressed, along with the statistical information, summary information and annotation. You will be able to consider which genes you want to investigates with your Project director and have what you need for the next workshop. You will also have a script that you can use to repeat this process on other datasets.",
+ "objectID": "core/week-6/workshop.html#why-does-it-matter",
+ "href": "core/week-6/workshop.html#why-does-it-matter",
+ "title": "Workshop",
+ "section": "Why does it matter?",
+ "text": "Why does it matter?\n\n\n\nfutureself, CC-BY-NC, by Julen Colomb\n\n\n\nFive selfish reasons to work reproducibly (Markowetz 2015). Alternatively, see the very entertaining talk\nMany high profile cases of work which did not reproduce e.g. Anil Potti unravelled by Baggerly and Coombes (2009)\nWill become standard in Science and publishing e.g OECD Global Science Forum Building digital workforce capacity and skills for data-intensive science (OECD Global Science Forum 2020)",
"crumbs": [
- "Transcriptomics",
- "Transcriptomics Data Analysis for Group Project"
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/transcriptomics.html#transcriptomics-3-visualising-and-interpreting",
- "href": "transcriptomics/transcriptomics.html#transcriptomics-3-visualising-and-interpreting",
- "title": "Transcriptomics Data Analysis for Group Project",
- "section": "",
- "text": "This week you will learn some how to do some common data visualisations for transcriptomic data. You will conduct and present a Principal Component Analysis (PCA) and a Volcano plot. We will also conduct a GO enrichment analysis. The independent study will allow you to check you have what you should have following the Transcriptomics 2: Statistical Analysis workshop and Consolidation study. At the end of this workshop and the following independent study you will at least two figures suitable for including in your report, along with an understanding of the results you can report on. You will also have a script that you can use to repeat this process on other datasets.\nReferences",
+ "objectID": "core/week-6/workshop.html#how-to-achieve-reproducibility",
+ "href": "core/week-6/workshop.html#how-to-achieve-reproducibility",
+ "title": "Workshop",
+ "section": "How to achieve reproducibility",
+ "text": "How to achieve reproducibility\n\nScripting\nOrganisation: Project-oriented workflows with file and folder structure, naming things\nDocumentation: Readme files, code comments, metadata, version control",
"crumbs": [
- "Transcriptomics",
- "Transcriptomics Data Analysis for Group Project"
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#overview",
- "href": "transcriptomics/week-3/study_before_workshop.html#overview",
- "title": "Independent Study to prepare for workshop",
- "section": "Overview",
- "text": "Overview\n\n\nConcise summary of the experimental design and aims\nWhat the raw data consist of\nWhat has been done to the data so far\nWhat steps we will take in the workshop",
+ "objectID": "core/week-6/workshop.html#rationale-for-scripting",
+ "href": "core/week-6/workshop.html#rationale-for-scripting",
+ "title": "Workshop",
+ "section": "Rationale for scripting?",
+ "text": "Rationale for scripting?\n\nScience is the generation of ideas, designing work to test them and reporting the results.\nWe ensure laboratory and field work is replicable, robust and generalisable by planning and recording in lab books and using standard protocols. Repeating results is still hard.\nWorkflows for computational projects, and the data analysis and reporting of other work can, and should, be 100% reproducible!\nScripting is the way to achieve this.",
"crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#the-data",
- "href": "transcriptomics/week-3/study_before_workshop.html#the-data",
- "title": "Independent Study to prepare for workshop",
- "section": "The Data",
- "text": "The Data\nThere are three datasets\n\n🐸 transcriptomic data (bulk RNA-seq) from frog embryos.\n🐭 transcriptomic data (single cell RNA-seq) from stemcells\n🍂 ??????? Metabolomic / Metagenomic data from anaerobic digesters",
+ "objectID": "core/week-6/workshop.html#project-oriented-workflow",
+ "href": "core/week-6/workshop.html#project-oriented-workflow",
+ "title": "Workshop",
+ "section": "Project-oriented workflow",
+ "text": "Project-oriented workflow\n\nuse folders to organise your work\nyou are aiming for structured, systematic and repeatable.\ninputs and outputs should be clearly identifiable from structure and/or naming\n\nExamples\n-- liver_transcriptome/\n |__data\n |__raw/\n |__processed/\n |__images/\n |__code/\n |__reports/\n |__figures/",
"crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#experimental-design-1",
- "href": "transcriptomics/week-3/study_before_workshop.html#experimental-design-1",
- "title": "Independent Study to prepare for workshop",
- "section": "🐸 Experimental design",
- "text": "🐸 Experimental design\n\nSchematic of frog development experiment",
+ "objectID": "core/week-6/workshop.html#naming-things",
+ "href": "core/week-6/workshop.html#naming-things",
+ "title": "Workshop",
+ "section": "Naming things",
+ "text": "Naming things\n\n\n\ndocuments, CC-BY-NC, https://xkcd.com/1459/\n\n\nGuiding principle - Have a convention! Good file names are:\n\nmachine readable\nhuman readable\nplay nicely with sorting\n\nI suggest\n\nno spaces in names\nuse snake_case or kebab-case rather than CamelCase or dot.case\nuse all lower case except very occasionally where convention is otherwise, e.g., README, LICENSE\nordering: use left-padded numbers e.g., 01, 02….99 or 001, 002….999\ndates ISO 8601 format: 2020-10-16\nwrite down your conventions\n\n-- liver_transcriptome/\n |__data\n |__raw/\n |__2022-03-21_donor_1.csv\n |__2022-03-21_donor_2.csv\n |__2022-03-21_donor_3.csv\n |__2022-05-14_donor_1.csv\n |__2022-05-14_donor_2.csv\n |__2022-05-14_donor_3.csv\n |__processed/\n |__images/\n |__code/\n |__functions/\n |__summarise.R\n |__normalise.R\n |__theme_volcano.R\n |__01_data_processing.py\n |__02_exploratory.R\n |__03_modelling.R\n |__04_figures.R\n |__reports/\n |__01_report.qmd\n |__02_supplementary.qmd\n |__figures/\n |__01_volcano_donor_1_vs_donor_2.eps\n |__02_volcano_donor_1_vs_donor_3.eps",
"crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#experimental-design-2",
- "href": "transcriptomics/week-3/study_before_workshop.html#experimental-design-2",
- "title": "Independent Study to prepare for workshop",
- "section": "🐸 Experimental design",
- "text": "🐸 Experimental design\n\nSchematic of frog development experiment\n\n3 fertilisations\ntwo siblings from each fertilisation one control, on FGF treated\nsequenced at three time points\n3 x 2 x 3 = 18 groups",
+ "objectID": "core/week-6/workshop.html#readme-files",
+ "href": "core/week-6/workshop.html#readme-files",
+ "title": "Workshop",
+ "section": "Readme files",
+ "text": "Readme files\nREADMEs are a form of documentation which have been widely used for a long time. They contain all the information about the other files in a directory. They can be extensive but need not be. Concise is good. Bullet points are good\n\nGive a project title and description, brief\nstart date, last updated date and contact information\nOutline the folder structure\nGive software requirements: programs and versions used or required. There are packages that give session information in R Wickham et al. (2021) and Python Ostblom, Joel (2019)\n\nR:\nsessioninfo::session_info()\nPython:\nimport session_info\nsession_info.show()\n\nInstructions run the code, build reports, and reproduce the figures etc\nWhere to find the data, outputs\nAny other information that needed to understand and recreate the work\nIdeally, a summary of changes with the date\n\n-- liver_transcriptome/\n |__data\n |__raw/\n |__2022-03-21_donor_1.csv\n |__2022-03-21_donor_2.csv\n |__2022-03-21_donor_3.csv\n |__2022-05-14_donor_1.csv\n |__2022-05-14_donor_2.csv\n |__2022-05-14_donor_3.csv\n |__processed/\n |__images/\n |__code/\n |__functions/\n |__summarise.R\n |__normalise.R\n |__theme_volcano.R\n |__01_data_processing.py\n |__02_exploratory.R\n |__03_modelling.R\n |__04_figures.R\n |__README.md\n |__reports/\n |__01_report.qmd\n |__02_supplementary.qmd\n |__figures/\n |__01_volcano_donor_1_vs_donor_2.eps\n |__02_volcano_donor_1_vs_donor_3.eps",
"crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#experimental-design-3",
- "href": "transcriptomics/week-3/study_before_workshop.html#experimental-design-3",
- "title": "Independent Study to prepare for workshop",
- "section": "🐸 Experimental design",
- "text": "🐸 Experimental design\n\nSchematic of frog development experiment\n\n3 fertilisations. These are the replicates, 1, 2, 3\ntwo siblings from each fertilisation one control, one FGF treated. The treatments are paired\nsequenced at three time points. S14, S20, S30\n3 x 2 x 3 = 18 groups",
+ "objectID": "core/week-6/workshop.html#code-comments",
+ "href": "core/week-6/workshop.html#code-comments",
+ "title": "Workshop",
+ "section": "Code comments",
+ "text": "Code comments\n\nComments are notes in the code which are not executed. They are ignored by the computer but are read by humans. They are used to explain what the code is doing and why. They are also used to temporarily remove code from execution.",
"crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#aim",
- "href": "transcriptomics/week-3/study_before_workshop.html#aim",
- "title": "Independent Study to prepare for workshop",
- "section": "🐸 Aim",
- "text": "🐸 Aim\n\n\nfind genes important in frog development\nImportant means the genes that are differentially expressed between the control-treated and the FGF-treated siblings\nDifferentially expressed means the expression in one group is significantly higher than in the other",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-1-old/study_after_workshop.html",
+ "href": "core/week-1-old/study_after_workshop.html",
+ "title": "Independent Study to consolidate this week",
+ "section": "",
+ "text": "These are suggestions"
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#guided-analysis",
- "href": "transcriptomics/week-3/study_before_workshop.html#guided-analysis",
- "title": "Independent Study to prepare for workshop",
- "section": "🐸 Guided analysis",
- "text": "🐸 Guided analysis\n\n\nThe workshops will take you through comparing the control and FGF treated sibling at S30\nThis is the “least interesting” comparison\nYou will be guided to carefully document your work so you can apply the same methods to other comparisons",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-1-old/study_after_workshop.html#bio00088h-group-research-project-students",
+ "href": "core/week-1-old/study_after_workshop.html#bio00088h-group-research-project-students",
+ "title": "Independent Study to consolidate this week",
+ "section": "BIO00088H Group Research Project students",
+ "text": "BIO00088H Group Research Project students\n\nRevise previous Data Analysis materials. You can find the version you took on the VLE site for 17C / 08C. However, my latest versions (in development) are here: Data Analysis in R. The Becoming a Bioscientist (BABS) modules replace the Laboratory and Professional Skills modules. BABS1 and BABS2 are stage one, and I’ve tried to improve them over 17C / 08C. The site is also searchable (icon top right)"
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#experimental-design-4",
- "href": "transcriptomics/week-3/study_before_workshop.html#experimental-design-4",
- "title": "Independent Study to prepare for workshop",
- "section": "🐭 Experimental design",
- "text": "🐭 Experimental design\n\nSchematic of stem cell experiment",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-1-old/study_after_workshop.html#msc-bioinformatics-students-doing-bio00070m",
+ "href": "core/week-1-old/study_after_workshop.html#msc-bioinformatics-students-doing-bio00070m",
+ "title": "Independent Study to consolidate this week",
+ "section": "MSc Bioinformatics students doing BIO00070M",
+ "text": "MSc Bioinformatics students doing BIO00070M\n\nMake sure you carry out the preparatory work for week 2 of 52M"
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#experimental-design-5",
- "href": "transcriptomics/week-3/study_before_workshop.html#experimental-design-5",
- "title": "Independent Study to prepare for workshop",
- "section": "🐭 Experimental design",
- "text": "🐭 Experimental design\n\nSchematic of stem cell experiment\n\nCells were sorted using flow cytometry on the basis of cell surface markers\nThere are three cell types: LT-HSCs, HSPCs, Progs\nMany cells of each cell type were sequenced",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-1-old/workshop.html",
+ "href": "core/week-1-old/workshop.html",
+ "title": "Workshop",
+ "section": "",
+ "text": "In this workshop we will discuss why reproducibility matters and how to organise your work to make it reproducible. We will cover:"
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#experimental-design-6",
- "href": "transcriptomics/week-3/study_before_workshop.html#experimental-design-6",
- "title": "Independent Study to prepare for workshop",
- "section": "🐭 Experimental design",
- "text": "🐭 Experimental design\n\nSchematic of stem cell experiment\n\nThere are three cell types: LT-HSCs, HSPCs, Progs These are the “treaments”\nMany cells of each type were sequenced: These are the replicates\n155 LT-HSCs, 701 HSPCs, 798 Progs",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-1-old/workshop.html#session-overview",
+ "href": "core/week-1-old/workshop.html#session-overview",
+ "title": "Workshop",
+ "section": "",
+ "text": "In this workshop we will discuss why reproducibility matters and how to organise your work to make it reproducible. We will cover:"
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#aim-1",
- "href": "transcriptomics/week-3/study_before_workshop.html#aim-1",
- "title": "Independent Study to prepare for workshop",
- "section": "🐭 Aim",
- "text": "🐭 Aim\n\n\nfind genes for cell surface proteins that are important in stem cell identity\nImportant means genes that are differentially expressed between at least two cell types\nDifferentially expressed means the expression in one group is significantly higher than in the other",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-1-old/workshop.html#what-is-reproducibility",
+ "href": "core/week-1-old/workshop.html#what-is-reproducibility",
+ "title": "Workshop",
+ "section": "What is reproducibility?",
+ "text": "What is reproducibility?\n\nReproducible: Same data + same analysis = identical results. “… obtaining consistent results using the same input data; computational steps, methods, and code; and conditions of analysis. This definition is synonymous with”computational reproducibility” (National Academies of Sciences et al. 2019)\nReplicable: Different data + same analysis = qualitatively similar results. The work is not dependent on the specificities of the data.\nRobust: Same data + different analysis = qualitatively similar or identical results. The work is not dependent on the specificities of the analysis.\nGeneralisable: Different data + different analysis = qualitatively similar results and same conclusions. The findings can be generalised\n\n\n\n\nThe Turing Way's definitions of reproducible research"
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#guided-analysis-1",
- "href": "transcriptomics/week-3/study_before_workshop.html#guided-analysis-1",
- "title": "Independent Study to prepare for workshop",
- "section": "🐭 Guided analysis",
- "text": "🐭 Guided analysis\n\n\nThe workshops will take you through comparing the HSPC and Prog cells\nThis is the “least interesting” comparison\nYou will be guided to carefully document your work so you can apply the same methods to other comparisons",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-1-old/workshop.html#why-does-it-matter",
+ "href": "core/week-1-old/workshop.html#why-does-it-matter",
+ "title": "Workshop",
+ "section": "Why does it matter?",
+ "text": "Why does it matter?\n\n\n\nfutureself, CC-BY-NC, by Julen Colomb\n\n\n\nFive selfish reasons to work reproducibly (Markowetz 2015). Alternatively, see the very entertaining talk\nMany high profile cases of work which did not reproduce e.g. Anil Potti unravelled by Baggerly and Coombes (2009)\nWill become standard in Science and publishing e.g OECD Global Science Forum Building digital workforce capacity and skills for data-intensive science (OECD Global Science Forum 2020)"
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#raw-sequence-data",
- "href": "transcriptomics/week-3/study_before_workshop.html#raw-sequence-data",
- "title": "Independent Study to prepare for workshop",
- "section": "Raw Sequence data",
- "text": "Raw Sequence data\n\n\nThe raw data are “reads” from a sequencing machine.\nA read is sequence of DNA or RNA shorter than the whole genome or transcriptome\nThe length of the reads depends on the type of sequencing machine\n\nShort-read technologies e.g. Illumina have higher base accuracy but are harder to align\nLong-read technologies e.g. Nanopore have lower base accuracy but are easier to align",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-1-old/workshop.html#how-to-achieve-reproducibility",
+ "href": "core/week-1-old/workshop.html#how-to-achieve-reproducibility",
+ "title": "Workshop",
+ "section": "How to achieve reproducibility",
+ "text": "How to achieve reproducibility\n\nScripting\nOrganisation: Project-oriented workflows with file and folder structure, naming things\nDocumentation: Readme files, code comments, metadata, version control"
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#raw-sequence-data-1",
- "href": "transcriptomics/week-3/study_before_workshop.html#raw-sequence-data-1",
- "title": "Independent Study to prepare for workshop",
- "section": "Raw Sequence data",
- "text": "Raw Sequence data\n\n\nSequencing technology is constantly improving\nOptional: You can read more about Sequencing technologies in Statistically useful experimental design (Rand and Forrester 2022)",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-1-old/workshop.html#rationale-for-scripting",
+ "href": "core/week-1-old/workshop.html#rationale-for-scripting",
+ "title": "Workshop",
+ "section": "Rationale for scripting?",
+ "text": "Rationale for scripting?\n\nScience is the generation of ideas, designing work to test them and reporting the results.\nWe ensure laboratory and field work is replicable, robust and generalisable by planning and recording in lab books and using standard protocols. Repeating results is still hard.\nWorkflows for computational projects, and the data analysis and reporting of other work can, and should, be 100% reproducible!\nScripting is the way to achieve this."
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#raw-sequence-data-2",
- "href": "transcriptomics/week-3/study_before_workshop.html#raw-sequence-data-2",
- "title": "Independent Study to prepare for workshop",
- "section": "Raw Sequence data",
- "text": "Raw Sequence data\n\n\nThe RNA-seq data are from an Illumina machine 150-300bp\nReads are in FASTQ files\nFASTQ files contain the sequence of each read and a quality score for each base",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-1-old/workshop.html#project-oriented-workflow",
+ "href": "core/week-1-old/workshop.html#project-oriented-workflow",
+ "title": "Workshop",
+ "section": "Project-oriented workflow",
+ "text": "Project-oriented workflow\n\nuse folders to organise your work\nyou are aiming for structured, systematic and repeatable.\ninputs and outputs should be clearly identifiable from structure and/or naming\n\nExamples\n-- liver_transcriptome/\n |__data\n |__raw/\n |__processed/\n |__images/\n |__code/\n |__reports/\n |__figures/"
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#general-steps",
- "href": "transcriptomics/week-3/study_before_workshop.html#general-steps",
- "title": "Independent Study to prepare for workshop",
- "section": "General steps",
- "text": "General steps\n\n\nReads are filtered and trimmed on the basis of the quality score\nThey are then aligned/pseudo-aligned to a reference genome/transcriptome\nReads are then counted to quantify the expression\nCounts will need to be normalised to account for differences in sequencing depth and gene/transcript/ length before, or as part of, statistical analysis.",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-1-old/workshop.html#naming-things",
+ "href": "core/week-1-old/workshop.html#naming-things",
+ "title": "Workshop",
+ "section": "Naming things",
+ "text": "Naming things\n\n\n\ndocuments, CC-BY-NC, https://xkcd.com/1459/\n\n\nGuiding principle - Have a convention! Good file names are:\n\nmachine readable\nhuman readable\nplay nicely with sorting\n\nI suggest\n\nno spaces in names\nuse snake_case or kebab-case rather than CamelCase or dot.case\nuse all lower case except very occasionally where convention is otherwise, e.g., README, LICENSE\nordering: use left-padded numbers e.g., 01, 02….99 or 001, 002….999\ndates ISO 8601 format: 2020-10-16\nwrite down your conventions\n\n-- liver_transcriptome/\n |__data\n |__raw/\n |__2022-03-21_donor_1.csv\n |__2022-03-21_donor_2.csv\n |__2022-03-21_donor_3.csv\n |__2022-05-14_donor_1.csv\n |__2022-05-14_donor_2.csv\n |__2022-05-14_donor_3.csv\n |__processed/\n |__images/\n |__code/\n |__functions/\n |__summarise.R\n |__normalise.R\n |__theme_volcano.R\n |__01_data_processing.py\n |__02_exploratory.R\n |__03_modelling.R\n |__04_figures.R\n |__reports/\n |__01_report.qmd\n |__02_supplementary.qmd\n |__figures/\n |__01_volcano_donor_1_vs_donor_2.eps\n |__02_volcano_donor_1_vs_donor_3.eps"
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#data",
- "href": "transcriptomics/week-3/study_before_workshop.html#data",
- "title": "Independent Study to prepare for workshop",
- "section": "🐸 Data",
- "text": "🐸 Data\n\nUnpublished (so far!)\nExpression for the whole transcriptome X. laevis v10.1 genome assembly\nValues are raw counts\nThe statistical analysis method we will use DESeq2 (Love, Huber, and Anders 2014) requires raw counts and performs the normalisation itself",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-1-old/workshop.html#readme-files",
+ "href": "core/week-1-old/workshop.html#readme-files",
+ "title": "Workshop",
+ "section": "Readme files",
+ "text": "Readme files\nREADMEs are a form of documentation which have been widely used for a long time. They contain all the information about the other files in a directory. They can be extensive but need not be. Concise is good. Bullet points are good\n\nGive a project title and description, brief\nstart date, last updated date and contact information\nOutline the folder structure\nGive software requirements: programs and versions used or required. There are packages that give session information in R Wickham et al. (2021) and Python Ostblom, Joel (2019)\n\nR:\nsessioninfo::session_info()\nPython:\nimport session_info\nsession_info.show()\n\nInstructions run the code, build reports, and reproduce the figures etc\nWhere to find the data, outputs\nAny other information that needed to understand and recreate the work\nIdeally, a summary of changes with the date\n\n-- liver_transcriptome/\n |__data\n |__raw/\n |__2022-03-21_donor_1.csv\n |__2022-03-21_donor_2.csv\n |__2022-03-21_donor_3.csv\n |__2022-05-14_donor_1.csv\n |__2022-05-14_donor_2.csv\n |__2022-05-14_donor_3.csv\n |__processed/\n |__images/\n |__code/\n |__functions/\n |__summarise.R\n |__normalise.R\n |__theme_volcano.R\n |__01_data_processing.py\n |__02_exploratory.R\n |__03_modelling.R\n |__04_figures.R\n |__README.md\n |__reports/\n |__01_report.qmd\n |__02_supplementary.qmd\n |__figures/\n |__01_volcano_donor_1_vs_donor_2.eps\n |__02_volcano_donor_1_vs_donor_3.eps"
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#data-1",
- "href": "transcriptomics/week-3/study_before_workshop.html#data-1",
- "title": "Independent Study to prepare for workshop",
- "section": "🐭 Data",
- "text": "🐭 Data\n\nPublished in Nestorowa et al. (2016)\nExpression for a subset of genes, the surfaceome\nValues are log2 normalised values\nThe statistical analysis method we will use scran (Lun, McCarthy, and Marioni 2016) requires normalised values",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-1-old/workshop.html#code-comments",
+ "href": "core/week-1-old/workshop.html#code-comments",
+ "title": "Workshop",
+ "section": "Code comments",
+ "text": "Code comments\n\nComments are notes in the code which are not executed. They are ignored by the computer but are read by humans. They are used to explain what the code is doing and why. They are also used to temporarily remove code from execution."
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#workshops-1",
- "href": "transcriptomics/week-3/study_before_workshop.html#workshops-1",
- "title": "Independent Study to prepare for workshop",
- "section": "Workshops",
- "text": "Workshops\n\nTranscriptomics 1: Hello data Getting to know the data. Checking the distributions of values overall, across samples and across genes to check things are as we expect and detect genes/samples that need to be removed\nTranscriptomics 2: Statistical Analysis Identifying which genes are differentially expressed between treatments. This is the main analysis step. We will use different methods for bulk and single cell data.\nTranscriptomics 3: Visualising and Interpreting Production of volcano plots and heatmaps to visualise the results of the statistical analysis. We will also look at how to interpret the results and how to find out more about the genes of interest.",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-2-old/study_after_workshop.html",
+ "href": "core/week-2-old/study_after_workshop.html",
+ "title": "Independent Study to consolidate this week",
+ "section": "",
+ "text": "bbbb"
},
{
- "objectID": "transcriptomics/week-3/study_before_workshop.html#references",
- "href": "transcriptomics/week-3/study_before_workshop.html#references",
- "title": "Independent Study to prepare for workshop",
- "section": "References",
- "text": "References\n\n\n\n🔗 About Transcriptomics 1: Hello data!\n\n\n\n\nLove, Michael I., Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-Seq Data with DESeq2.” Genome Biology 15: 550. https://doi.org/10.1186/s13059-014-0550-8.\n\n\nLun, Aaron T. L., Davis J. McCarthy, and John C. Marioni. 2016. “A Step-by-Step Workflow for Low-Level Analysis of Single-Cell RNA-Seq Data with Bioconductor.” F1000Res. 5: 2122. https://doi.org/10.12688/f1000research.9501.2.\n\n\nNestorowa, Sonia, Fiona K. Hamey, Blanca Pijuan Sala, Evangelia Diamanti, Mairi Shepherd, Elisa Laurenti, Nicola K. Wilson, David G. Kent, and Berthold Göttgens. 2016. “A Single-Cell Resolution Map of Mouse Hematopoietic Stem and Progenitor Cell Differentiation.” Blood 128 (8): e20–31. https://doi.org/10.1182/blood-2016-05-716480.\n\n\nRand, Emma, and Sarah Forrester. 2022. “Statistically Useful Experimental Design.” https://cloud-span.github.io/experimental_design00-overview/.",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Prepare!"
- ]
+ "objectID": "core/week-2-old/workshop.html",
+ "href": "core/week-2-old/workshop.html",
+ "title": "Workshop",
+ "section": "",
+ "text": "In this workshop you will"
},
{
- "objectID": "transcriptomics/week-3/workshop.html",
- "href": "transcriptomics/week-3/workshop.html",
+ "objectID": "core/week-2-old/workshop.html#session-overview",
+ "href": "core/week-2-old/workshop.html#session-overview",
"title": "Workshop",
"section": "",
- "text": "In this workshop you will learn what steps to take to get a good understanding of your transcriptomics data before you consider any statistical analysis. This is an often overlooked, but very valuable and informative, part of any data pipeline. It gives you the deep understanding of the data structures and values that you will need to code and trouble-shoot code, allows you to spot failed or problematic samples and informs your decisions on quality control.\nYou should examine all three data sets because the comparisons will give you a stronger understanding of your own project data.",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Workshop"
- ]
+ "text": "In this workshop you will"
},
{
- "objectID": "transcriptomics/week-3/workshop.html#session-overview",
- "href": "transcriptomics/week-3/workshop.html#session-overview",
+ "objectID": "core/week-2-old/workshop.html#omics",
+ "href": "core/week-2-old/workshop.html#omics",
"title": "Workshop",
- "section": "",
- "text": "In this workshop you will learn what steps to take to get a good understanding of your transcriptomics data before you consider any statistical analysis. This is an often overlooked, but very valuable and informative, part of any data pipeline. It gives you the deep understanding of the data structures and values that you will need to code and trouble-shoot code, allows you to spot failed or problematic samples and informs your decisions on quality control.\nYou should examine all three data sets because the comparisons will give you a stronger understanding of your own project data.",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Workshop"
- ]
+ "section": "Omics",
+ "text": "Omics\n\ngene/transcript/protein/metabolite expression\ntranscriptomics 1\ntranscriptomics 2\nproteomics"
},
{
- "objectID": "transcriptomics/week-3/workshop.html#set-up-a-project",
- "href": "transcriptomics/week-3/workshop.html#set-up-a-project",
+ "objectID": "core/week-2-old/workshop.html#images",
+ "href": "core/week-2-old/workshop.html#images",
"title": "Workshop",
- "section": "Set up a Project",
- "text": "Set up a Project\n🎬 Start RStudio from the Start menu\n🎬 Make an RStudio project. Be deliberate about where you create it so that it is a good place for you\n🎬 Use the Files pane to make new folders for the data. I suggest data-raw and data-processed\n🎬 Make a new script called workshop-1.R to carry out the rest of the work.\n🎬 Record what you do and what you find out. All of it!\n🎬 Load tidyverse (Wickham et al. 2019) for importing, summarising, plotting and filtering.\n\nlibrary(tidyverse)",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Workshop"
- ]
+ "section": "Images",
+ "text": "Images\ncontrol_merged.tif\nlibrary(ijtiff)\nimg <- read_tif(\"data/control_merged.tif\")\nimg\n\nan image at least one and usually more matrices of numbers representing the intensity of light at each pixel in the image\nthe number of matrices depends on the number of ‘channels’ in the image\na channel is a colour in the image\na frame is a single image in a series of images\nwe might normally call this a multi-dimensional array: x and y coordinates of the pixels are 2 dimensions, the channel is the third dimension and time is the forth dimension\n\ndisplay(img)"
},
{
- "objectID": "transcriptomics/week-3/workshop.html#examine-the-data-in-a-spreadsheet",
- "href": "transcriptomics/week-3/workshop.html#examine-the-data-in-a-spreadsheet",
+ "objectID": "core/week-2-old/workshop.html#structure",
+ "href": "core/week-2-old/workshop.html#structure",
"title": "Workshop",
- "section": "Examine the data in a spreadsheet",
- "text": "Examine the data in a spreadsheet\nThese are the three datasets. Each set compromises several files.\n🐸 Frog development data:\n\nxlaevis_counts_S14.csv\nxlaevis_counts_S20.csv\nxlaevis_counts_S30.csv\n\n🐭 Stem cell data:\n\nsurfaceome_hspc.csv\nsurfaceome_prog.csv\nsurfaceome_lthsc.csv\n\n🍂 xxxx data:\n\nxxx\nxxx\n\n🎬 Save the files to data-raw and open them in Excel\n🎬 Answer the following questions:\n\nDescribe how the sets of data are similar and how they are different.\nWhat is in the rows and columns of each file?\nHow many rows and columns are there in each file? Are these the same? In all cases or some cases? Why?\nGoogle an id. Where does your search take you? How much information is available?\n\n🎬 Did you record all that??",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Workshop"
- ]
+ "section": "Structure",
+ "text": "Structure\n1cq2.pdb"
},
{
- "objectID": "transcriptomics/week-3/workshop.html#import",
- "href": "transcriptomics/week-3/workshop.html#import",
+ "objectID": "core/week-2-old/workshop.html#the-command-line",
+ "href": "core/week-2-old/workshop.html#the-command-line",
"title": "Workshop",
- "section": "Import",
- "text": "Import\nNow let’s get the data into R and visualise it.\n🎬 Import xlaevis_counts_S30.csv, surfaceome_hspc.csv and xxxxxxxx\n\n# 🐸 import the s30 data\ns30 <- read_csv(\"data-raw/xlaevis_counts_S30.csv\")\n\n\n# 🐭 import the hspc data\nhspc <- read_csv(\"data-raw/surfaceome_hspc.csv\")\n\n\n# 🍂 xxxx import the xxxx data\n# prog <- read_csv(\"\")\n\n🎬 Check these have the number of rows and column you were expecting and that column types and names are as expected.",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Workshop"
- ]
+ "section": "The command line",
+ "text": "The command line\nThe command line - or shell - is a text interface for your computer. It’s a program that takes in commands, which it passes on to the computer’s operating system to run.\n\nWindows PowerShell is a command-line in windows. It uses bash-like commands unlike the Command Prompt which uses dos commands (a sort of windows only language). You can open is by going to Start | Windows PowerShell or by searching for it in the search bar.\nTerminal is the command line in Mac OS X. You can open it by going to Applications | Utilities | Terminal or by searching for it in the Spotlight search bar.\ngit bash. I used the bash shell that comes with Git"
},
{
- "objectID": "transcriptomics/week-3/workshop.html#explore",
- "href": "transcriptomics/week-3/workshop.html#explore",
+ "objectID": "core/week-2-old/workshop.html#rstudio-terminal",
+ "href": "core/week-2-old/workshop.html#rstudio-terminal",
"title": "Workshop",
- "section": "Explore",
- "text": "Explore\nThe first task is to get an overview. We want to know\n\nare there any missing values? If so, how many and how are they distributed?\nhow may zeros are there and how are they distributed\ndoes it look as tough all the samples/cells were equally “successful”? Can we spot any problematic anomalies?\nwhat is the distribution of values?\n\nIf our data collection has gone well we would hope to see approximately the same average expression in each sample or cell of the same type. That is replicates should be similar. We would also expect to see that the average expression of genes varies. We might have genes which are zero in every cell/sample. We will want to to filter those out.\nWe get this overview by looking at:\n\nThe distribution of values across the whole dataset\nThe distribution of values across the sample/cells (i.e., averaged across genes). This allows us to see variation between samples/cells:\nThe distribution of values across the genes (i.e., averaged across samples/cells). This allows us to see variation between genes.\n\nDistribution of values across the whole dataset\nIn all data sets, the values are spread over multiple columns so in order to plot the distribution as a whole, we will need to first use pivot_longer() to put the data in ‘tidy’ format (Wickham2014-nl?) by stacking the columns. We could save a copy of the stacked data and then plot it, but here, I have just piped the stacked data straight into ggplot().\n🐸 Frogs\n🎬 Pivot the counts (stack the columns) so all the counts are in a single column (count) and pipe into ggplot() to create a histogram:\n\ns30 |>\n pivot_longer(cols = -xenbase_gene_id,\n names_to = \"sample\",\n values_to = \"count\") |>\n ggplot(aes(x = count)) +\n geom_histogram()\n\n\n\n\n\n\n\nThis data is very skewed - there are so many low values that we can’t see the tiny bars for the higher values. Logging the counts is a way to make the distribution more visible.\n🎬 Repeat the plot on log of the counts.\n\ns30 |>\n pivot_longer(cols = -xenbase_gene_id,\n names_to = \"sample\",\n values_to = \"count\") |>\n ggplot(aes(x = log10(count))) +\n geom_histogram()\n\n\n\n\n\n\n\nI’ve used base 10 only because it easy to convert to the original scale (1 is 10, 2 is 100, 3 is 1000 etc). The warning about rows being removed is expected - these are the counts of 0 since you can’t log a value of 0. The peak at zero suggests quite a few counts of 1. We would expect we would expect the distribution of counts to be roughly log normal because this is expression of all the genes in the genome1. That small peak near the low end suggests that these lower counts might be anomalies.\nThe excess number of low counts indicates we might want to create a cut off for quality control. The removal of low counts is a common processing step in ’omic data. We will revisit this after we have considered the distribution of counts across samples and genes.\n🐭 Mice\n🎬 Pivot the expression values (stack the columns) so all the counts are in a single column (expr) and pipe into ggplot() to create a histogram:\n\nhspc |>\n pivot_longer(cols = -ensembl_gene_id,\n names_to = \"cell\",\n values_to = \"expr\") |> \n ggplot(aes(x = expr)) +\n geom_histogram()\n\n\n\n\n\n\n\nThis is a very striking distribution. Is it what we are expecting? Again,the excess number of low values is almost certainly anomalous. They will be inaccurate measure and we will want to exclude expression values below (about) 1. We will revisit this after we have considered the distribution of expression across cells and genes.\nWhat about the bimodal appearance of the the ‘real’ values? If we had the whole genome we would not expect to see such a pattern - we’d expect to see a roughly normal distribution2. However, this is a subset of the genome and the nature of the subsetting has had an influence here. These are a subset of cell surface proteins that show a significant difference between at least two of twelve cell subtypes. That is, all of these genes are either high or low.\nDistribution of values across the sample/cells\n🐸 Frog samples\nSummary statistics including the the number of NAs can be seen using the summary(). It is most helpful which you have up to about 30 columns. There is nothing special about the number 30, it is just that text summaries of a larger number of columns are difficult to grasp.\n🎬 Get a quick overview of the columns:\n\n# examine all the columns quickly\n# works well with smaller numbers of column\nsummary(s30)\n\n xenbase_gene_id S30_C_1 S30_C_2 S30_C_3 \n Length:11893 Min. : 0.0 Min. : 0.0 Min. : 0.0 \n Class :character 1st Qu.: 14.0 1st Qu.: 14.0 1st Qu.: 23.0 \n Mode :character Median : 70.0 Median : 75.0 Median : 107.0 \n Mean : 317.1 Mean : 335.8 Mean : 426.3 \n 3rd Qu.: 205.0 3rd Qu.: 220.0 3rd Qu.: 301.0 \n Max. :101746.0 Max. :118708.0 Max. :117945.0 \n S30_F_1 S30_F_2 S30_F_3 \n Min. : 0.0 Min. : 0.0 Min. : 0.0 \n 1st Qu.: 19.0 1st Qu.: 17.0 1st Qu.: 16.0 \n Median : 88.0 Median : 84.0 Median : 69.0 \n Mean : 376.2 Mean : 376.5 Mean : 260.4 \n 3rd Qu.: 251.0 3rd Qu.: 246.0 3rd Qu.: 187.0 \n Max. :117573.0 Max. :130672.0 Max. :61531.0 \n\n\nNotice that: - the minimum count is 0 and the maximums are very high in all the columns - the medians are quite a lot lower than the means so the data are skewed (hump to the left, tail to the right) - there must be quite a lot of zeros - the columns are roughly similar and it doesn’t look like there is an anomalous replicate.\nTo find out how may zeros there are in a column we can make use of the fact that TRUE evaluates to 1 and FALSE evaluates to 0. This means sum(S30_C_1 == 0) gives the number of 0 in the S30_C_1 column\n🎬 Find the number of zeros in all six columns:\n\ns30 |>\n summarise(sum(S30_C_1 == 0),\n sum(S30_C_2 == 0),\n sum(S30_C_3 == 0),\n sum(S30_F_1 == 0),\n sum(S30_F_2 == 0),\n sum(S30_F_3 == 0))\n\n# A tibble: 1 × 6\n `sum(S30_C_1 == 0)` `sum(S30_C_2 == 0)` `sum(S30_C_3 == 0)`\n <int> <int> <int>\n1 1340 1361 998\n# ℹ 3 more variables: `sum(S30_F_1 == 0)` <int>, `sum(S30_F_2 == 0)` <int>,\n# `sum(S30_F_3 == 0)` <int>\n\n\nThere is a better way of doing this that saves you having to repeat so much code - especially useful if you have a lot more than 6 columns. We can use pivot_longer() to put the data in tidy format and then use the group_by() and summarise() approach we have used extensively before.\n🎬 Find the number of zeros in all columns:\n\ns30 |>\n pivot_longer(cols = -xenbase_gene_id,\n names_to = \"sample\",\n values_to = \"count\") |>\n group_by(sample) |>\n summarise(n_zero = sum(count == 0))\n\n# A tibble: 6 × 2\n sample n_zero\n <chr> <int>\n1 S30_C_1 1340\n2 S30_C_2 1361\n3 S30_C_3 998\n4 S30_F_1 1210\n5 S30_F_2 1199\n6 S30_F_3 963\n\n\nYou could expand to get all the summary information\n🎬 Summarise all the samples:\n\ns30 |>\n pivot_longer(cols = -xenbase_gene_id,\n names_to = \"sample\",\n values_to = \"count\") |>\n group_by(sample) |>\n summarise(min = min(count),\n lowerq = quantile(count, 0.25),\n mean = mean(count),\n median = median(count),\n upperq = quantile(count, 0.75),\n max = max(count),\n n_zero = sum(count == 0))\n\n# A tibble: 6 × 8\n sample min lowerq mean median upperq max n_zero\n <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int>\n1 S30_C_1 0 14 317. 70 205 101746 1340\n2 S30_C_2 0 14 336. 75 220 118708 1361\n3 S30_C_3 0 23 426. 107 301 117945 998\n4 S30_F_1 0 19 376. 88 251 117573 1210\n5 S30_F_2 0 17 376. 84 246 130672 1199\n6 S30_F_3 0 16 260. 69 187 61531 963\n\n\nThe mean count ranges from 260 to 426.\nOne advantage this has over using summary() is that the output is a dataframe. For results, this is useful, and makes it easier to:\n\nwrite to file\nuse in ggplot()\n\nformat in a Quarto report\n\n🎬 Save the summary as a dataframe, s30_summary_samp.\nWe can write to file using write_csv()\n🎬 Write s30_summary_samp to a file called “s30_summary_samp.csv”:\n\nwrite_csv(s30_summary_samp, \n file = \"data-processed/s30_summary_samp.csv\")\n\nPlotting the distribution of values is perhaps the easiest way to understand the data. We could plot each column separately or we can pipe the tidy format of data into ggplot() and make use of facet_wrap()\n🎬 Pivot the data and pipe into ggplot:\n\ns30 |>\n pivot_longer(cols = -xenbase_gene_id,\n names_to = \"sample\",\n values_to = \"count\") |>\n ggplot(aes(count)) +\n geom_density() +\n facet_wrap(. ~ sample, nrow = 3)\n\n\n\n\n\n\n\nWe have many values (11893) so we are not limited to using geom_histogram(). geom_density() gives us a smooth distribution.\nWe have many low values and a few very high ones which makes it tricky to see the distributions. Logging the counts will make these clearer.\n🎬 Repeat the graph but taking the base 10 log of the counts:\n\ns30 |>\n pivot_longer(cols = -xenbase_gene_id,\n names_to = \"sample\",\n values_to = \"count\") |>\n ggplot(aes(log10(count))) +\n geom_density() +\n facet_wrap(. ~ sample, nrow = 3)\n\n\n\n\n\n\n\nThe key information to take from these plots is:\n\nthe distributions are roughly similar in width, height, location and overall shape so it doesn’t look as though we have any suspect samples\nthe peak at zero suggests quite a few counts of 1.\nsince we would expect the distribution of counts in each sample to be roughly log normal so that the small rise near the low end, even before the peak at zero, suggests that these lower counts might be anomalies.\n\nThe excess number of low counts indicates we might want to create a cut off for quality control. The removal of low counts is a common processing step in ’omic data. We will revisit this after we have considered the distribution of counts across genes (averaged over the samples).\n🐭 Mouse cells\nWe used the summary() function to get an overview of the columns in the frog data. Let’s try that here.\n🎬 Get a quick overview of the columns:\n\nsummary(hspc)\n\n ensembl_gene_id HSPC_001 HSPC_002 HSPC_003 \n Length:280 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n Class :character 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Mode :character Median : 0.000 Median : 0.000 Median : 0.9929 \n Mean : 2.143 Mean : 1.673 Mean : 2.5964 \n 3rd Qu.: 2.120 3rd Qu.: 2.239 3rd Qu.: 6.1559 \n Max. :12.567 Max. :11.976 Max. :11.1138 \n HSPC_004 HSPC_006 HSPC_008 HSPC_009 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. :0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000 \n Median : 0.000 Median : 1.276 Median : 0.000 Median :0.000 \n Mean : 1.851 Mean : 2.338 Mean : 2.375 Mean :2.220 \n 3rd Qu.: 2.466 3rd Qu.: 3.536 3rd Qu.: 3.851 3rd Qu.:3.594 \n Max. :11.133 Max. :10.014 Max. :11.574 Max. :9.997 \n HSPC_011 HSPC_012 HSPC_014 HSPC_015 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 1.750 Median : 0.000 Median : 0.000 \n Mean : 2.285 Mean : 2.431 Mean : 2.295 Mean : 2.515 \n 3rd Qu.: 3.193 3rd Qu.: 3.741 3rd Qu.: 3.150 3rd Qu.: 3.789 \n Max. :11.260 Max. :10.905 Max. :11.051 Max. :10.751 \n HSPC_016 HSPC_017 HSPC_018 HSPC_020 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.9488 Median : 0.000 Median : 1.248 Median : 0.000 \n Mean : 2.6115 Mean : 2.146 Mean : 2.710 Mean : 2.509 \n 3rd Qu.: 5.9412 3rd Qu.: 2.357 3rd Qu.: 6.006 3rd Qu.: 4.470 \n Max. :11.3082 Max. :12.058 Max. :11.894 Max. :11.281 \n HSPC_021 HSPC_022 HSPC_023 HSPC_024 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.170 Mean : 2.287 Mean : 2.314 Mean : 2.195 \n 3rd Qu.: 2.996 3rd Qu.: 3.351 3rd Qu.: 2.749 3rd Qu.: 2.944 \n Max. :10.709 Max. :11.814 Max. :12.113 Max. :11.279 \n HSPC_025 HSPC_026 HSPC_027 HSPC_028 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.572 Median : 1.385 Median : 0.000 Median : 0.000 \n Mean : 2.710 Mean : 2.721 Mean : 2.458 Mean : 1.906 \n 3rd Qu.: 5.735 3rd Qu.: 6.392 3rd Qu.: 5.496 3rd Qu.: 2.037 \n Max. :11.309 Max. :10.865 Max. :11.266 Max. :10.777 \n HSPC_030 HSPC_031 HSPC_033 HSPC_034 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 1.119 Median : 0.9026 Median : 0.000 Median : 0.7984 \n Mean : 2.338 Mean : 2.3049 Mean : 1.938 Mean : 2.3220 \n 3rd Qu.: 3.005 3rd Qu.: 2.9919 3rd Qu.: 2.434 3rd Qu.: 4.8324 \n Max. :11.391 Max. :11.1748 Max. :10.808 Max. :10.6707 \n HSPC_035 HSPC_036 HSPC_037 HSPC_038 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.8879 Median : 1.517 Median : 0.000 \n Mean : 1.810 Mean : 2.6918 Mean : 2.327 Mean : 2.212 \n 3rd Qu.: 2.175 3rd Qu.: 5.9822 3rd Qu.: 3.079 3rd Qu.: 2.867 \n Max. :11.221 Max. :11.3018 Max. :11.399 Max. :12.275 \n HSPC_040 HSPC_041 HSPC_042 HSPC_043 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.8673 Median : 1.342 \n Mean : 2.509 Mean : 2.492 Mean : 2.3673 Mean : 2.420 \n 3rd Qu.: 3.995 3rd Qu.: 3.943 3rd Qu.: 3.8371 3rd Qu.: 3.731 \n Max. :11.863 Max. :11.016 Max. :11.4852 Max. :11.123 \n HSPC_044 HSPC_045 HSPC_046 HSPC_047 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.8452 Median : 2.195 \n Mean : 2.382 Mean : 2.277 Mean : 1.9707 Mean : 2.498 \n 3rd Qu.: 3.998 3rd Qu.: 2.843 3rd Qu.: 2.0656 3rd Qu.: 3.937 \n Max. :10.782 Max. :10.629 Max. :11.0311 Max. :10.180 \n HSPC_048 HSPC_049 HSPC_050 HSPC_051 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 1.108 Median : 1.275 Median : 0.000 Median : 0.9757 \n Mean : 2.289 Mean : 2.453 Mean : 2.673 Mean : 2.2693 \n 3rd Qu.: 2.988 3rd Qu.: 3.819 3rd Qu.: 5.772 3rd Qu.: 3.1644 \n Max. :10.335 Max. :11.844 Max. :11.301 Max. :10.8692 \n HSPC_052 HSPC_053 HSPC_054 HSPC_055 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.509 Median : 0.818 Median : 0.000 Median : 0.000 \n Mean : 2.561 Mean : 2.684 Mean : 2.107 Mean : 1.959 \n 3rd Qu.: 4.644 3rd Qu.: 5.937 3rd Qu.: 2.568 3rd Qu.: 2.573 \n Max. :11.674 Max. :11.624 Max. :10.770 Max. :11.105 \n HSPC_056 HSPC_057 HSPC_058 HSPC_060 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 1.399 Median : 0.000 \n Mean : 2.295 Mean : 2.430 Mean : 2.296 Mean : 2.112 \n 3rd Qu.: 3.721 3rd Qu.: 3.806 3rd Qu.: 3.199 3rd Qu.: 2.201 \n Max. :11.627 Max. :10.575 Max. :11.134 Max. :10.631 \n HSPC_061 HSPC_062 HSPC_063 HSPC_064 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 1.515 Median : 1.101 \n Mean : 1.934 Mean : 2.129 Mean : 2.508 Mean : 2.696 \n 3rd Qu.: 2.489 3rd Qu.: 2.875 3rd Qu.: 4.895 3rd Qu.: 6.412 \n Max. :11.190 Max. :10.433 Max. :10.994 Max. :10.873 \n HSPC_065 HSPC_066 HSPC_067 HSPC_068 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.4852 Median : 0.000 Median : 1.441 Median : 0.000 \n Mean : 2.2676 Mean : 2.136 Mean : 2.480 Mean : 2.449 \n 3rd Qu.: 3.8217 3rd Qu.: 2.632 3rd Qu.: 3.548 3rd Qu.: 4.517 \n Max. :10.9023 Max. :11.608 Max. :11.147 Max. :10.901 \n HSPC_069 HSPC_070 HSPC_071 HSPC_072 \n Min. : 0.000 Min. : 0.0000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.8949 Median : 0.9272 Median : 1.121 \n Mean : 2.406 Mean : 2.5826 Mean : 2.2844 Mean : 2.545 \n 3rd Qu.: 4.705 3rd Qu.: 5.4749 3rd Qu.: 3.2531 3rd Qu.: 4.939 \n Max. :11.258 Max. :11.6715 Max. :10.7886 Max. :11.397 \n HSPC_073 HSPC_074 HSPC_075 HSPC_076 \n Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.00 Median : 1.674 Median : 0.000 \n Mean : 2.491 Mean : 2.46 Mean : 2.413 Mean : 2.289 \n 3rd Qu.: 4.134 3rd Qu.: 3.40 3rd Qu.: 3.013 3rd Qu.: 2.550 \n Max. :11.844 Max. :11.66 Max. :11.976 Max. :12.136 \n HSPC_077 HSPC_078 HSPC_079 HSPC_080 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.6624 Median : 1.492 Median : 1.384 Median : 1.013 \n Mean : 2.4336 Mean : 2.637 Mean : 2.432 Mean : 2.881 \n 3rd Qu.: 5.4937 3rd Qu.: 5.472 3rd Qu.: 3.617 3rd Qu.: 7.220 \n Max. :11.6020 Max. :10.673 Max. :11.199 Max. :11.836 \n HSPC_081 HSPC_082 HSPC_083 HSPC_084 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.7671 Median : 0.000 Median : 1.896 Median : 1.128 \n Mean : 1.9227 Mean : 2.474 Mean : 2.864 Mean : 2.289 \n 3rd Qu.: 1.6349 3rd Qu.: 3.488 3rd Qu.: 5.101 3rd Qu.: 2.792 \n Max. :11.4681 Max. :11.962 Max. :10.865 Max. :11.834 \n HSPC_085 HSPC_087 HSPC_088 HSPC_089 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.157 Mean : 2.314 Mean : 2.202 Mean : 2.329 \n 3rd Qu.: 3.010 3rd Qu.: 3.245 3rd Qu.: 2.092 3rd Qu.: 3.246 \n Max. :10.809 Max. :10.976 Max. :11.362 Max. :11.301 \n HSPC_090 HSPC_094 HSPC_095 HSPC_096 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. :0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000 \n Median : 0.000 Median : 0.000 Median : 2.055 Median :0.000 \n Mean : 2.286 Mean : 2.186 Mean : 2.756 Mean :2.348 \n 3rd Qu.: 4.174 3rd Qu.: 2.002 3rd Qu.: 4.370 3rd Qu.:4.482 \n Max. :11.124 Max. :11.694 Max. :11.385 Max. :9.601 \n HSPC_098 HSPC_099 HSPC_100 HSPC_101 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.007 \n Mean : 2.209 Mean : 2.082 Mean : 2.313 Mean : 2.587 \n 3rd Qu.: 3.354 3rd Qu.: 2.505 3rd Qu.: 2.775 3rd Qu.: 5.334 \n Max. :11.070 Max. :10.200 Max. :11.452 Max. :11.456 \n HSPC_102 HSPC_103 HSPC_104 HSPC_105 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.111 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.210 Mean : 2.853 Mean : 2.099 Mean : 1.893 \n 3rd Qu.: 2.993 3rd Qu.: 6.123 3rd Qu.: 2.720 3rd Qu.: 2.129 \n Max. :11.153 Max. :11.328 Max. :10.746 Max. :10.721 \n HSPC_106 HSPC_107 HSPC_108 HSPC_109 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.595 \n Mean : 1.980 Mean : 2.279 Mean : 2.296 Mean : 2.420 \n 3rd Qu.: 2.425 3rd Qu.: 3.396 3rd Qu.: 3.361 3rd Qu.: 4.006 \n Max. :10.919 Max. :10.982 Max. :11.744 Max. :10.463 \n HSPC_110 HSPC_111 HSPC_114 HSPC_115 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.9173 Median : 2.349 \n Mean : 2.159 Mean : 1.800 Mean : 1.8376 Mean : 2.943 \n 3rd Qu.: 2.667 3rd Qu.: 2.214 3rd Qu.: 1.8741 3rd Qu.: 6.223 \n Max. :11.121 Max. :11.109 Max. :10.4645 Max. :11.124 \n HSPC_117 HSPC_118 HSPC_119 HSPC_120 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.187 \n Mean : 1.919 Mean : 1.855 Mean : 2.289 Mean : 2.041 \n 3rd Qu.: 2.306 3rd Qu.: 2.387 3rd Qu.: 3.292 3rd Qu.: 2.610 \n Max. :14.579 Max. :11.119 Max. :12.534 Max. :11.438 \n HSPC_121 HSPC_122 HSPC_123 HSPC_125 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.803 Mean : 2.072 Mean : 2.200 Mean : 2.116 \n 3rd Qu.: 5.798 3rd Qu.: 2.140 3rd Qu.: 3.215 3rd Qu.: 2.409 \n Max. :11.320 Max. :11.013 Max. :11.163 Max. :11.368 \n HSPC_126 HSPC_127 HSPC_130 HSPC_131 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.9381 Median : 1.147 Median : 0.000 Median : 0.000 \n Mean : 2.0014 Mean : 2.287 Mean : 2.551 Mean : 2.240 \n 3rd Qu.: 2.2215 3rd Qu.: 3.051 3rd Qu.: 3.968 3rd Qu.: 3.773 \n Max. :10.9622 Max. :11.028 Max. :10.585 Max. :11.216 \n HSPC_132 HSPC_133 HSPC_134 HSPC_135 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.4438 Median : 2.234 Median : 0.000 Median : 0.000 \n Mean : 2.1659 Mean : 2.582 Mean : 2.335 Mean : 2.402 \n 3rd Qu.: 1.8512 3rd Qu.: 4.591 3rd Qu.: 3.659 3rd Qu.: 4.134 \n Max. :10.6431 Max. :10.730 Max. :11.995 Max. :11.573 \n HSPC_136 HSPC_138 HSPC_139 HSPC_140 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.7062 Median : 2.078 Median : 0.000 \n Mean : 2.546 Mean : 2.1054 Mean : 2.876 Mean : 2.220 \n 3rd Qu.: 5.219 3rd Qu.: 1.8181 3rd Qu.: 4.604 3rd Qu.: 3.716 \n Max. :11.281 Max. :11.1177 Max. :11.013 Max. :10.893 \n HSPC_141 HSPC_142 HSPC_143 HSPC_144 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.075 \n Mean : 2.385 Mean : 2.232 Mean : 2.592 Mean : 2.004 \n 3rd Qu.: 4.149 3rd Qu.: 2.523 3rd Qu.: 4.248 3rd Qu.: 2.441 \n Max. :11.099 Max. :11.902 Max. :12.932 Max. :11.121 \n HSPC_146 HSPC_148 HSPC_149 HSPC_151 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.9711 \n Mean : 2.418 Mean : 2.385 Mean : 2.314 Mean : 2.4375 \n 3rd Qu.: 4.430 3rd Qu.: 3.288 3rd Qu.: 3.139 3rd Qu.: 3.2523 \n Max. :10.385 Max. :12.823 Max. :10.910 Max. :11.7148 \n HSPC_152 HSPC_153 HSPC_154 HSPC_155 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.247 Mean : 2.415 Mean : 2.476 Mean : 2.468 \n 3rd Qu.: 3.293 3rd Qu.: 3.524 3rd Qu.: 4.653 3rd Qu.: 3.621 \n Max. :12.463 Max. :12.205 Max. :11.437 Max. :11.207 \n HSPC_156 HSPC_157 HSPC_158 HSPC_159 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.5545 Median : 1.993 Median : 0.000 Median : 0.000 \n Mean : 2.2297 Mean : 2.493 Mean : 2.119 Mean : 2.461 \n 3rd Qu.: 2.0977 3rd Qu.: 3.692 3rd Qu.: 2.930 3rd Qu.: 3.340 \n Max. :11.2431 Max. :10.539 Max. :11.336 Max. :11.123 \n HSPC_161 HSPC_162 HSPC_164 HSPC_165 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.701 Median : 0.7152 Median : 0.000 Median : 0.000 \n Mean : 2.533 Mean : 2.3473 Mean : 2.161 Mean : 2.084 \n 3rd Qu.: 3.616 3rd Qu.: 2.4973 3rd Qu.: 2.553 3rd Qu.: 3.020 \n Max. :11.429 Max. :11.0065 Max. :11.865 Max. :10.282 \n HSPC_166 HSPC_168 HSPC_169 HSPC_170 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 1.002 Median : 1.158 Median : 0.000 \n Mean : 2.177 Mean : 2.390 Mean : 2.038 Mean : 2.401 \n 3rd Qu.: 3.296 3rd Qu.: 4.701 3rd Qu.: 2.232 3rd Qu.: 3.703 \n Max. :11.427 Max. :10.393 Max. :10.447 Max. :11.288 \n HSPC_171 HSPC_172 HSPC_173 HSPC_174 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.525 Median : 0.7679 Median : 0.000 Median : 1.257 \n Mean : 2.312 Mean : 2.3115 Mean : 2.288 Mean : 2.444 \n 3rd Qu.: 2.729 3rd Qu.: 3.7889 3rd Qu.: 3.037 3rd Qu.: 4.996 \n Max. :10.468 Max. :11.1442 Max. :11.074 Max. :11.095 \n HSPC_175 HSPC_176 HSPC_177 HSPC_178 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.496 Median : 2.024 Median : 1.971 Median : 1.003 \n Mean : 2.613 Mean : 2.593 Mean : 2.421 Mean : 2.277 \n 3rd Qu.: 4.845 3rd Qu.: 4.092 3rd Qu.: 3.665 3rd Qu.: 2.812 \n Max. :11.235 Max. :10.379 Max. :10.864 Max. :10.979 \n HSPC_179 HSPC_180 HSPC_181 HSPC_182 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.836 Median : 1.544 Median : 2.030 Median : 0.000 \n Mean : 2.205 Mean : 2.556 Mean : 2.890 Mean : 2.363 \n 3rd Qu.: 2.300 3rd Qu.: 4.798 3rd Qu.: 4.846 3rd Qu.: 3.779 \n Max. :11.244 Max. :10.802 Max. :10.945 Max. :10.399 \n HSPC_183 HSPC_185 HSPC_186 HSPC_187 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.020 Median : 0.000 Median : 1.606 Median : 0.000 \n Mean : 2.242 Mean : 2.708 Mean : 2.053 Mean : 2.360 \n 3rd Qu.: 2.842 3rd Qu.: 4.855 3rd Qu.: 2.834 3rd Qu.: 3.541 \n Max. :10.530 Max. :11.079 Max. :11.016 Max. :10.923 \n HSPC_189 HSPC_190 HSPC_191 HSPC_192 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.412 \n Mean : 2.120 Mean : 2.417 Mean : 2.175 Mean : 2.192 \n 3rd Qu.: 2.652 3rd Qu.: 5.226 3rd Qu.: 2.574 3rd Qu.: 2.669 \n Max. :11.300 Max. :11.023 Max. :11.454 Max. :10.225 \n HSPC_193 HSPC_195 HSPC_196 HSPC_198 \n Min. :0.0000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.:0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median :0.9691 Median : 0.9175 Median : 1.379 Median : 1.105 \n Mean :2.5448 Mean : 2.7307 Mean : 2.327 Mean : 2.155 \n 3rd Qu.:5.1191 3rd Qu.: 5.8899 3rd Qu.: 2.625 3rd Qu.: 2.756 \n Max. :9.8728 Max. :10.4757 Max. :11.319 Max. :11.405 \n HSPC_199 HSPC_200 HSPC_202 HSPC_203 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 1.069 Median : 1.572 Median : 0.8045 Median : 1.311 \n Mean : 1.909 Mean : 2.346 Mean : 2.1384 Mean : 2.058 \n 3rd Qu.: 2.431 3rd Qu.: 2.791 3rd Qu.: 2.0569 3rd Qu.: 2.792 \n Max. :11.377 Max. :11.334 Max. :11.0516 Max. :10.852 \n HSPC_204 HSPC_205 HSPC_206 HSPC_207 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 1.342 Median : 1.997 Median : 1.076 Median : 0.9235 \n Mean : 2.716 Mean : 2.520 Mean : 2.426 Mean : 2.2974 \n 3rd Qu.: 5.611 3rd Qu.: 4.244 3rd Qu.: 4.057 3rd Qu.: 2.6736 \n Max. :10.269 Max. :10.817 Max. :11.866 Max. :11.4287 \n HSPC_208 HSPC_210 HSPC_211 HSPC_212 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 2.263 Median : 1.021 Median : 1.351 Median : 0.000 \n Mean : 2.893 Mean : 2.315 Mean : 2.425 Mean : 2.336 \n 3rd Qu.: 5.014 3rd Qu.: 2.676 3rd Qu.: 3.820 3rd Qu.: 3.443 \n Max. :11.375 Max. :12.208 Max. :11.360 Max. :11.808 \n HSPC_213 HSPC_214 HSPC_215 HSPC_216 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 1.270 Median : 0.9195 Median : 1.653 Median : 0.8022 \n Mean : 2.483 Mean : 2.1976 Mean : 2.563 Mean : 2.6010 \n 3rd Qu.: 4.903 3rd Qu.: 2.7139 3rd Qu.: 4.344 3rd Qu.: 6.0076 \n Max. :11.548 Max. :10.6947 Max. :10.933 Max. :11.2119 \n HSPC_218 HSPC_219 HSPC_220 HSPC_221 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 1.027 Median : 0.000 Median : 1.269 \n Mean : 2.467 Mean : 2.291 Mean : 2.449 Mean : 2.641 \n 3rd Qu.: 3.980 3rd Qu.: 2.853 3rd Qu.: 4.486 3rd Qu.: 3.617 \n Max. :11.654 Max. :10.801 Max. :10.410 Max. :11.651 \n HSPC_222 HSPC_223 HSPC_224 HSPC_225 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.449 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.262 Mean : 2.271 Mean : 2.492 Mean : 2.585 \n 3rd Qu.: 3.271 3rd Qu.: 3.727 3rd Qu.: 3.769 3rd Qu.: 5.253 \n Max. :11.133 Max. :12.000 Max. :11.114 Max. :11.671 \n HSPC_227 HSPC_228 HSPC_229 HSPC_230 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 2.484 Median : 0.000 \n Mean : 2.492 Mean : 2.370 Mean : 2.742 Mean : 2.586 \n 3rd Qu.: 3.692 3rd Qu.: 4.488 3rd Qu.: 4.836 3rd Qu.: 5.188 \n Max. :10.815 Max. :10.165 Max. :11.143 Max. :10.734 \n HSPC_231 HSPC_232 HSPC_233 HSPC_235 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 1.869 Median : 1.254 Median : 0.000 \n Mean : 2.379 Mean : 2.264 Mean : 2.531 Mean : 2.552 \n 3rd Qu.: 4.787 3rd Qu.: 3.163 3rd Qu.: 3.925 3rd Qu.: 4.389 \n Max. :10.790 Max. :12.098 Max. :11.533 Max. :11.765 \n HSPC_236 HSPC_237 HSPC_239 HSPC_240 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 2.207 Median : 0.892 \n Mean : 2.205 Mean : 2.457 Mean : 2.656 Mean : 2.049 \n 3rd Qu.: 3.748 3rd Qu.: 3.488 3rd Qu.: 4.904 3rd Qu.: 2.617 \n Max. :10.234 Max. :10.630 Max. :10.858 Max. :10.528 \n HSPC_243 HSPC_244 HSPC_245 HSPC_246 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.118 Median : 0.7872 Median : 1.459 Median : 1.629 \n Mean : 2.311 Mean : 2.6638 Mean : 2.360 Mean : 2.321 \n 3rd Qu.: 2.574 3rd Qu.: 6.2395 3rd Qu.: 3.000 3rd Qu.: 3.229 \n Max. :11.069 Max. :10.0730 Max. :11.297 Max. :11.237 \n HSPC_247 HSPC_248 HSPC_249 HSPC_250 \n Min. :0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.:0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median :0.000 Median : 0.8453 Median : 0.000 Median : 1.278 \n Mean :2.537 Mean : 2.3719 Mean : 1.803 Mean : 2.751 \n 3rd Qu.:4.687 3rd Qu.: 3.3090 3rd Qu.: 2.335 3rd Qu.: 6.330 \n Max. :9.821 Max. :10.8128 Max. :10.568 Max. :11.256 \n HSPC_251 HSPC_253 HSPC_254 HSPC_255 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.9714 Median : 1.265 Median : 0.000 Median : 0.9098 \n Mean : 2.5626 Mean : 2.492 Mean : 2.177 Mean : 2.1878 \n 3rd Qu.: 4.9167 3rd Qu.: 4.185 3rd Qu.: 3.437 3rd Qu.: 2.4313 \n Max. :11.1252 Max. :10.435 Max. :10.422 Max. :10.7952 \n HSPC_256 HSPC_257 HSPC_258 HSPC_261 \n Min. : 0.0000 Min. : 0.000 Min. :0.0000 Min. : 0.0000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.:0.0000 1st Qu.: 0.0000 \n Median : 0.8248 Median : 1.241 Median :0.8526 Median : 0.5387 \n Mean : 2.1051 Mean : 2.630 Mean :2.0295 Mean : 2.1419 \n 3rd Qu.: 2.3331 3rd Qu.: 5.646 3rd Qu.:3.0784 3rd Qu.: 1.9352 \n Max. :13.0375 Max. :11.499 Max. :9.9116 Max. :11.3247 \n HSPC_263 HSPC_264 HSPC_265 HSPC_266 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.538 Median : 1.426 Median : 1.883 Median : 1.839 \n Mean : 2.613 Mean : 2.374 Mean : 3.177 Mean : 2.833 \n 3rd Qu.: 4.485 3rd Qu.: 3.238 3rd Qu.: 5.702 3rd Qu.: 5.801 \n Max. :10.571 Max. :11.136 Max. :12.436 Max. :10.338 \n HSPC_267 HSPC_268 HSPC_269 HSPC_270 \n Min. : 0.0000 Min. : 0.0000 Min. : 0.0000 Min. : 0.0000 \n 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.0000 \n Median : 0.9675 Median : 0.7787 Median : 0.8632 Median : 0.9637 \n Mean : 2.4910 Mean : 2.5342 Mean : 2.4029 Mean : 2.6899 \n 3rd Qu.: 3.5345 3rd Qu.: 4.9871 3rd Qu.: 4.3176 3rd Qu.: 5.7266 \n Max. :10.0139 Max. :10.7848 Max. :11.2689 Max. :11.1648 \n HSPC_271 HSPC_274 HSPC_275 HSPC_276 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 1.352 Median : 1.730 Median : 0.5252 Median : 1.156 \n Mean : 2.493 Mean : 2.382 Mean : 2.5375 Mean : 2.485 \n 3rd Qu.: 4.430 3rd Qu.: 3.360 3rd Qu.: 5.7329 3rd Qu.: 4.623 \n Max. :11.636 Max. :11.165 Max. :11.6234 Max. :11.562 \n HSPC_278 HSPC_279 HSPC_280 HSPC_281 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 1.487 Median : 1.608 Median : 2.611 \n Mean : 2.161 Mean : 2.497 Mean : 2.580 Mean : 2.737 \n 3rd Qu.: 2.270 3rd Qu.: 3.813 3rd Qu.: 3.985 3rd Qu.: 4.731 \n Max. :11.734 Max. :10.900 Max. :11.673 Max. :10.076 \n HSPC_282 HSPC_283 HSPC_285 HSPC_286 \n Min. : 0.0000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.7021 Median : 1.911 Median : 0.8658 Median : 1.178 \n Mean : 2.4272 Mean : 2.534 Mean : 2.4868 Mean : 2.293 \n 3rd Qu.: 4.1254 3rd Qu.: 3.888 3rd Qu.: 5.3804 3rd Qu.: 2.597 \n Max. :11.1094 Max. :10.258 Max. :10.5533 Max. :11.112 \n HSPC_287 HSPC_288 HSPC_289 HSPC_290 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.049 Median : 0.8548 Median : 1.953 Median : 1.176 \n Mean : 2.775 Mean : 2.6412 Mean : 2.925 Mean : 2.304 \n 3rd Qu.: 5.476 3rd Qu.: 5.4204 3rd Qu.: 5.613 3rd Qu.: 3.445 \n Max. :10.925 Max. :11.0814 Max. :10.199 Max. :11.094 \n HSPC_291 HSPC_292 HSPC_293 HSPC_294 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 1.176 Median : 1.320 Median : 1.077 Median : 0.9161 \n Mean : 2.662 Mean : 2.534 Mean : 2.538 Mean : 2.4365 \n 3rd Qu.: 5.690 3rd Qu.: 4.297 3rd Qu.: 3.458 3rd Qu.: 4.8204 \n Max. :12.255 Max. :11.090 Max. :10.987 Max. :10.6135 \n HSPC_295 HSPC_296 HSPC_297 HSPC_298 \n Min. :0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.:0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median :1.479 Median : 2.157 Median : 2.444 Median : 1.281 \n Mean :2.849 Mean : 2.977 Mean : 3.062 Mean : 2.277 \n 3rd Qu.:5.282 3rd Qu.: 5.006 3rd Qu.: 5.005 3rd Qu.: 2.749 \n Max. :9.986 Max. :10.830 Max. :11.009 Max. :10.636 \n HSPC_299 HSPC_300 HSPC_301 HSPC_302 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.716 Median : 1.163 Median : 2.235 Median : 2.240 \n Mean : 2.597 Mean : 2.346 Mean : 2.739 Mean : 2.890 \n 3rd Qu.: 3.762 3rd Qu.: 2.876 3rd Qu.: 4.593 3rd Qu.: 4.945 \n Max. :11.663 Max. :11.690 Max. :10.364 Max. :10.498 \n HSPC_303 HSPC_304 HSPC_305 HSPC_306 \n Min. : 0.0000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.8348 Median : 0.9727 Median : 1.152 Median : 1.303 \n Mean : 2.3400 Mean : 2.3710 Mean : 2.469 Mean : 2.496 \n 3rd Qu.: 3.2942 3rd Qu.: 2.9942 3rd Qu.: 3.300 3rd Qu.: 3.015 \n Max. :10.3022 Max. :11.7185 Max. :11.051 Max. :11.211 \n HSPC_307 HSPC_308 HSPC_309 HSPC_310 \n Min. :0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.:0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median :1.976 Median : 1.634 Median : 1.804 Median : 1.743 \n Mean :2.873 Mean : 2.812 Mean : 2.892 Mean : 2.874 \n 3rd Qu.:5.396 3rd Qu.: 5.089 3rd Qu.: 5.165 3rd Qu.: 5.004 \n Max. :9.921 Max. :10.527 Max. :10.476 Max. :11.107 \n HSPC_312 HSPC_313 HSPC_314 HSPC_315 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.420 Median : 1.592 Median : 1.635 Median : 2.262 \n Mean : 2.645 Mean : 2.637 Mean : 2.564 Mean : 2.628 \n 3rd Qu.: 4.925 3rd Qu.: 4.257 3rd Qu.: 4.297 3rd Qu.: 4.092 \n Max. :11.367 Max. :10.644 Max. :10.882 Max. :12.140 \n HSPC_317 HSPC_318 HSPC_320 HSPC_321 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 2.335 Median : 1.728 Median : 2.340 Median : 1.835 \n Mean : 2.648 Mean : 2.637 Mean : 3.064 Mean : 2.742 \n 3rd Qu.: 4.103 3rd Qu.: 4.483 3rd Qu.: 5.325 3rd Qu.: 4.340 \n Max. :10.933 Max. :11.712 Max. :11.589 Max. :11.695 \n HSPC_322 HSPC_323 HSPC_324 HSPC_325 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.9842 Median : 0.989 Median : 1.088 Median : 2.132 \n Mean : 2.5948 Mean : 2.905 Mean : 2.655 Mean : 3.091 \n 3rd Qu.: 3.4619 3rd Qu.: 5.629 3rd Qu.: 3.772 3rd Qu.: 5.191 \n Max. :11.9594 Max. :12.267 Max. :11.310 Max. :11.134 \n HSPC_326 HSPC_327 HSPC_328 HSPC_329 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.781 Median : 1.085 Median : 1.936 Median : 1.954 \n Mean : 3.021 Mean : 2.838 Mean : 2.582 Mean : 3.034 \n 3rd Qu.: 5.582 3rd Qu.: 6.388 3rd Qu.: 4.048 3rd Qu.: 5.497 \n Max. :11.268 Max. :11.433 Max. :11.908 Max. :10.927 \n HSPC_330 HSPC_331 HSPC_332 HSPC_333 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.870 Median : 2.953 Median : 1.644 Median : 1.320 \n Mean : 2.791 Mean : 3.058 Mean : 2.768 Mean : 2.428 \n 3rd Qu.: 4.409 3rd Qu.: 5.118 3rd Qu.: 5.141 3rd Qu.: 2.985 \n Max. :11.561 Max. :10.855 Max. :10.420 Max. :11.946 \n HSPC_334 HSPC_335 HSPC_336 HSPC_337 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.931 Median : 1.541 Median : 2.761 Median : 0.000 \n Mean : 2.894 Mean : 2.746 Mean : 3.051 Mean : 2.415 \n 3rd Qu.: 4.160 3rd Qu.: 4.461 3rd Qu.: 4.408 3rd Qu.: 4.188 \n Max. :11.592 Max. :11.076 Max. :11.246 Max. :10.205 \n HSPC_338 HSPC_339 HSPC_341 HSPC_342 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000 \n Median : 0.000 Median : 0.000 Median : 0.9553 Median : 0.4452 \n Mean : 2.205 Mean : 2.325 Mean : 2.0823 Mean : 2.4572 \n 3rd Qu.: 2.449 3rd Qu.: 3.136 3rd Qu.: 2.0118 3rd Qu.: 4.9582 \n Max. :12.052 Max. :11.858 Max. :11.3855 Max. :11.8066 \n HSPC_343 HSPC_344 HSPC_345 HSPC_346 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.5197 \n Mean : 2.363 Mean : 2.290 Mean : 1.984 Mean : 2.5126 \n 3rd Qu.: 4.285 3rd Qu.: 3.238 3rd Qu.: 2.561 3rd Qu.: 5.2033 \n Max. :11.422 Max. :11.877 Max. :10.939 Max. :11.1527 \n HSPC_348 HSPC_349 HSPC_350 HSPC_351 \n Min. : 0.000 Min. : 0.000 Min. : 0.00 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.00 1st Qu.: 0.000 \n Median : 1.113 Median : 0.000 Median : 0.00 Median : 0.000 \n Mean : 2.232 Mean : 1.949 Mean : 2.11 Mean : 2.259 \n 3rd Qu.: 2.875 3rd Qu.: 2.784 3rd Qu.: 3.07 3rd Qu.: 3.214 \n Max. :11.161 Max. :10.720 Max. :11.15 Max. :10.912 \n HSPC_352 HSPC_353 HSPC_354 HSPC_356 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.333 Mean : 2.162 Mean : 2.427 Mean : 2.135 \n 3rd Qu.: 3.197 3rd Qu.: 2.819 3rd Qu.: 3.808 3rd Qu.: 2.709 \n Max. :12.275 Max. :11.351 Max. :11.190 Max. :10.662 \n HSPC_358 HSPC_359 HSPC_360 HSPC_361 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.278 Mean : 2.012 Mean : 2.381 Mean : 2.137 \n 3rd Qu.: 3.608 3rd Qu.: 1.460 3rd Qu.: 3.044 3rd Qu.: 2.875 \n Max. :10.924 Max. :11.678 Max. :11.203 Max. :10.847 \n HSPC_362 HSPC_363 HSPC_365 HSPC_367 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 1.783 Mean : 1.987 Mean : 2.937 Mean : 2.449 \n 3rd Qu.: 1.594 3rd Qu.: 2.750 3rd Qu.: 5.572 3rd Qu.: 3.936 \n Max. :11.889 Max. :10.389 Max. :12.427 Max. :11.081 \n HSPC_368 HSPC_370 HSPC_371 HSPC_372 \n Min. : 0.000 Min. : 0.0000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.7971 Median : 0.7613 Median : 0.000 \n Mean : 1.877 Mean : 2.7681 Mean : 2.4278 Mean : 2.487 \n 3rd Qu.: 2.018 3rd Qu.: 6.5358 3rd Qu.: 4.9578 3rd Qu.: 4.226 \n Max. :11.523 Max. :11.9636 Max. :11.4223 Max. :11.700 \n HSPC_373 HSPC_374 HSPC_376 HSPC_377 \n Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.00 Median : 0.000 Median : 0.000 \n Mean : 2.330 Mean : 2.21 Mean : 2.625 Mean : 2.456 \n 3rd Qu.: 3.784 3rd Qu.: 2.44 3rd Qu.: 4.365 3rd Qu.: 4.875 \n Max. :11.672 Max. :12.04 Max. :12.011 Max. :11.282 \n HSPC_380 HSPC_382 HSPC_383 HSPC_386 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.9728 Median : 1.753 Median : 0.000 \n Mean : 2.291 Mean : 2.3318 Mean : 2.307 Mean : 2.351 \n 3rd Qu.: 2.403 3rd Qu.: 2.7605 3rd Qu.: 3.113 3rd Qu.: 3.704 \n Max. :11.415 Max. :11.3370 Max. :11.592 Max. :11.079 \n HSPC_387 HSPC_388 HSPC_389 HSPC_390 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.9037 Median : 0.000 Median : 0.000 \n Mean : 2.255 Mean : 2.4969 Mean : 2.081 Mean : 2.131 \n 3rd Qu.: 3.151 3rd Qu.: 5.3587 3rd Qu.: 2.723 3rd Qu.: 2.738 \n Max. :11.700 Max. :10.9923 Max. :11.868 Max. :10.913 \n HSPC_391 HSPC_392 HSPC_393 HSPC_395 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.026 Mean : 2.356 Mean : 2.063 Mean : 1.779 \n 3rd Qu.: 2.126 3rd Qu.: 3.781 3rd Qu.: 2.163 3rd Qu.: 1.924 \n Max. :12.021 Max. :11.370 Max. :10.530 Max. :12.219 \n HSPC_396 HSPC_398 HSPC_399 HSPC_400 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.164 Mean : 2.309 Mean : 1.831 Mean : 2.091 \n 3rd Qu.: 2.681 3rd Qu.: 3.994 3rd Qu.: 1.844 3rd Qu.: 2.781 \n Max. :11.292 Max. :11.431 Max. :11.343 Max. :10.863 \n HSPC_402 HSPC_403 HSPC_404 HSPC_405 \n Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.000 Median : 0.00 Median : 0.000 Median : 0.5496 \n Mean : 2.343 Mean : 2.06 Mean : 1.878 Mean : 2.3660 \n 3rd Qu.: 4.552 3rd Qu.: 2.45 3rd Qu.: 1.644 3rd Qu.: 2.5449 \n Max. :11.444 Max. :12.00 Max. :11.188 Max. :12.2605 \n HSPC_406 HSPC_407 HSPC_408 HSPC_409 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.565 Median : 0.5775 Median : 0.000 \n Mean : 2.169 Mean : 2.611 Mean : 1.9174 Mean : 2.234 \n 3rd Qu.: 2.606 3rd Qu.: 6.000 3rd Qu.: 1.3086 3rd Qu.: 3.044 \n Max. :10.866 Max. :11.296 Max. :12.8185 Max. :11.595 \n HSPC_410 HSPC_411 HSPC_412 HSPC_413 \n Min. : 0.000 Min. : 0.0000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.9059 Median : 0.6614 Median : 0.000 \n Mean : 2.308 Mean : 3.1194 Mean : 3.0437 Mean : 2.433 \n 3rd Qu.: 4.022 3rd Qu.: 7.7574 3rd Qu.: 7.4695 3rd Qu.: 3.329 \n Max. :11.620 Max. :12.0858 Max. :11.5582 Max. :12.549 \n HSPC_415 HSPC_416 HSPC_417 HSPC_418 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.7222 Median : 0.000 \n Mean : 2.904 Mean : 2.228 Mean : 2.4242 Mean : 2.508 \n 3rd Qu.: 5.531 3rd Qu.: 3.111 3rd Qu.: 3.0795 3rd Qu.: 3.249 \n Max. :12.359 Max. :11.338 Max. :12.0314 Max. :11.857 \n HSPC_419 HSPC_420 HSPC_421 HSPC_422 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.6924 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.6246 Mean : 2.514 Mean : 2.075 Mean : 2.552 \n 3rd Qu.: 4.8156 3rd Qu.: 5.709 3rd Qu.: 3.682 3rd Qu.: 5.382 \n Max. :12.0526 Max. :11.270 Max. :10.250 Max. :11.691 \n HSPC_423 HSPC_424 HSPC_425 HSPC_426 \n Min. : 0.00 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.00 Median : 0.000 Median : 1.016 Median : 0.000 \n Mean : 2.12 Mean : 2.225 Mean : 2.658 Mean : 2.235 \n 3rd Qu.: 1.55 3rd Qu.: 2.471 3rd Qu.: 6.474 3rd Qu.: 3.134 \n Max. :11.56 Max. :11.734 Max. :11.303 Max. :10.888 \n HSPC_427 HSPC_431 HSPC_432 HSPC_435 \n Min. : 0.000 Min. : 0.000 Min. :0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 1.102 Median :0.000 Median : 1.098 \n Mean : 1.829 Mean : 2.360 Mean :2.169 Mean : 2.060 \n 3rd Qu.: 2.980 3rd Qu.: 3.640 3rd Qu.:3.261 3rd Qu.: 2.744 \n Max. :10.517 Max. :10.533 Max. :9.911 Max. :10.677 \n HSPC_436 HSPC_440 HSPC_441 HSPC_442 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.4719 Median : 1.385 Median : 1.084 Median : 0.595 \n Mean : 2.3880 Mean : 1.712 Mean : 2.265 Mean : 2.109 \n 3rd Qu.: 4.3738 3rd Qu.: 2.079 3rd Qu.: 2.828 3rd Qu.: 2.193 \n Max. :11.2839 Max. :11.065 Max. :11.152 Max. :11.560 \n HSPC_443 HSPC_444 HSPC_446 HSPC_447 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.7734 Median : 1.374 Median : 0.000 Median : 1.113 \n Mean : 2.5663 Mean : 2.262 Mean : 1.475 Mean : 2.446 \n 3rd Qu.: 4.9423 3rd Qu.: 2.952 3rd Qu.: 1.683 3rd Qu.: 4.733 \n Max. :10.9262 Max. :10.705 Max. :10.545 Max. :10.303 \n HSPC_448 HSPC_449 HSPC_450 HSPC_451 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.139 Median : 1.344 Median : 0.000 Median : 1.759 \n Mean : 2.396 Mean : 2.164 Mean : 1.946 Mean : 1.806 \n 3rd Qu.: 3.660 3rd Qu.: 2.490 3rd Qu.: 2.483 3rd Qu.: 2.528 \n Max. :11.091 Max. :11.324 Max. :10.397 Max. :10.395 \n HSPC_453 HSPC_454 HSPC_455 HSPC_456 \n Min. : 0.0000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.9321 Median : 0.5303 Median : 0.000 Median : 0.6497 \n Mean : 2.4906 Mean : 2.4477 Mean : 2.379 Mean : 2.4263 \n 3rd Qu.: 4.9604 3rd Qu.: 4.8773 3rd Qu.: 3.016 3rd Qu.: 5.4740 \n Max. :10.5263 Max. :11.1628 Max. :11.437 Max. :10.9787 \n HSPC_457 HSPC_459 HSPC_460 HSPC_461 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.313 \n Mean : 2.060 Mean : 2.403 Mean : 1.712 Mean : 1.875 \n 3rd Qu.: 2.937 3rd Qu.: 3.029 3rd Qu.: 1.598 3rd Qu.: 2.104 \n Max. :11.746 Max. :12.135 Max. :12.526 Max. :10.210 \n HSPC_462 HSPC_463 HSPC_465 HSPC_466 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.000 Median : 0.7257 Median : 0.000 Median : 0.5816 \n Mean : 2.095 Mean : 2.2325 Mean : 2.000 Mean : 1.9972 \n 3rd Qu.: 2.578 3rd Qu.: 2.3442 3rd Qu.: 2.633 3rd Qu.: 2.2384 \n Max. :11.429 Max. :11.1776 Max. :11.064 Max. :11.5475 \n HSPC_467 HSPC_468 HSPC_470 HSPC_471 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.177 Median : 0.649 Median : 0.000 Median : 0.000 \n Mean : 1.866 Mean : 2.130 Mean : 1.774 Mean : 2.279 \n 3rd Qu.: 2.258 3rd Qu.: 2.513 3rd Qu.: 1.931 3rd Qu.: 2.744 \n Max. :10.632 Max. :10.527 Max. :10.781 Max. :11.533 \n HSPC_472 HSPC_473 HSPC_474 HSPC_475 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.265 Mean : 2.168 Mean : 2.016 Mean : 2.339 \n 3rd Qu.: 2.982 3rd Qu.: 2.677 3rd Qu.: 2.061 3rd Qu.: 3.319 \n Max. :11.795 Max. :12.071 Max. :11.732 Max. :10.672 \n HSPC_477 HSPC_478 HSPC_479 HSPC_480 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.6278 Median : 0.000 Median : 1.281 Median : 1.034 \n Mean : 1.9910 Mean : 2.068 Mean : 2.175 Mean : 2.239 \n 3rd Qu.: 1.6695 3rd Qu.: 3.402 3rd Qu.: 3.028 3rd Qu.: 2.642 \n Max. :11.1171 Max. :12.113 Max. :11.277 Max. :10.641 \n HSPC_482 HSPC_483 HSPC_485 HSPC_486 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.000 Median : 1.088 Median : 0.6036 Median : 1.411 \n Mean : 1.998 Mean : 2.454 Mean : 2.3824 Mean : 2.078 \n 3rd Qu.: 2.648 3rd Qu.: 3.006 3rd Qu.: 4.8213 3rd Qu.: 2.579 \n Max. :13.948 Max. :10.722 Max. :11.8691 Max. :10.155 \n HSPC_488 HSPC_489 HSPC_490 HSPC_491 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 1.310 Median : 0.000 \n Mean : 1.809 Mean : 1.947 Mean : 2.518 Mean : 2.268 \n 3rd Qu.: 2.120 3rd Qu.: 2.330 3rd Qu.: 4.140 3rd Qu.: 3.300 \n Max. :11.271 Max. :11.518 Max. :11.646 Max. :10.366 \n HSPC_492 HSPC_493 HSPC_494 HSPC_495 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.127 Mean : 2.054 Mean : 2.255 Mean : 2.326 \n 3rd Qu.: 2.322 3rd Qu.: 3.060 3rd Qu.: 3.386 3rd Qu.: 3.812 \n Max. :11.674 Max. :10.404 Max. :10.461 Max. :10.304 \n HSPC_496 HSPC_497 HSPC_498 HSPC_499 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.000 Median : 1.945 Median : 0.5839 Median : 0.000 \n Mean : 1.938 Mean : 2.287 Mean : 2.3731 Mean : 2.045 \n 3rd Qu.: 2.227 3rd Qu.: 2.872 3rd Qu.: 3.6112 3rd Qu.: 2.358 \n Max. :11.323 Max. :11.873 Max. :11.3264 Max. :10.632 \n HSPC_500 HSPC_501 HSPC_502 HSPC_503 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000 \n Median : 0.000 Median : 0.000 Median : 0.9146 Median : 0.7789 \n Mean : 2.199 Mean : 2.209 Mean : 2.2727 Mean : 2.4495 \n 3rd Qu.: 2.678 3rd Qu.: 3.150 3rd Qu.: 2.8888 3rd Qu.: 5.4034 \n Max. :11.665 Max. :10.727 Max. :11.4591 Max. :11.5376 \n HSPC_504 HSPC_505 HSPC_506 HSPC_507 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.137 Mean : 2.132 Mean : 2.017 Mean : 2.314 \n 3rd Qu.: 3.035 3rd Qu.: 2.744 3rd Qu.: 2.794 3rd Qu.: 3.175 \n Max. :11.625 Max. :11.385 Max. :11.467 Max. :11.232 \n HSPC_508 HSPC_509 HSPC_510 HSPC_512 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.2297 Median : 1.691 Median : 1.166 Median : 0.000 \n Mean : 1.9265 Mean : 2.548 Mean : 2.319 Mean : 2.482 \n 3rd Qu.: 0.8975 3rd Qu.: 4.397 3rd Qu.: 3.492 3rd Qu.: 3.753 \n Max. :12.0747 Max. :10.603 Max. :10.885 Max. :12.492 \n HSPC_514 HSPC_515 HSPC_516 HSPC_518 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.000 Median : 1.109 Median : 0.8853 Median : 0.000 \n Mean : 2.295 Mean : 2.298 Mean : 2.5439 Mean : 2.649 \n 3rd Qu.: 2.429 3rd Qu.: 2.560 3rd Qu.: 4.6629 3rd Qu.: 5.581 \n Max. :11.783 Max. :12.193 Max. :12.1718 Max. :11.838 \n HSPC_520 HSPC_521 HSPC_522 HSPC_523 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.3648 \n Mean : 2.295 Mean : 2.348 Mean : 2.529 Mean : 1.9471 \n 3rd Qu.: 2.975 3rd Qu.: 3.375 3rd Qu.: 5.350 3rd Qu.: 1.5726 \n Max. :12.289 Max. :11.712 Max. :10.364 Max. :12.5906 \n HSPC_524 HSPC_526 HSPC_527 HSPC_528 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.777 Median : 0.532 \n Mean : 1.989 Mean : 2.218 Mean : 2.133 Mean : 2.238 \n 3rd Qu.: 3.267 3rd Qu.: 2.431 3rd Qu.: 1.651 3rd Qu.: 2.095 \n Max. :12.105 Max. :10.870 Max. :12.017 Max. :12.183 \n HSPC_530 HSPC_532 HSPC_533 HSPC_534 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.7537 Median : 0.000 \n Mean : 2.017 Mean : 1.856 Mean : 1.7546 Mean : 2.183 \n 3rd Qu.: 2.514 3rd Qu.: 1.816 3rd Qu.: 1.3378 3rd Qu.: 2.311 \n Max. :11.549 Max. :11.255 Max. :11.5862 Max. :11.696 \n HSPC_535 HSPC_537 HSPC_538 HSPC_539 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.122 Mean : 2.010 Mean : 2.501 Mean : 2.463 \n 3rd Qu.: 2.733 3rd Qu.: 2.541 3rd Qu.: 4.886 3rd Qu.: 4.100 \n Max. :10.793 Max. :10.305 Max. :11.359 Max. :11.755 \n HSPC_540 HSPC_541 HSPC_543 HSPC_544 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.9898 Median : 2.362 Median : 0.000 Median : 0.8222 \n Mean : 2.1775 Mean : 2.613 Mean : 2.275 Mean : 2.8070 \n 3rd Qu.: 1.9846 3rd Qu.: 4.440 3rd Qu.: 2.690 3rd Qu.: 6.4209 \n Max. :12.2963 Max. :11.844 Max. :10.983 Max. :10.7976 \n HSPC_545 HSPC_546 HSPC_547 HSPC_548 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 1.485 Median : 0.000 Median : 0.6548 Median : 1.456 \n Mean : 2.215 Mean : 2.424 Mean : 2.5255 Mean : 2.415 \n 3rd Qu.: 2.677 3rd Qu.: 3.573 3rd Qu.: 2.8714 3rd Qu.: 2.639 \n Max. :11.815 Max. :11.235 Max. :11.8801 Max. :11.955 \n HSPC_549 HSPC_550 HSPC_551 HSPC_552 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 1.750 Median : 1.287 Median : 1.226 \n Mean : 2.149 Mean : 2.592 Mean : 2.680 Mean : 2.236 \n 3rd Qu.: 2.289 3rd Qu.: 4.686 3rd Qu.: 4.007 3rd Qu.: 2.669 \n Max. :11.827 Max. :12.064 Max. :11.874 Max. :11.581 \n HSPC_553 HSPC_554 HSPC_555 HSPC_556 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.4709 Median : 0.000 Median : 0.000 Median : 0.9369 \n Mean : 2.6931 Mean : 2.090 Mean : 1.903 Mean : 2.4784 \n 3rd Qu.: 6.4420 3rd Qu.: 2.158 3rd Qu.: 2.579 3rd Qu.: 3.4024 \n Max. :11.0566 Max. :11.755 Max. :11.245 Max. :11.9838 \n HSPC_557 HSPC_559 HSPC_560 HSPC_562 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 1.681 Median : 0.000 \n Mean : 1.972 Mean : 1.937 Mean : 2.082 Mean : 2.470 \n 3rd Qu.: 1.880 3rd Qu.: 2.411 3rd Qu.: 2.436 3rd Qu.: 4.148 \n Max. :11.792 Max. :11.871 Max. :11.761 Max. :11.958 \n HSPC_563 HSPC_566 HSPC_567 HSPC_568 \n Min. : 0.00 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.00 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 1.83 Mean : 2.486 Mean : 2.186 Mean : 2.267 \n 3rd Qu.: 2.29 3rd Qu.: 3.577 3rd Qu.: 2.254 3rd Qu.: 2.957 \n Max. :10.59 Max. :12.452 Max. :11.302 Max. :10.851 \n HSPC_569 HSPC_571 HSPC_573 HSPC_574 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.771 Median : 1.042 Median : 0.000 Median : 0.7547 \n Mean : 2.283 Mean : 2.213 Mean : 2.089 Mean : 2.3196 \n 3rd Qu.: 3.021 3rd Qu.: 2.879 3rd Qu.: 2.291 3rd Qu.: 5.6078 \n Max. :10.720 Max. :10.939 Max. :11.397 Max. :10.4741 \n HSPC_575 HSPC_576 HSPC_577 HSPC_578 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 1.606 Median : 0.000 \n Mean : 2.016 Mean : 2.206 Mean : 2.358 Mean : 2.257 \n 3rd Qu.: 2.267 3rd Qu.: 2.741 3rd Qu.: 3.198 3rd Qu.: 2.923 \n Max. :10.687 Max. :11.201 Max. :11.613 Max. :12.323 \n HSPC_579 HSPC_580 HSPC_582 HSPC_584 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.182 Median : 0.9442 Median : 0.000 Median : 0.000 \n Mean : 2.472 Mean : 2.4264 Mean : 2.218 Mean : 2.276 \n 3rd Qu.: 5.009 3rd Qu.: 3.5841 3rd Qu.: 3.332 3rd Qu.: 3.067 \n Max. :11.096 Max. :10.6790 Max. :10.882 Max. :10.954 \n HSPC_585 HSPC_586 HSPC_589 HSPC_590 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.8915 Median : 0.000 Median : 1.192 \n Mean : 2.034 Mean : 2.0490 Mean : 2.274 Mean : 2.252 \n 3rd Qu.: 2.157 3rd Qu.: 1.8340 3rd Qu.: 3.655 3rd Qu.: 2.364 \n Max. :11.956 Max. :11.4729 Max. :11.198 Max. :10.673 \n HSPC_592 HSPC_593 HSPC_594 HSPC_595 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.228 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.317 Mean : 2.329 Mean : 2.474 Mean : 1.463 \n 3rd Qu.: 2.671 3rd Qu.: 3.263 3rd Qu.: 4.396 3rd Qu.: 1.757 \n Max. :12.036 Max. :10.626 Max. :11.347 Max. :11.286 \n HSPC_596 HSPC_597 HSPC_598 HSPC_599 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.392 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.283 Mean : 1.858 Mean : 1.954 Mean : 1.905 \n 3rd Qu.: 3.425 3rd Qu.: 2.296 3rd Qu.: 2.320 3rd Qu.: 2.497 \n Max. :10.899 Max. :11.002 Max. :11.117 Max. :11.248 \n HSPC_600 HSPC_601 HSPC_602 HSPC_603 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 1.662 Median : 0.000 \n Mean : 2.335 Mean : 1.905 Mean : 2.343 Mean : 2.281 \n 3rd Qu.: 3.827 3rd Qu.: 2.376 3rd Qu.: 3.272 3rd Qu.: 3.048 \n Max. :11.208 Max. :11.022 Max. :10.908 Max. :11.464 \n HSPC_604 HSPC_606 HSPC_607 HSPC_608 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.136 Mean : 2.392 Mean : 2.142 Mean : 2.139 \n 3rd Qu.: 2.516 3rd Qu.: 4.726 3rd Qu.: 3.187 3rd Qu.: 2.885 \n Max. :11.743 Max. :11.210 Max. :10.319 Max. :10.802 \n HSPC_610 HSPC_612 HSPC_613 HSPC_614 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.315 \n Mean : 2.327 Mean : 2.298 Mean : 2.228 Mean : 2.364 \n 3rd Qu.: 3.718 3rd Qu.: 3.138 3rd Qu.: 2.705 3rd Qu.: 3.136 \n Max. :10.860 Max. :11.564 Max. :10.560 Max. :11.824 \n HSPC_615 HSPC_617 HSPC_618 HSPC_620 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.8525 Median : 0.000 Median : 0.000 \n Mean : 1.964 Mean : 2.2100 Mean : 2.229 Mean : 1.881 \n 3rd Qu.: 2.451 3rd Qu.: 2.3301 3rd Qu.: 2.885 3rd Qu.: 2.518 \n Max. :11.058 Max. :10.9434 Max. :11.210 Max. :11.388 \n HSPC_623 HSPC_624 HSPC_625 HSPC_626 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.7201 Median : 0.000 Median : 0.000 \n Mean : 2.563 Mean : 2.0968 Mean : 2.042 Mean : 2.262 \n 3rd Qu.: 4.626 3rd Qu.: 1.8437 3rd Qu.: 2.938 3rd Qu.: 3.424 \n Max. :10.954 Max. :10.9459 Max. :11.226 Max. :11.770 \n HSPC_627 HSPC_628 HSPC_629 HSPC_630 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.269 Mean : 2.302 Mean : 2.212 Mean : 2.519 \n 3rd Qu.: 3.952 3rd Qu.: 2.875 3rd Qu.: 2.625 3rd Qu.: 4.511 \n Max. :11.426 Max. :11.792 Max. :11.139 Max. :11.519 \n HSPC_631 HSPC_633 HSPC_634 HSPC_635 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.303 Mean : 2.329 Mean : 2.268 Mean : 2.054 \n 3rd Qu.: 2.685 3rd Qu.: 3.619 3rd Qu.: 3.662 3rd Qu.: 2.629 \n Max. :10.996 Max. :12.011 Max. :11.406 Max. :11.178 \n HSPC_636 HSPC_637 HSPC_638 HSPC_639 \n Min. : 0.000 Min. : 0.0000 Min. : 0.0000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.0000 \n Median : 0.000 Median : 0.9389 Median : 0.5101 Median : 0.9966 \n Mean : 1.953 Mean : 2.1351 Mean : 1.6966 Mean : 1.5879 \n 3rd Qu.: 2.129 3rd Qu.: 2.4817 3rd Qu.: 1.6879 3rd Qu.: 1.6840 \n Max. :11.057 Max. :11.1881 Max. :10.8837 Max. :10.9561 \n HSPC_640 HSPC_641 HSPC_643 HSPC_644 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 1.025 Median : 1.000 Median : 1.706 Median : 0.4904 \n Mean : 2.136 Mean : 1.957 Mean : 2.468 Mean : 2.4726 \n 3rd Qu.: 2.119 3rd Qu.: 2.001 3rd Qu.: 3.329 3rd Qu.: 5.6227 \n Max. :11.173 Max. :11.056 Max. :12.016 Max. :11.0232 \n HSPC_645 HSPC_646 HSPC_648 HSPC_649 \n Min. : 0.0000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.7157 Median : 0.9959 Median : 1.519 Median : 0.7139 \n Mean : 2.3517 Mean : 2.0594 Mean : 2.267 Mean : 2.3593 \n 3rd Qu.: 4.5630 3rd Qu.: 2.3154 3rd Qu.: 2.722 3rd Qu.: 4.1542 \n Max. :10.9922 Max. :11.6070 Max. :11.243 Max. :10.7707 \n HSPC_651 HSPC_652 HSPC_654 HSPC_656 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. :0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000 \n Median : 0.000 Median : 0.000 Median : 1.398 Median :0.000 \n Mean : 2.550 Mean : 1.764 Mean : 2.108 Mean :1.983 \n 3rd Qu.: 5.615 3rd Qu.: 2.038 3rd Qu.: 2.562 3rd Qu.:2.505 \n Max. :11.202 Max. :10.897 Max. :10.367 Max. :9.673 \n HSPC_657 HSPC_658 HSPC_660 HSPC_661 \n Min. : 0.000 Min. : 0.000 Min. :0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median :1.253 Median : 1.491 \n Mean : 1.839 Mean : 2.319 Mean :2.542 Mean : 2.401 \n 3rd Qu.: 2.239 3rd Qu.: 4.021 3rd Qu.:5.274 3rd Qu.: 2.775 \n Max. :12.132 Max. :11.264 Max. :9.852 Max. :11.647 \n HSPC_662 HSPC_663 HSPC_664 HSPC_665 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000 \n Median : 0.000 Median : 0.000 Median : 0.9407 Median : 0.6452 \n Mean : 2.298 Mean : 2.726 Mean : 2.4039 Mean : 2.1211 \n 3rd Qu.: 2.939 3rd Qu.: 6.519 3rd Qu.: 3.4095 3rd Qu.: 2.0744 \n Max. :11.277 Max. :12.152 Max. :10.9423 Max. :12.0111 \n HSPC_666 HSPC_667 HSPC_668 HSPC_669 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.130 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.815 Mean : 2.075 Mean : 2.245 Mean : 1.992 \n 3rd Qu.: 6.359 3rd Qu.: 2.549 3rd Qu.: 2.407 3rd Qu.: 2.426 \n Max. :11.052 Max. :11.406 Max. :11.061 Max. :11.752 \n HSPC_670 HSPC_671 HSPC_672 HSPC_673 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.336 Mean : 2.349 Mean : 2.041 Mean : 2.148 \n 3rd Qu.: 3.188 3rd Qu.: 3.777 3rd Qu.: 2.057 3rd Qu.: 2.723 \n Max. :11.021 Max. :10.846 Max. :11.212 Max. :11.579 \n HSPC_674 HSPC_676 HSPC_678 HSPC_679 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 1.525 Median : 1.531 \n Mean : 1.801 Mean : 2.239 Mean : 2.298 Mean : 2.133 \n 3rd Qu.: 1.892 3rd Qu.: 3.097 3rd Qu.: 3.089 3rd Qu.: 2.737 \n Max. :10.875 Max. :10.496 Max. :12.125 Max. :11.583 \n HSPC_680 HSPC_681 HSPC_682 HSPC_683 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 1.037 Median : 1.043 Median : 1.180 \n Mean : 2.573 Mean : 2.277 Mean : 2.586 Mean : 2.498 \n 3rd Qu.: 4.165 3rd Qu.: 4.210 3rd Qu.: 5.432 3rd Qu.: 3.929 \n Max. :11.100 Max. :10.154 Max. :11.095 Max. :10.859 \n HSPC_687 HSPC_689 HSPC_690 HSPC_692 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 2.091 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.136 Mean : 2.489 Mean : 2.686 Mean : 2.285 \n 3rd Qu.: 2.911 3rd Qu.: 4.106 3rd Qu.: 5.055 3rd Qu.: 3.427 \n Max. :11.380 Max. :10.693 Max. :10.408 Max. :12.242 \n HSPC_695 HSPC_696 HSPC_697 HSPC_698 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.2681 Median : 1.538 Median : 1.271 Median : 0.000 \n Mean : 1.6151 Mean : 2.688 Mean : 2.529 Mean : 2.531 \n 3rd Qu.: 0.6895 3rd Qu.: 5.560 3rd Qu.: 4.779 3rd Qu.: 4.387 \n Max. :12.4139 Max. :10.880 Max. :10.292 Max. :12.146 \n HSPC_699 HSPC_700 HSPC_701 HSPC_702 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 1.157 Median : 0.000 \n Mean : 2.586 Mean : 2.402 Mean : 2.401 Mean : 2.723 \n 3rd Qu.: 4.595 3rd Qu.: 4.797 3rd Qu.: 3.889 3rd Qu.: 4.822 \n Max. :11.389 Max. :10.630 Max. :11.750 Max. :11.805 \n HSPC_703 HSPC_704 HSPC_705 HSPC_706 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 2.193 Median : 0.000 Median : 0.9795 Median : 1.273 \n Mean : 2.543 Mean : 2.598 Mean : 2.5048 Mean : 2.364 \n 3rd Qu.: 3.935 3rd Qu.: 4.335 3rd Qu.: 5.0680 3rd Qu.: 3.492 \n Max. :11.710 Max. :11.488 Max. :11.3580 Max. :10.447 \n HSPC_707 HSPC_708 HSPC_709 HSPC_714 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.361 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.371 Mean : 2.509 Mean : 2.601 Mean : 2.326 \n 3rd Qu.: 3.626 3rd Qu.: 3.832 3rd Qu.: 5.060 3rd Qu.: 3.324 \n Max. :11.796 Max. :10.865 Max. :10.145 Max. :11.126 \n HSPC_716 HSPC_717 HSPC_719 HSPC_720 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.000 Median : 1.154 Median : 1.855 Median : 0.8206 \n Mean : 2.325 Mean : 2.302 Mean : 2.519 Mean : 2.5768 \n 3rd Qu.: 3.356 3rd Qu.: 2.833 3rd Qu.: 4.115 3rd Qu.: 5.5594 \n Max. :11.812 Max. :11.047 Max. :12.237 Max. :10.5895 \n HSPC_721 HSPC_722 HSPC_723 HSPC_724 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000 \n Median : 2.113 Median : 1.185 Median : 0.8421 Median : 0.6485 \n Mean : 2.205 Mean : 1.814 Mean : 2.6174 Mean : 1.9644 \n 3rd Qu.: 3.456 3rd Qu.: 2.269 3rd Qu.: 4.9545 3rd Qu.: 1.9402 \n Max. :10.706 Max. :10.709 Max. :11.5956 Max. :11.3505 \n HSPC_725 HSPC_727 HSPC_729 HSPC_730 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 1.577 Median : 1.576 Median : 0.9579 Median : 1.135 \n Mean : 2.483 Mean : 2.436 Mean : 2.2448 Mean : 2.445 \n 3rd Qu.: 3.741 3rd Qu.: 3.447 3rd Qu.: 2.7343 3rd Qu.: 3.475 \n Max. :10.647 Max. :11.512 Max. :10.9657 Max. :11.121 \n HSPC_731 HSPC_732 HSPC_733 HSPC_734 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 1.130 Median : 0.6937 Median : 1.436 Median : 0.7333 \n Mean : 2.854 Mean : 2.1051 Mean : 2.489 Mean : 2.5404 \n 3rd Qu.: 6.019 3rd Qu.: 2.0311 3rd Qu.: 3.738 3rd Qu.: 5.6282 \n Max. :10.471 Max. :11.0494 Max. :10.929 Max. :10.4547 \n HSPC_735 HSPC_736 HSPC_737 HSPC_738 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.033 Median : 0.6789 Median : 1.185 Median : 1.514 \n Mean : 2.389 Mean : 2.0224 Mean : 2.722 Mean : 2.503 \n 3rd Qu.: 3.056 3rd Qu.: 2.0017 3rd Qu.: 5.669 3rd Qu.: 3.602 \n Max. :10.866 Max. :11.8100 Max. :11.076 Max. :10.473 \n HSPC_740 HSPC_742 HSPC_743 HSPC_744 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.8437 Median : 1.122 Median : 1.213 \n Mean : 2.506 Mean : 1.8949 Mean : 2.028 Mean : 2.048 \n 3rd Qu.: 3.794 3rd Qu.: 1.7586 3rd Qu.: 2.840 3rd Qu.: 2.309 \n Max. :10.618 Max. :11.6327 Max. :10.449 Max. :10.598 \n HSPC_745 HSPC_746 HSPC_747 HSPC_748 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 2.403 Median : 2.184 Median : 0.000 Median : 1.181 \n Mean : 2.309 Mean : 2.153 Mean : 2.543 Mean : 2.017 \n 3rd Qu.: 3.793 3rd Qu.: 3.016 3rd Qu.: 4.751 3rd Qu.: 2.264 \n Max. :10.882 Max. :10.988 Max. :10.860 Max. :12.153 \n HSPC_749 HSPC_750 HSPC_751 HSPC_752 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.444 Median : 1.030 Median : 1.567 Median : 2.228 \n Mean : 2.477 Mean : 2.370 Mean : 2.416 Mean : 2.529 \n 3rd Qu.: 3.501 3rd Qu.: 3.052 3rd Qu.: 3.435 3rd Qu.: 3.976 \n Max. :11.391 Max. :11.167 Max. :10.239 Max. :10.586 \n HSPC_753 HSPC_755 HSPC_756 HSPC_757 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.062 Median : 0.740 Median : 1.731 Median : 1.395 \n Mean : 2.313 Mean : 2.102 Mean : 2.592 Mean : 2.477 \n 3rd Qu.: 2.961 3rd Qu.: 2.509 3rd Qu.: 4.107 3rd Qu.: 3.253 \n Max. :11.202 Max. :10.559 Max. :10.783 Max. :10.973 \n HSPC_758 HSPC_759 HSPC_760 HSPC_761 \n Min. : 0.0000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.8648 Median : 0.9415 Median : 1.052 Median : 0.6917 \n Mean : 2.6819 Mean : 2.1274 Mean : 2.288 Mean : 2.2992 \n 3rd Qu.: 4.7233 3rd Qu.: 2.2271 3rd Qu.: 2.404 3rd Qu.: 2.6015 \n Max. :11.1096 Max. :11.2534 Max. :11.008 Max. :11.7228 \n HSPC_762 HSPC_764 HSPC_765 HSPC_766 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 1.271 Median : 1.784 Median : 2.116 Median : 0.9828 \n Mean : 2.242 Mean : 2.068 Mean : 2.100 Mean : 2.1721 \n 3rd Qu.: 2.734 3rd Qu.: 3.059 3rd Qu.: 2.939 3rd Qu.: 2.6115 \n Max. :12.043 Max. :11.003 Max. :12.757 Max. :10.2002 \n HSPC_767 HSPC_768 HSPC_769 HSPC_770 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.6646 Median : 1.703 Median : 0.000 Median : 1.760 \n Mean : 1.9552 Mean : 2.365 Mean : 2.080 Mean : 2.343 \n 3rd Qu.: 1.9730 3rd Qu.: 3.325 3rd Qu.: 3.289 3rd Qu.: 3.122 \n Max. :11.3033 Max. :10.958 Max. :11.176 Max. :10.497 \n HSPC_771 HSPC_772 HSPC_773 HSPC_774 \n Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000 \n Median : 1.178 Median : 1.601 Median : 0.9901 Median : 0.9736 \n Mean : 2.527 Mean : 2.283 Mean : 1.8628 Mean : 2.5263 \n 3rd Qu.: 3.342 3rd Qu.: 2.828 3rd Qu.: 1.9851 3rd Qu.: 5.4694 \n Max. :11.156 Max. :10.625 Max. :10.7274 Max. :10.7701 \n HSPC_776 HSPC_777 HSPC_778 HSPC_780 \n Min. : 0.000 Min. : 0.000 Min. :0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 1.053 Median :1.435 Median : 1.178 \n Mean : 2.315 Mean : 2.110 Mean :2.130 Mean : 2.476 \n 3rd Qu.: 3.788 3rd Qu.: 2.673 3rd Qu.:3.488 3rd Qu.: 3.769 \n Max. :11.105 Max. :11.646 Max. :9.535 Max. :11.265 \n HSPC_781 HSPC_782 HSPC_783 HSPC_784 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.050 \n Mean : 1.911 Mean : 2.416 Mean : 2.254 Mean : 2.175 \n 3rd Qu.: 2.884 3rd Qu.: 3.872 3rd Qu.: 2.548 3rd Qu.: 2.468 \n Max. :11.445 Max. :10.161 Max. :10.970 Max. :10.958 \n HSPC_785 HSPC_786 HSPC_787 HSPC_788 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.000 Median : 1.148 Median : 0.000 Median : 0.9386 \n Mean : 2.230 Mean : 2.467 Mean : 2.100 Mean : 1.9749 \n 3rd Qu.: 2.466 3rd Qu.: 3.899 3rd Qu.: 2.991 3rd Qu.: 2.6662 \n Max. :11.041 Max. :11.080 Max. :10.690 Max. :11.1078 \n HSPC_789 HSPC_790 HSPC_791 HSPC_794 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.181 Median : 1.353 Median : 1.790 Median : 1.113 \n Mean : 2.225 Mean : 2.255 Mean : 2.699 Mean : 2.225 \n 3rd Qu.: 2.876 3rd Qu.: 2.852 3rd Qu.: 4.931 3rd Qu.: 2.768 \n Max. :11.245 Max. :11.558 Max. :11.104 Max. :11.118 \n HSPC_795 HSPC_796 HSPC_797 HSPC_798 \n Min. : 0.0000 Min. : 0.0000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.8317 Median : 0.7001 Median : 0.8722 Median : 1.531 \n Mean : 2.3985 Mean : 2.6865 Mean : 2.6172 Mean : 2.485 \n 3rd Qu.: 3.4461 3rd Qu.: 5.6688 3rd Qu.: 5.3078 3rd Qu.: 3.098 \n Max. :11.0956 Max. :11.0829 Max. :11.4339 Max. :10.933 \n HSPC_799 HSPC_800 HSPC_801 HSPC_802 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.033 \n Mean : 2.179 Mean : 2.173 Mean : 2.427 Mean : 2.613 \n 3rd Qu.: 3.517 3rd Qu.: 2.865 3rd Qu.: 4.665 3rd Qu.: 3.780 \n Max. :11.666 Max. :11.263 Max. :10.905 Max. :10.864 \n HSPC_803 HSPC_804 HSPC_806 HSPC_807 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.000 Median : 0.000 Median : 2.103 Median : 0.7501 \n Mean : 2.395 Mean : 2.301 Mean : 2.222 Mean : 2.2476 \n 3rd Qu.: 3.883 3rd Qu.: 3.167 3rd Qu.: 3.445 3rd Qu.: 2.3481 \n Max. :10.766 Max. :11.298 Max. :10.326 Max. :11.2700 \n HSPC_808 HSPC_809 HSPC_810 HSPC_812 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Median : 0.6619 Median : 1.788 Median : 1.651 Median : 0.8459 \n Mean : 2.1677 Mean : 2.544 Mean : 2.471 Mean : 2.2960 \n 3rd Qu.: 2.5355 3rd Qu.: 3.730 3rd Qu.: 3.662 3rd Qu.: 2.6906 \n Max. :10.9302 Max. :11.791 Max. :10.829 Max. :11.5500 \n HSPC_813 HSPC_814 HSPC_815 HSPC_816 \n Min. : 0.0000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.6278 Median : 1.110 Median : 0.9631 Median : 1.346 \n Mean : 2.2448 Mean : 2.762 Mean : 2.4587 Mean : 2.341 \n 3rd Qu.: 2.3066 3rd Qu.: 5.996 3rd Qu.: 3.4228 3rd Qu.: 2.842 \n Max. :12.0043 Max. :10.406 Max. :11.4527 Max. :11.151 \n HSPC_818 HSPC_819 HSPC_820 HSPC_821 \n Min. : 0.0000 Min. : 0.000 Min. : 0.0000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 \n Median : 0.9967 Median : 1.365 Median : 0.8099 Median : 1.382 \n Mean : 2.3081 Mean : 2.426 Mean : 2.1063 Mean : 2.532 \n 3rd Qu.: 2.9942 3rd Qu.: 3.632 3rd Qu.: 2.4643 3rd Qu.: 3.462 \n Max. :11.9931 Max. :10.672 Max. :11.2412 Max. :12.126 \n HSPC_822 HSPC_824 HSPC_825 HSPC_826 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.387 Median : 0.000 Median : 1.386 Median : 1.324 \n Mean : 2.503 Mean : 2.084 Mean : 2.162 Mean : 2.398 \n 3rd Qu.: 3.799 3rd Qu.: 2.342 3rd Qu.: 2.897 3rd Qu.: 3.150 \n Max. :11.892 Max. :11.365 Max. :11.498 Max. :11.198 \n HSPC_827 HSPC_828 HSPC_831 HSPC_832 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.746 Median : 1.003 Median : 1.304 Median : 1.035 \n Mean : 2.239 Mean : 2.145 Mean : 2.589 Mean : 2.384 \n 3rd Qu.: 2.638 3rd Qu.: 2.326 3rd Qu.: 3.866 3rd Qu.: 3.450 \n Max. :12.101 Max. :10.710 Max. :10.839 Max. :10.686 \n HSPC_833 HSPC_834 HSPC_835 HSPC_836 \n Min. : 0.0000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.7166 Median : 0.9245 Median : 1.006 Median : 0.000 \n Mean : 2.3553 Mean : 2.0872 Mean : 2.552 Mean : 2.471 \n 3rd Qu.: 3.9364 3rd Qu.: 2.4568 3rd Qu.: 4.034 3rd Qu.: 3.994 \n Max. :11.1695 Max. :11.1803 Max. :11.779 Max. :11.316 \n HSPC_837 HSPC_838 HSPC_839 HSPC_840 \n Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.312 Median : 0.9838 Median : 1.083 Median : 1.867 \n Mean : 2.590 Mean : 2.5281 Mean : 2.380 Mean : 2.548 \n 3rd Qu.: 4.443 3rd Qu.: 3.5551 3rd Qu.: 3.743 3rd Qu.: 3.609 \n Max. :10.672 Max. :11.2707 Max. :10.966 Max. :10.867 \n HSPC_841 HSPC_842 HSPC_843 HSPC_844 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.439 Median : 1.774 Median : 1.257 Median : 1.584 \n Mean : 2.408 Mean : 2.380 Mean : 2.845 Mean : 2.627 \n 3rd Qu.: 3.494 3rd Qu.: 3.490 3rd Qu.: 6.768 3rd Qu.: 3.951 \n Max. :10.930 Max. :11.137 Max. :11.933 Max. :11.446 \n HSPC_845 HSPC_846 HSPC_848 HSPC_849 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 1.227 Median : 1.401 Median : 0.000 Median : 1.602 \n Mean : 2.464 Mean : 2.240 Mean : 2.152 Mean : 2.402 \n 3rd Qu.: 3.377 3rd Qu.: 2.920 3rd Qu.: 2.554 3rd Qu.: 2.920 \n Max. :10.535 Max. :11.519 Max. :11.266 Max. :11.678 \n HSPC_851 HSPC_852 \n Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 \n Mean : 2.319 Mean : 2.143 \n 3rd Qu.: 3.373 3rd Qu.: 2.901 \n Max. :11.602 Max. :11.469 \n\n\nHmmmm, did you get all that? Nope, me neither! We have 701 cells but we only have 6 samples for the frogs. We will need a different approach to get an overview but I find it is still useful to look at the few columns\n🎬 Get a quick overview the first 20 columns:\n\nsummary(hspc[1:20])\n\n ensembl_gene_id HSPC_001 HSPC_002 HSPC_003 \n Length:280 Min. : 0.000 Min. : 0.000 Min. : 0.0000 \n Class :character 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 \n Mode :character Median : 0.000 Median : 0.000 Median : 0.9929 \n Mean : 2.143 Mean : 1.673 Mean : 2.5964 \n 3rd Qu.: 2.120 3rd Qu.: 2.239 3rd Qu.: 6.1559 \n Max. :12.567 Max. :11.976 Max. :11.1138 \n HSPC_004 HSPC_006 HSPC_008 HSPC_009 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. :0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000 \n Median : 0.000 Median : 1.276 Median : 0.000 Median :0.000 \n Mean : 1.851 Mean : 2.338 Mean : 2.375 Mean :2.220 \n 3rd Qu.: 2.466 3rd Qu.: 3.536 3rd Qu.: 3.851 3rd Qu.:3.594 \n Max. :11.133 Max. :10.014 Max. :11.574 Max. :9.997 \n HSPC_011 HSPC_012 HSPC_014 HSPC_015 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 1.750 Median : 0.000 Median : 0.000 \n Mean : 2.285 Mean : 2.431 Mean : 2.295 Mean : 2.515 \n 3rd Qu.: 3.193 3rd Qu.: 3.741 3rd Qu.: 3.150 3rd Qu.: 3.789 \n Max. :11.260 Max. :10.905 Max. :11.051 Max. :10.751 \n HSPC_016 HSPC_017 HSPC_018 HSPC_020 \n Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.9488 Median : 0.000 Median : 1.248 Median : 0.000 \n Mean : 2.6115 Mean : 2.146 Mean : 2.710 Mean : 2.509 \n 3rd Qu.: 5.9412 3rd Qu.: 2.357 3rd Qu.: 6.006 3rd Qu.: 4.470 \n Max. :11.3082 Max. :12.058 Max. :11.894 Max. :11.281 \n HSPC_021 HSPC_022 HSPC_023 HSPC_024 \n Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000 \n 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 \n Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000 \n Mean : 2.170 Mean : 2.287 Mean : 2.314 Mean : 2.195 \n 3rd Qu.: 2.996 3rd Qu.: 3.351 3rd Qu.: 2.749 3rd Qu.: 2.944 \n Max. :10.709 Max. :11.814 Max. :12.113 Max. :11.279 \n\n\nNotice that:\n\nthe maximum value is much less high than for the frogs and has decimals. That is because the mouse data are logged (to base 2) normalised counts, not raw counts as they are in the frog data set.\na minimum value of 0 appears in all 20 columns - perhaps that is true across the whole dataset (or at least common)\nat least some of the medians are zeros so there must be quite a lot of zeros\nthe few columns we can see are roughly similar\nit would not be very practical to plot the distributions of values in cell cell using facet_wrap().\n\nIn this data set, there is even more of an advantage of using the pivot_longer(), group_by() and summarise() approach. We will be able to open the dataframe in the Viewer and make plots to examine whether the distributions are similar across cells.\n🎬 Summarise all the cells:\n\nhspc_summary_samp <- hspc |>\n pivot_longer(cols = -ensembl_gene_id,\n names_to = \"cell\",\n values_to = \"expr\") |>\n group_by(cell) |>\n summarise(min = min(expr),\n lowerq = quantile(expr, 0.25),\n mean = mean(expr),\n median = median(expr),\n sd = sd(expr),\n upperq = quantile(expr, 0.75),\n max = max(expr),\n n_zero = sum(expr == 0))\n\nNotice that I have used cell as the column name rather than sample and expr (expression) rather than count. I’ve also added the standard deviation.\n🎬 View the hspc_summary_samp dataframe (click on it in the environment).\nAll cells have quite a few zeros and the lower quartile is 0 for all cells, i.e., every cell has many genes with zero expression.\nTo get a better understanding of the distribution of expressions in cells we can create a ggplot using the pointrange geom. Pointrange puts a dot at the mean and a line between a minimum and a maximum such as +/- one s.d. Not unlike a boxplot, but when you need the boxes too be very narrow!\n🎬 Create a pointrange plot.\n\nhspc_summary_samp |> \n ggplot(aes(x = cell, y = mean)) +\n geom_pointrange(aes(ymin = mean - sd, \n ymax = mean + sd ),\n size = 0.1)\n\n\n\n\n\n\n\nYou will need to use the Zoom button to pop the plot window out so you can make it as wide as possible\nThe things to notice are:\n\nthe average expression in cells is similar for all cells. This is good to know - if some cells had much lower expression perhaps there is something wrong with them, or their sequencing, and they should be excluded.\nthe distributions are roughly similar in width too\n\nThe default order of cell is alphabetical. It can be easier to see these (non-) effects if we order the lines by the size of the mean.\n🎬 Order a pointrange plot with reorder(variable_to_order, order_by).\n\nhspc_summary_samp |> \n ggplot(aes(x = reorder(cell, mean), y = mean)) +\n geom_pointrange(aes(ymin = mean - sd, \n ymax = mean + sd ),\n size = 0.1)\n\n\n\n\n\n\n\nreorder() arranges cell in increasing size of mean\n🎬 Write hspc_summary_samp to a file called “hspc_summary_samp.csv”:\nDistribution of values across the genes\n🐸 Frog genes\nThere are lots of genes in this dataset therefore we will take the same approach as that we took for the distributions across mouse cells. We will pivot the data to tidy and then summarise the counts for each gene.\n🎬 Summarise the counts for each genes:\n\ns30_summary_gene <- s30 |>\n pivot_longer(cols = -xenbase_gene_id,\n names_to = \"sample\",\n values_to = \"count\") |>\n group_by(xenbase_gene_id) |>\n summarise(min = min(count),\n lowerq = quantile(count, 0.25),\n sd = sd(count),\n mean = mean(count),\n median = median(count),\n upperq = quantile(count, 0.75),\n max = max(count),\n total = sum(count),\n n_zero = sum(count == 0))\n\nI have calculated the values we used before with one addition: the sum of the counts (total).\n🎬 View the s30_summary_gene dataframe.\nNotice that we have:\n\na lot of genes with counts of zero in every sample\na lot of genes with zero counts in several of the samples\nsome very very low counts.\n\nThese should be filtered out because they are unreliable - or, at the least, uninformative. The goal of our downstream analysis will be to see if there is a significant difference in gene expression between the control and FGF-treated sibling. Since we have only three replicates in each group, having one or two unreliable, missing or zero values, makes such a determination impossible for a particular gene. We will use the total counts and the number of samples with non-zero values to filter our genes later.\nAs we have a lot of genes, it is again helpful to plot the mean counts with pointrange to get an overview. We will plot the log of the counts - we saw earlier that logging made it easier to understand the distribution of counts over such a wide range. We will also order the genes from lowest to highest mean count.\n🎬 Plot the logged mean counts for each gene in order of size using geom_pointrange():\n\ns30_summary_gene |> \n ggplot(aes(x = reorder(xenbase_gene_id, mean), y = log10(mean))) +\n geom_pointrange(aes(ymin = log10(mean - sd), \n ymax = log10(mean + sd )),\n size = 0.1)\n\n\n\n\n\n\n\n(Remember, the warning is expected since we have zeros).\nYou can see we also have quite a few genes with means less than 1 (log below zero). Note that the variability between genes (average counts between 0 and 102586) is far greater than between samples (average counts from 260 to 426) which is exactly what we would expect to see.\n🎬 Write s30_summary_gene to a file called “s30_summary_gene.csv”:\n🐭 Mouse genes\nThere are fewer genes in this dataset, but still more than you can understand without the overview provided by a plot. We will again pivot the data to tidy and then summarise the expression for each gene.\n🎬 Summarise the expression for each genes:\n\nhspc_summary_gene <- hspc |>\n pivot_longer(cols = -ensembl_gene_id,\n names_to = \"cell\",\n values_to = \"expr\") |>\n group_by(ensembl_gene_id) |>\n summarise(min = min(expr),\n lowerq = quantile(expr, 0.25),\n sd = sd(expr),\n mean = mean(expr),\n median = median(expr),\n upperq = quantile(expr, 0.75),\n max = max(expr),\n total = sum(expr),\n n_zero = sum(expr == 0))\n\n🎬 View the hspc_summary_gene dataframe. Remember these are normalised and logged (base 2) so we should not see very large values.\nNotice that we have:\n\nno genes with 0 in every cell\nvery few genes (9) with no zeros at all\nquite a few genes with zero in many cells but this matters less than zeros in the frog samples because we had just 6 samples and we have 701 cells.\n\nAs we have a lot of genes, it is again helpful to plot the mean expression with pointrange to get an overview. We do not need to log the values but ordering the genes will help.\n🎬 Plot the logged mean counts for each gene in order of size using geom_pointrange():\n\nhspc_summary_gene |> \n ggplot(aes(x = reorder(ensembl_gene_id, mean), y = mean)) +\n geom_pointrange(aes(ymin = mean - sd, \n ymax = mean + sd),\n size = 0.1)\n\n\n\n\n\n\n\nNote again that the variability between genes (average expression between 0.02 and and 10.03) is far greater than between cells (average expression from1.46 to 3.18) which is expected.\n🎬 Write s30_summary_gene to a file called “s30_summary_gene.csv”:",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Workshop"
- ]
+ "section": "RStudio terminal",
+ "text": "RStudio terminal\nThe RStudio terminal is a convenient interface to the shell without leaving RStudio. It is useful for running commands that are not available in R. For example, you can use it to run other programs like fasqc, git, ftp, ssh\nNavigating your file system\nSeveral commands are frequently used to create, inspect, rename, and delete files and directories.\n$\nThe dollar sign is the prompt (like > on the R console), which shows us that the shell is waiting for input.\nYou can find out where you are using the pwd command, which stands for “print working directory”.\n\npwd\n\n/home/runner/work/BIO00088H-data/BIO00088H-data/core/week-2-old\n\n\nYou can find out what you can see with ls which stands for “list”.\n\nls\n\ndata\nimages\noverview.html\noverview.qmd\nstudy_after_workshop.qmd\nstudy_before_workshop.ipynb\nstudy_before_workshop.qmd\nworkshop.html\nworkshop.qmd\nworkshop.rmarkdown\nworkshop_files\n\n\nYou might have noticed that unlike R, the commands do not have brackets after them. Instead, options (or switches) are given after the command. For example, we can modify the ls command to give us more information with the -l option, which stands for “long”.\n\nls -l\n\ntotal 156\ndrwxr-xr-x 2 runner docker 4096 Oct 2 14:01 data\ndrwxr-xr-x 2 runner docker 4096 Oct 2 14:01 images\n-rw-r--r-- 1 runner docker 24690 Oct 2 14:12 overview.html\n-rw-r--r-- 1 runner docker 1597 Oct 2 14:01 overview.qmd\n-rw-r--r-- 1 runner docker 184 Oct 2 14:01 study_after_workshop.qmd\n-rw-r--r-- 1 runner docker 4807 Oct 2 14:01 study_before_workshop.ipynb\n-rw-r--r-- 1 runner docker 13029 Oct 2 14:01 study_before_workshop.qmd\n-rw-r--r-- 1 runner docker 58063 Oct 2 14:01 workshop.html\n-rw-r--r-- 1 runner docker 8550 Oct 2 14:01 workshop.qmd\n-rw-r--r-- 1 runner docker 8590 Oct 2 14:12 workshop.rmarkdown\ndrwxr-xr-x 3 runner docker 4096 Oct 2 14:01 workshop_files\n\n\nYou can use more than one option at once. The -h option stands for “human readable” and makes the file sizes easier to understand for humans:\n\nls -hl\n\ntotal 156K\ndrwxr-xr-x 2 runner docker 4.0K Oct 2 14:01 data\ndrwxr-xr-x 2 runner docker 4.0K Oct 2 14:01 images\n-rw-r--r-- 1 runner docker 25K Oct 2 14:12 overview.html\n-rw-r--r-- 1 runner docker 1.6K Oct 2 14:01 overview.qmd\n-rw-r--r-- 1 runner docker 184 Oct 2 14:01 study_after_workshop.qmd\n-rw-r--r-- 1 runner docker 4.7K Oct 2 14:01 study_before_workshop.ipynb\n-rw-r--r-- 1 runner docker 13K Oct 2 14:01 study_before_workshop.qmd\n-rw-r--r-- 1 runner docker 57K Oct 2 14:01 workshop.html\n-rw-r--r-- 1 runner docker 8.4K Oct 2 14:01 workshop.qmd\n-rw-r--r-- 1 runner docker 8.4K Oct 2 14:12 workshop.rmarkdown\ndrwxr-xr-x 3 runner docker 4.0K Oct 2 14:01 workshop_files\n\n\nThe -a option stands for “all” and shows us all the files, including hidden files.\n\nls -alh\n\ntotal 164K\ndrwxr-xr-x 5 runner docker 4.0K Oct 2 14:12 .\ndrwxr-xr-x 8 runner docker 4.0K Oct 2 14:01 ..\ndrwxr-xr-x 2 runner docker 4.0K Oct 2 14:01 data\ndrwxr-xr-x 2 runner docker 4.0K Oct 2 14:01 images\n-rw-r--r-- 1 runner docker 25K Oct 2 14:12 overview.html\n-rw-r--r-- 1 runner docker 1.6K Oct 2 14:01 overview.qmd\n-rw-r--r-- 1 runner docker 184 Oct 2 14:01 study_after_workshop.qmd\n-rw-r--r-- 1 runner docker 4.7K Oct 2 14:01 study_before_workshop.ipynb\n-rw-r--r-- 1 runner docker 13K Oct 2 14:01 study_before_workshop.qmd\n-rw-r--r-- 1 runner docker 57K Oct 2 14:01 workshop.html\n-rw-r--r-- 1 runner docker 8.4K Oct 2 14:01 workshop.qmd\n-rw-r--r-- 1 runner docker 8.4K Oct 2 14:12 workshop.rmarkdown\ndrwxr-xr-x 3 runner docker 4.0K Oct 2 14:01 workshop_files\n\n\nYou can move about with the cd command, which stands for “change directory”. You can use it to move into a directory by specifying the path to the directory:\n\ncd data\npwd\ncd ..\npwd\ncd data\npwd\n\n/home/runner/work/BIO00088H-data/BIO00088H-data/core/week-2-old/data\n/home/runner/work/BIO00088H-data/BIO00088H-data/core/week-2-old\n/home/runner/work/BIO00088H-data/BIO00088H-data/core/week-2-old/data\n\n\nhead 1cq2.pdb\nHEADER OXYGEN STORAGE/TRANSPORT 04-AUG-99 1CQ2 \nTITLE NEUTRON STRUCTURE OF FULLY DEUTERATED SPERM WHALE MYOGLOBIN AT 2.0 \nTITLE 2 ANGSTROM \nCOMPND MOL_ID: 1; \nCOMPND 2 MOLECULE: MYOGLOBIN; \nCOMPND 3 CHAIN: A; \nCOMPND 4 ENGINEERED: YES; \nCOMPND 5 OTHER_DETAILS: PROTEIN IS FULLY DEUTERATED \nSOURCE MOL_ID: 1; \nSOURCE 2 ORGANISM_SCIENTIFIC: PHYSETER CATODON; \nhead -20 data/1cq2.pdb\nHEADER OXYGEN STORAGE/TRANSPORT 04-AUG-99 1CQ2 \nTITLE NEUTRON STRUCTURE OF FULLY DEUTERATED SPERM WHALE MYOGLOBIN AT 2.0 \nTITLE 2 ANGSTROM \nCOMPND MOL_ID: 1; \nCOMPND 2 MOLECULE: MYOGLOBIN; \nCOMPND 3 CHAIN: A; \nCOMPND 4 ENGINEERED: YES; \nCOMPND 5 OTHER_DETAILS: PROTEIN IS FULLY DEUTERATED \nSOURCE MOL_ID: 1; \nSOURCE 2 ORGANISM_SCIENTIFIC: PHYSETER CATODON; \nSOURCE 3 ORGANISM_COMMON: SPERM WHALE; \nSOURCE 4 ORGANISM_TAXID: 9755; \nSOURCE 5 EXPRESSION_SYSTEM: ESCHERICHIA COLI; \nSOURCE 6 EXPRESSION_SYSTEM_TAXID: 562; \nSOURCE 7 EXPRESSION_SYSTEM_VECTOR_TYPE: PLASMID; \nSOURCE 8 EXPRESSION_SYSTEM_PLASMID: PET15A \nKEYWDS HELICAL, GLOBULAR, ALL-HYDROGEN CONTAINING STRUCTURE, OXYGEN STORAGE- \nKEYWDS 2 TRANSPORT COMPLEX \nEXPDTA NEUTRON DIFFRACTION \nAUTHOR F.SHU,V.RAMAKRISHNAN,B.P.SCHOENBORN \nless 1cq2.pdb\nless is a program that displays the contents of a file, one page at a time. It is useful for viewing large files because it does not load the whole file into memory before displaying it. Instead, it reads and displays a few lines at a time. You can navigate forward through the file with the spacebar, and backwards with the b key. Press q to quit.\nA wildcard is a character that can be used as a substitute for any of a class of characters in a search, The most common wildcard characters are the asterisk (*) and the question mark (?).\nls *.csv\ncp stands for “copy”. You can copy a file from one directory to another by giving cp the path to the file you want to copy and the path to the destination directory.\ncp 1cq2.pdb copy_of_1cq2.pdb\ncp 1cq2.pdb ../copy_of_1cq2.pdb\ncp 1cq2.pdb ../bob.txt\nTo delete a file use the rm command, which stands for “remove”.\nrm ../bob.txt\nbut be careful because the file will be gone forever. There is no “are you sure?” or undo.\nTo move a file from one directory to another, use the mv command. mv works like cp except that it also deletes the original file.\nmv ../copy_of_1cq2.pdb .\nMake a directory\nmkdir mynewdir"
},
{
- "objectID": "transcriptomics/week-3/workshop.html#filtering-for-qc",
- "href": "transcriptomics/week-3/workshop.html#filtering-for-qc",
+ "objectID": "core/week-2-old/workshop.html#differences-between-r-and-python",
+ "href": "core/week-2-old/workshop.html#differences-between-r-and-python",
"title": "Workshop",
- "section": "Filtering for QC",
- "text": "Filtering for QC\n🐸 Frog filtering\nOur samples look to be similarly well sequenced. There are no samples we should remove. However, some genes are not express or the expression values are so low in for a gene that they are uninformative. We will filter the s30_summary_gene dataframe to obtain a list of xenbase_gene_id we can use to filter s30.\nMy suggestion is to include only the genes with counts in at least 3 samples3 and those with total counts above 20.\n🎬 Filter the summary by gene dataframe:\n\ns30_summary_gene_filtered <- s30_summary_gene |> \n filter(total > 20) |> \n filter(n_zero < 4)\n\n🎬 Write the filtered summary by gene to file:\n\nwrite_csv(s30_summary_gene_filtered, \n file = \"data-processed/s30_summary_gene_filtered.csv\")\n\n🎬 Use the list of xenbase_gene_id in the filtered summary to filter the original dataset:\n\ns30_filtered <- s30 |> \n filter(xenbase_gene_id %in% s30_summary_gene_filtered$xenbase_gene_id)\n\n🎬 Write the filtered original to file:\n\nwrite_csv(s30_filtered, \n file = \"data-processed/s30_filtered.csv\")\n\n🐭 Mouse filtering\nWe will take a different approach to filtering the single cell data. For the Frog samples we are examining the control and the FGF treated samples. This means have a low number of counts overall means the gene is not really expressed (detected) in any condition, and filtering out those genes is removing things that definitely are not interesting. For the mice, we have examined only one cell type but will be making comparisons between cells types. It may be that low expression of a gene in this cell type tells us something if that gene is highly expressed in another cell type. Instead, we will make statistical comparisons between the cell types and then filter based on overall expression, the difference in expression between cell types and whether that difference is significant.\nThe number of “replicates” is also important. When you have only three in each group it is not possible to make statistical comparisons when several replicates are zero. This is less of an issue with single cell data.",
+ "section": "Differences between R and python",
+ "text": "Differences between R and python\nDemo\nYou’re finished!"
+ },
+ {
+ "objectID": "core/week-2/study_after_workshop.html",
+ "href": "core/week-2/study_after_workshop.html",
+ "title": "Independent Study to consolidate this week",
+ "section": "",
+ "text": "These are suggestions\n\nWant github co-pilot?\n🎬 Create a GitHub account\n🎬 Apply for student benefits\nUpdate R and RStudio\n🎬 Update R\n🎬 Update RStudio.\nInstall package building tools\n🎬 Windows Install Rtools\n🎬 Mac install Xcode from Mac App Store\nUpdate packages:\n🎬 devtools, tidyverse, BiocManager, readxl",
"crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Workshop"
+ "Core Supporting Info",
+ "Week 2: Supporting Information 1",
+ "Consolidate!"
]
},
{
- "objectID": "transcriptomics/week-3/workshop.html#look-after-future-you",
- "href": "transcriptomics/week-3/workshop.html#look-after-future-you",
+ "objectID": "core/week-2/workshop.html#session-overview",
+ "href": "core/week-2/workshop.html#session-overview",
"title": "Workshop",
- "section": "🤗 Look after future you!",
- "text": "🤗 Look after future you!\nYou need only do the section for your own project data\n🐸 Frogs and future you\n🎬 Create a new Project, frogs-88H, populated with folders and your data. Make a script file called cont-fgf-s30.R. This will a be commented analysis of the control vs FGF at S30 comparison. You will build on this each workshop and be able to use it as a template to examine other comparisons. Copy in the appropriate code and comments from workshop-1.R. Edit to improve your comments where your understanding has developed since you made them. Make sure you can close down RStudio, reopen it and run your whole script again.\n🐭 Mice and future you\n🎬 Create a new Project, mice-88H, populated with folders and your data. Make a script file called hspc-prog.R. This will a be commented analysis of the hspc cells vs the prog cells. At this point you will have only code for the hspc cells. You will build on this each workshop and be able to use it as a template to examine other comparisons. Copy in the appropriate code and comments from workshop-1.R. Edit to improve your comments where your understanding has developed since you made them. Make sure you can close down RStudio, reopen it and run your whole script again.\n🍂 xxxx and future you",
+ "section": "Session overview",
+ "text": "Session overview\nIn this workshop we will discuss why reproducibility matters and how to organise your work to make it reproducible. We will cover:\n\n\nWhat is reproducibility\nHow to achieve reproducibility\nRationale for scripting\nProject-oriented workflow\nCode formatting and style\nCoding algorithmically\nNaming things\nAnd some handy workflow tips",
"crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
+ "Core Supporting Info",
+ "Week 2: Supporting Information 1",
"Workshop"
]
},
{
- "objectID": "transcriptomics/week-3/workshop.html#footnotes",
- "href": "transcriptomics/week-3/workshop.html#footnotes",
+ "objectID": "core/week-2/workshop.html#what-is-reproducibility",
+ "href": "core/week-2/workshop.html#what-is-reproducibility",
"title": "Workshop",
- "section": "Footnotes",
- "text": "Footnotes\n\nThis a result of the Central limit theorem,one consequence of which is that adding together lots of distributions - whatever distributions they are - will tend to a normal distribution.↩︎\nThis a result of the Central limit theorem,one consequence of which is that adding together lots of distributions - whatever distributions they are - will tend to a normal distribution.↩︎\nI chose three because that would keep [0, 0, 0] [#,#,#]. This is difference we cannot test statistically, but which would matter biologically.↩︎",
- "crumbs": [
- "Transcriptomics",
- "Week 3: Hello data!",
- "Workshop"
- ]
- },
- {
- "objectID": "core/week-6/study_after_workshop.html",
- "href": "core/week-6/study_after_workshop.html",
- "title": "Independent Study to consolidate this week",
- "section": "",
- "text": "These are suggestions",
- "crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
- "Consolidate!"
- ]
- },
- {
- "objectID": "core/week-6/study_after_workshop.html#bio00088h-group-research-project-students",
- "href": "core/week-6/study_after_workshop.html#bio00088h-group-research-project-students",
- "title": "Independent Study to consolidate this week",
- "section": "BIO00088H Group Research Project students",
- "text": "BIO00088H Group Research Project students\n\nRevise previous Data Analysis materials. You can find the version you took on the VLE site for 17C / 08C. However, my latest versions (in development) are here: Data Analysis in R. The Becoming a Bioscientist (BABS) modules replace the Laboratory and Professional Skills modules. BABS1 and BABS2 are stage one, and I’ve tried to improve them over 17C / 08C. The site is also searchable (icon top right)",
- "crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
- "Consolidate!"
- ]
- },
- {
- "objectID": "core/week-6/study_after_workshop.html#msc-bioinformatics-students-doing-bio00070m",
- "href": "core/week-6/study_after_workshop.html#msc-bioinformatics-students-doing-bio00070m",
- "title": "Independent Study to consolidate this week",
- "section": "MSc Bioinformatics students doing BIO00070M",
- "text": "MSc Bioinformatics students doing BIO00070M\n\nMake sure you carry out the preparatory work for week 2 of 52M",
- "crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
- "Consolidate!"
- ]
- },
- {
- "objectID": "core/week-6/overview.html",
- "href": "core/week-6/overview.html",
- "title": "Overview",
- "section": "",
- "text": "This week you will revise some essential concepts for scientific computing: file system organisation, file types, working directories and paths. The workshop will cover a rationale for working reproducibly, project oriented workflow, naming things and documenting your work. We will also examine some file types and the concept of tidy data.\n\nLearning objectives\nThe successful student will be able to:\n\nexplain the organisation of files and directories in a file systems including root, home and working directories\nexplain absolute and relative file paths\nexplain why working reproducibly is important\nknow how to use a project-oriented workflow to organise work\nbe able to give files human- and machine-readable names\noutline some common biological data file formats\n\n\n\nInstructions\n\nPrepare\n\n📖 Read Understanding file systems\n\nWorkshop\nConsolidate",
- "crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
- "About"
- ]
- },
- {
- "objectID": "core/week-6-old/study_after_workshop.html",
- "href": "core/week-6-old/study_after_workshop.html",
- "title": "Independent Study to consolidate this week",
- "section": "",
- "text": "There is no consolidation work other than to continue revising what you have learned over the course of your degree about data analysis."
- },
- {
- "objectID": "core/week-6-old/overview.html",
- "href": "core/week-6-old/overview.html",
- "title": "Overview",
- "section": "",
- "text": "This week’s session is a drop-in and introduces no new material. Instead, it is an opportunity to ask questions about the content from Core 1 and 2 and to revise skills from stage 1 and 2 as needed.\n\nInstructions\n\nPrepare\n\n📖 Review content from Core 1 and 2\n\nWorkshop\n\n💻 Ask questions about the content from Core 1 and 2 as needed\n💻 Revise skills from stage 1 and 2 (88H students) or 52M (70M students) as needed\n\nConsolidate\n\nThere is no consolidation work for this drop-in"
- },
- {
- "objectID": "core/week-1-old/study_after_workshop.html",
- "href": "core/week-1-old/study_after_workshop.html",
- "title": "Independent Study to consolidate this week",
- "section": "",
- "text": "These are suggestions"
- },
- {
- "objectID": "core/week-1-old/study_after_workshop.html#bio00088h-group-research-project-students",
- "href": "core/week-1-old/study_after_workshop.html#bio00088h-group-research-project-students",
- "title": "Independent Study to consolidate this week",
- "section": "BIO00088H Group Research Project students",
- "text": "BIO00088H Group Research Project students\n\nRevise previous Data Analysis materials. You can find the version you took on the VLE site for 17C / 08C. However, my latest versions (in development) are here: Data Analysis in R. The Becoming a Bioscientist (BABS) modules replace the Laboratory and Professional Skills modules. BABS1 and BABS2 are stage one, and I’ve tried to improve them over 17C / 08C. The site is also searchable (icon top right)"
- },
- {
- "objectID": "core/week-1-old/study_after_workshop.html#msc-bioinformatics-students-doing-bio00070m",
- "href": "core/week-1-old/study_after_workshop.html#msc-bioinformatics-students-doing-bio00070m",
- "title": "Independent Study to consolidate this week",
- "section": "MSc Bioinformatics students doing BIO00070M",
- "text": "MSc Bioinformatics students doing BIO00070M\n\nMake sure you carry out the preparatory work for week 2 of 52M"
- },
- {
- "objectID": "core/week-1-old/overview.html",
- "href": "core/week-1-old/overview.html",
- "title": "Overview",
- "section": "",
- "text": "This week you will revise some essential concepts for scientific computing: file system organisation, file types, working directories and paths. The workshop will cover a rationale for working reproducibly, project oriented workflow, naming things and documenting your work. We will also examine some file types and the concept of tidy data.\n\nLearning objectives\nThe successful student will be able to:\n\nexplain the organisation of files and directories in a file systems including root, home and working directories\nexplain absolute and relative file paths\nexplain why working reproducibly is important\nknow how to use a project-oriented workflow to organise work\nbe able to give files human- and machine-readable names\noutline some common biological data file formats\n\n\n\nInstructions\n\nPrepare\n\n📖 Read Understanding file systems\n\nWorkshop\nConsolidate"
- },
- {
- "objectID": "core/core.html",
- "href": "core/core.html",
- "title": "Core: Supporting Information",
- "section": "",
- "text": "futureself, CC-BY-NC, by Julen Colomb\n\n\nThere are two workshops taken by everyone on BIO00088H. These are in weeks 2 and 6. These are important in understanding both how to assemble, curate and document your “Supporting Information” and how to work reproducibly so future you (Spring semester you) can painlessly work with past you and your work is demonstrably repeatable. This is essential because you will want to be able to set work aside for holidays and assessment periods and then restart easily. The Supporting Information you submit with your Report will be be assessed on its organisation, reproducibility and documentation.\nBIO00070M students do week 1 and 6 of the core workshops along with weeks 3, 4 and 5 of transcriptomics.\n\n\nWhy reproducibility matters, project-oriented workflow, organisation and naming things. You will also learn how to recognise and write cool 😎 code, not 😩 ugly code and code algorithmically and discover some awesome short cuts to help you write cool 😎 code.\n\n\n\nDocumenting your Supporting Information with a read me and appropriate code commenting, curating code, non-coded processing",
- "crumbs": [
- "Core Supporting Info",
- "Core: Supporting Information"
- ]
- },
- {
- "objectID": "core/core.html#week-1-core-supporting-information-1",
- "href": "core/core.html#week-1-core-supporting-information-1",
- "title": "Core: Supporting Information",
- "section": "",
- "text": "Why reproducibility matters, project-oriented workflow, organisation and naming things. You will also learn how to recognise and write cool 😎 code, not 😩 ugly code and code algorithmically and discover some awesome short cuts to help you write cool 😎 code.",
- "crumbs": [
- "Core Supporting Info",
- "Core: Supporting Information"
- ]
- },
- {
- "objectID": "core/core.html#week-6-core-supporting-information-2",
- "href": "core/core.html#week-6-core-supporting-information-2",
- "title": "Core: Supporting Information",
- "section": "",
- "text": "Documenting your Supporting Information with a read me and appropriate code commenting, curating code, non-coded processing",
+ "section": "What is reproducibility?",
+ "text": "What is reproducibility?\n\n\nThe Turing Way's definitions of reproducible research",
"crumbs": [
"Core Supporting Info",
- "Core: Supporting Information"
+ "Week 2: Supporting Information 1",
+ "Workshop"
]
},
{
- "objectID": "core/week-2/study_before_workshop.html",
- "href": "core/week-2/study_before_workshop.html",
- "title": "Independent Study to prepare for workshop",
- "section": "",
- "text": "📖 Read Understanding file systems. This is an approximately 15 - 20 minute read revising file types and file systems. It covers concepts of working directories and paths. We learned these ideas in stage 1 and you may feel completely confident with them but many students will benefit from a refresher. For BIO00070M students, this is part of the work you will also be asked to complete for BIO00052M Data Analysis in R.\n📖 Read Workflow in RStudio. You may find it helpful to remind yourself about RStudio Projects. In previous years, you have submitted an “RStudio Project” as part of your BABS work. In this module, you will submit “Supporting Information” for your Project Report. The Supporting Information is a documented and organised collection of all the digital parts of your research project. This includes data (or instructions for accessing data), code and/or non-coded processing, instructions for use, computational requirements and outputs. The Supporting Information could be a single RStudio Project (like you have done previously but with better documentation) or a folder that includes an RStudio Project and other material/scripts.",
+ "objectID": "core/week-2/workshop.html#definitions",
+ "href": "core/week-2/workshop.html#definitions",
+ "title": "Workshop",
+ "section": "Definitions",
+ "text": "Definitions\n\n\nThe Turing Way's definitions of reproducible research\n\n\nReproducible: Same data + same analysis = identical results. “… obtaining consistent results using the same input data; computational steps, methods, and code; and conditions of analysis. This definition is synonymous with”computational reproducibility” (National Academies of Sciences et al. 2019). This is what we are concentrating on in the Supporting Information.",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
- "Prepare!"
+ "Workshop"
]
},
{
- "objectID": "core/week-2/workshop.html#session-overview",
- "href": "core/week-2/workshop.html#session-overview",
+ "objectID": "core/week-2/workshop.html#definitions-1",
+ "href": "core/week-2/workshop.html#definitions-1",
"title": "Workshop",
- "section": "Session overview",
- "text": "Session overview\nIn this workshop we will discuss why reproducibility matters and how to organise your work to make it reproducible. We will cover:\nWhat is reproducibility How to achieve reproducibility Rationale for scripting Project-oriented workflow",
+ "section": "Definitions",
+ "text": "Definitions\n\n\nThe Turing Way's definitions of reproducible research\n\n\nReplicable: Different data + same analysis = qualitatively similar results. The work is not dependent on the specificities of the data.",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -615,11 +406,11 @@
]
},
{
- "objectID": "core/week-2/workshop.html#what-is-reproducibility",
- "href": "core/week-2/workshop.html#what-is-reproducibility",
+ "objectID": "core/week-2/workshop.html#definitions-2",
+ "href": "core/week-2/workshop.html#definitions-2",
"title": "Workshop",
- "section": "What is reproducibility?",
- "text": "What is reproducibility?\n\nReproducible: Same data + same analysis = identical results. “… obtaining consistent results using the same input data; computational steps, methods, and code; and conditions of analysis. This definition is synonymous with”computational reproducibility” (National Academies of Sciences et al. 2019)\nReplicable: Different data + same analysis = qualitatively similar results. The work is not dependent on the specificities of the data.\nRobust: Same data + different analysis = qualitatively similar or identical results. The work is not dependent on the specificities of the analysis.\nGeneralisable: Different data + different analysis = qualitatively similar results and same conclusions.",
+ "section": "Definitions",
+ "text": "Definitions\n\n\nThe Turing Way's definitions of reproducible research\n\n\nRobust: Same data + different analysis = qualitatively similar or identical results. The work is not dependent on the specificities of the analysis.",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -627,11 +418,11 @@
]
},
{
- "objectID": "core/week-2/workshop.html#what-is-reproducibility-1",
- "href": "core/week-2/workshop.html#what-is-reproducibility-1",
+ "objectID": "core/week-2/workshop.html#definitions-3",
+ "href": "core/week-2/workshop.html#definitions-3",
"title": "Workshop",
- "section": "What is reproducibility?",
- "text": "What is reproducibility?\n\n\nThe Turing Way's definitions of reproducible research",
+ "section": "Definitions",
+ "text": "Definitions\n\n\nThe Turing Way's definitions of reproducible research\n\n\nGeneralisable: Different data + different analysis = qualitatively similar results and same conclusions.",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -643,7 +434,7 @@
"href": "core/week-2/workshop.html#why-does-it-matter",
"title": "Workshop",
"section": "Why does it matter?",
- "text": "Why does it matter?\n\n\nFive selfish reasons to work reproducibly (Markowetz 2015). Alternatively, see the very entertaining talk\nMany high profile cases of work which did not reproduce e.g. Anil Potti unravelled by Baggerly and Coombes (2009)\nWill become standard in Science and publishing e.g OECD Global Science Forum Building digital workforce capacity and skills for data-intensive science (OECD Global Science Forum 2020)",
+ "text": "Why does it matter?\n\n\nMany high profile cases of work which did not reproduce e.g. Anil Potti unravelled by Baggerly and Coombes (2009)\nFive selfish reasons to work reproducibly (Markowetz 2015). Alternatively, see the very entertaining talk\nWill become standard in Science and publishing e.g OECD Global Science Forum Building digital workforce capacity and skills for data-intensive science (OECD Global Science Forum 2020)",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -655,7 +446,7 @@
"href": "core/week-2/workshop.html#how-to-achieve-reproducibility",
"title": "Workshop",
"section": "How to achieve reproducibility",
- "text": "How to achieve reproducibility\n\nReproducibility is a continuum. Some is better than none!\nScript everything\nOrganisation: Project-oriented workflows with file and folder structure, naming things\nCode: follow a consistent style, organise into sections and scripts (be modular), Code algorithmically\nDocumentation: Readme files, code comments, metadata, version control, continuous integration",
+ "text": "How to achieve reproducibility\n\nReproducibility is a continuum. Some is better than none!\nScript everything\nOrganisation: Project-oriented workflows with file and folder structure, naming things\nCode: follow a consistent style, organise into sections and scripts (be modular), Code algorithmically\nDocumentation: Readme files, code comments, metadata,\nMore advanced: version, control, continuous integration and testing (not required for SI)",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -691,7 +482,7 @@
"href": "core/week-2/workshop.html#example-si-itself-is-an-rsp",
"title": "Workshop",
"section": "Example: SI itself is an RSP",
- "text": "Example: SI itself is an RSP\n\n-- stem_cell_rna\n |__stem_cell_rna.Rproj \n |__raw_ data/ \n |__2019-03-21_donor_1.csv\n |__2019-03-21_donor_2.csv\n |__2019-03-21_donor_3.csv\n |__README. md\n |__R/\n |__01_data_processing.R\n |__02_exploratory.R\n |__functions/\n |__theme_volcano.R\n |__normalise.R\n\nbash: --: invalid option\nUsage: bash [GNU long option] [option] ...\n bash [GNU long option] [option] script-file ...\nGNU long options:\n --debug\n --debugger\n --dump-po-strings\n --dump-strings\n --help\n --init-file\n --login\n --noediting\n --noprofile\n --norc\n --posix\n --pretty-print\n --rcfile\n --restricted\n --verbose\n --version\nShell options:\n -ilrsD or -c command or -O shopt_option (invocation only)\n -abefhkmnptuvxBCHP or -o option",
+ "text": "Example: SI itself is an RSP\n\n-- stem_cell_rna\n |__stem_cell_rna.Rproj \n |__raw_ data/ \n |__2019-03-21_donor_1.csv\n |__2019-03-21_donor_2.csv\n |__2019-03-21_donor_3.csv\n |__README. md\n |__R/\n |__01_data_processing.R\n |__02_exploratory.R\n |__functions/\n |__theme_volcano.R\n |__normalise.R",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -703,7 +494,7 @@
"href": "core/week-2/workshop.html#example-si-includes-an-rsp",
"title": "Workshop",
"section": "Example: SI includes an RSP",
- "text": "Example: SI includes an RSP\n\n\n-- stem_cell_rna\n |__data_processing/\n |__01_data_processing.py\n |__02_exploratory.py\n |__raw_data/\n |__2019-03-21_donor_1.csv\n |__2019-03-21_donor_2.csv\n |__2019-03-21_donor_3.csv\n |__README. md\n |__statistical_analysis\n |__statistical_analysis.Rproj \n |__processed_data/\n |__R/\n |__01_DGE.R\n |__02_visualisation.R\n |__functions/\n |__theme_volcano.R\n |__normalise.R\n\nbash: line 2: --: command not found\nbash: -c: line 3: syntax error near unexpected token `|'\nbash: -c: line 3: ` |__data_processing/'",
+ "text": "Example: SI includes an RSP\n\n-- stem_cell_rna\n |__data_processing/\n |__01_data_processing.py\n |__02_exploratory.py\n |__raw_data/\n |__2019-03-21_donor_1.csv\n |__2019-03-21_donor_2.csv\n |__2019-03-21_donor_3.csv\n |__README. md\n |__statistical_analysis\n |__statistical_analysis.Rproj \n |__processed_data/\n |__R/\n |__01_DGE.R\n |__02_visualisation.R\n |__functions/\n |__theme_volcano.R\n |__normalise.R",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -727,7 +518,7 @@
"href": "core/week-2/workshop.html#rstudio-projects-1",
"title": "Workshop",
"section": "RStudio Projects",
- "text": "RStudio Projects\n\n\n\n-- stem_cell_rna\n |__stem_cell_rna.Rproj \n |__raw_ data/ \n |__2019-03-21_donor_1.csv\n |__README. md\n |__R/\n |__01_data_processing.R\n |__02_exploratory.R\n |__functions/\n |__theme_volcano.R\n |__normalise.R\n\n\nThe project directory is the folder at the top 1\n\nThanks to Mine Çetinkaya-Rundel who helped me work out how to highlight a line https://gist.github.com/mine-cetinkaya-rundel/3af3415eab70a65be3791c3dcff6e2e3. Note to futureself: the engine: knitr matters.",
+ "text": "RStudio Projects\n\n\n\n-- stem_cell_rna\n |__stem_cell_rna.Rproj \n |__raw_ data/ \n |__2019-03-21_donor_1.csv\n |__README. md\n |__R/\n |__01_data_processing.R\n |__02_exploratory.R\n |__functions/\n |__theme_volcano.R\n |__normalise.R\n\n\nThe project directory is the folder at the top",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -739,7 +530,7 @@
"href": "core/week-2/workshop.html#rstudio-projects-2",
"title": "Workshop",
"section": "RStudio Projects",
- "text": "RStudio Projects\n\n\n\n-- stem_cell_rna\n |__stem_cell_rna.Rproj \n |__raw_ data/ \n |__2019-03-21_donor_1.csv\n |__README. md\n |__R/\n |__01_data_processing.R\n |__02_exploratory.R\n |__functions/\n |__theme_volcano.R\n |__normalise.R\n\n\nthe .RProj file is directly under the project folder. Its presence is what makes the folder an RStudio Project",
+ "text": "RStudio Projects\n\n\n\n-- stem_cell_rna\n |__stem_cell_rna.Rproj \n |__raw_ data/ \n |__2019-03-21_donor_1.csv\n |__README. md\n |__R/\n |__01_data_processing.R\n |__02_exploratory.R\n |__functions/\n |__theme_volcano.R\n |__normalise.R\n\n\nthe .RProj file is directly under the project folder1. Its presence is what makes the folder an RStudio Project\n\nThanks to Mine Çetinkaya-Rundel who helped me work out how to highlight a line https://gist.github.com/mine-cetinkaya-rundel/3af3415eab70a65be3791c3dcff6e2e3. Note to futureself: the engine: knitr matters.",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -775,7 +566,31 @@
"href": "core/week-2/workshop.html#creating-an-rstudio-project",
"title": "Workshop",
"section": "Creating an RStudio Project",
- "text": "Creating an RStudio Project\nThere are two menus options:\n\nTop left, File menu\nTop Right, drop-down indicated by the .RProj icon\n\nThey both do the same thing.\nIn both cases you choose: New Project | New Directory | New Project\nMake sure you “Browse” to the folder you want to create the project.\n❔ Is your working directory a good place to create a Project folder?\nWhen you create a new RStudio Project\n\n\nA folder called bananas/ is created\nRStudio starts a new session in bananas/ i.e., your working directory is now bananas/\n\nA file called bananas.Rproj is created\nthe .Rproj file is what makes the directory an RStudio Project",
+ "text": "Creating an RStudio Project\nThere are two menus options:\n\nTop left, File menu\nTop Right, drop-down indicated by the .RProj icon\n\nThey both do the same thing.",
+ "crumbs": [
+ "Core Supporting Info",
+ "Week 2: Supporting Information 1",
+ "Workshop"
+ ]
+ },
+ {
+ "objectID": "core/week-2/workshop.html#creating-an-rstudio-project-1",
+ "href": "core/week-2/workshop.html#creating-an-rstudio-project-1",
+ "title": "Workshop",
+ "section": "Creating an RStudio Project",
+ "text": "Creating an RStudio Project\nThen Choose: New Project | New Directory | New Project\nMake sure you “Browse” to the folder you want to create the project.\n❔ Is your working directory a good place to create a Project folder?",
+ "crumbs": [
+ "Core Supporting Info",
+ "Week 2: Supporting Information 1",
+ "Workshop"
+ ]
+ },
+ {
+ "objectID": "core/week-2/workshop.html#creating-an-rstudio-project-2",
+ "href": "core/week-2/workshop.html#creating-an-rstudio-project-2",
+ "title": "Workshop",
+ "section": "Creating an RStudio Project",
+ "text": "Creating an RStudio Project\nWhen you create a new RStudio Project\n\n\nA folder called bananas/ is created\nRStudio starts a new session in bananas/ i.e., your working directory is now bananas/\n\nA file called bananas.Rproj is created\nthe .Rproj file is what makes the directory an RStudio Project",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -787,7 +602,19 @@
"href": "core/week-2/workshop.html#opening-and-closing",
"title": "Workshop",
"section": "Opening and closing",
- "text": "Opening and closing\nYou can close an RStudio Project with ONE of:\n\nFile | Close Project\nUsing the drop-down option on the far right of the tool bar where you see the Project name\n\n\nYou can open an RStudio Project with ONE of:\n\nFile | Open Project or File | Recent Projects\n\nUsing the drop-down option on the far right of the tool bar where you see the Project name\n\nDouble-clicking an .Rproj file from your file explorer/finder\n\nWhen you open project, a new R session starts.",
+ "text": "Opening and closing\nYou can close an RStudio Project with ONE of:\n\nFile | Close Project\nUsing the drop-down option on the far right of the tool bar where you see the Project name",
+ "crumbs": [
+ "Core Supporting Info",
+ "Week 2: Supporting Information 1",
+ "Workshop"
+ ]
+ },
+ {
+ "objectID": "core/week-2/workshop.html#opening-and-closing-1",
+ "href": "core/week-2/workshop.html#opening-and-closing-1",
+ "title": "Workshop",
+ "section": "Opening and closing",
+ "text": "Opening and closing\nYou can open an RStudio Project with ONE of:\n\nFile | Open Project or File | Recent Projects\n\nUsing the drop-down option on the far right of the tool bar where you see the Project name\n\nDouble-clicking an .Rproj file from your file explorer/finder\n\nWhen you open project, a new R session starts.",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -799,7 +626,7 @@
"href": "core/week-2/workshop.html#code-formatting-and-style-1",
"title": "Workshop",
"section": "Code formatting and style",
- "text": "Code formatting and style\n\n“Good coding style is like correct punctuation: you can manage without it, butitsuremakesthingseasiertoread.”\n\nThe tidyverse style guide",
+ "text": "Code formatting and style\n\n“Good coding style is like correct punctuation: you can manage without it butitsuremakesthingseasiertoread.”\n\nThe tidyverse style guide\n\nCode is not write only.\nCode is communication!",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -823,7 +650,7 @@
"href": "core/week-2/workshop.html#code-formatting-and-style-3",
"title": "Workshop",
"section": "Code formatting and style",
- "text": "Code formatting and style\nSome keys points:\n\nbe consistent, emulate experienced coders\n\nuse snake_case for variable names (not CamelCase, dot.case)\n\nuse <- not = for assignment\n\nuse spacing around most operators and after commas\n\nuse indentation\n\navoid long lines, break up code blocks with new lines\n\nuse \" for quoting text (not ') unless the text contains double quotes",
+ "text": "Code formatting and style\nSome keys points:\n\n\nbe consistent, emulate experienced coders\n\nuse snake_case for variable names (not CamelCase, dot.case)\n\nuse <- (not =) for assignment\n\nuse spacing around most operators and after commas\n\nuse indentation\n\navoid long lines, break up code blocks with new lines\n\nuse \" for quoting text (not ') unless the text contains double quotes\n\nspace after # for comments",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -955,7 +782,7 @@
"href": "core/week-2/workshop.html#naming-things",
"title": "Workshop",
"section": "Naming things",
- "text": "Naming things\n\ndocuments, CC-BY-NC, https://xkcd.com/1459/Guiding principle - Have a convention! Good file names are:\n\nmachine readable\nhuman readable\nplay nicely with sorting",
+ "text": "Naming things\n\n\n\n\ndocuments, CC-BY-NC, https://xkcd.com/1459/\n\n\nGuiding principle - Have a convention! Good file names are:\n\nmachine readable\nhuman readable\nplay nicely with sorting",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -991,7 +818,7 @@
"href": "core/week-2/workshop.html#reading",
"title": "Workshop",
"section": "Reading",
- "text": "Reading\nCompletely optional suggestions for further reading\n\n\nProject-oriented workflow | What They Forgot to Teach You About R (Bryan et al., n.d.). Recommended if you still need convincing to use RStudio Projects\nTen simple rules for reproducible computational research (Sandve et al. 2013)\n\nGood enough practices in scientific computing (Wilson et al. 2017)\n\nExcuse Me, Do You Have a Moment to Talk About Version Control? (Bryan 2018)\n\n\nPages made with R (R Core Team 2024), Quarto (Allaire et al. 2024), knitr [Xie (2024); knitr2; knitr3], kableExtra (Zhu 2021)",
+ "text": "Reading\nCompletely optional suggestions for further reading\n\n\n\nProject-oriented workflow | What They Forgot to Teach You About R (Bryan et al., n.d.). Recommended if you still need convincing to use RStudio Projects\nTen simple rules for reproducible computational research (Sandve et al. 2013)\n\nGood enough practices in scientific computing (Wilson et al. 2017)\n\nExcuse Me, Do You Have a Moment to Talk About Version Control? (Bryan 2018)\n\n\nPages made with R (R Core Team 2024), Quarto (Allaire et al. 2024), knitr (Xie 2024, 2015, 2014), kableExtra (Zhu 2021)",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -1003,7 +830,7 @@
"href": "core/week-2/workshop.html#references",
"title": "Workshop",
"section": "References",
- "text": "References\n\n\n\n🔗 About Core: Supporting Information 1\n\n\n\n\nAllaire, J. J., Charles Teague, Carlos Scheidegger, Yihui Xie, and Christophe Dervieux. 2024. “Quarto.” https://doi.org/10.5281/zenodo.5960048.\n\n\nBaggerly, Keith A, and Kevin R Coombes. 2009. “DERIVING CHEMOSENSITIVITY FROM CELL LINES: FORENSIC BIOINFORMATICS AND REPRODUCIBLE RESEARCH IN HIGH-THROUGHPUT BIOLOGY.” Ann. Appl. Stat. 3 (4): 1309–34. https://doi.org/10.2307/27801549.\n\n\nBryan, Jennifer. 2018. “Excuse Me, Do You Have a Moment to Talk about Version Control?” Am. Stat. 72 (1): 20–27. https://doi.org/10.1080/00031305.2017.1399928.\n\n\nBryan, Jennifer, Jim Hester, Shannon Pileggi, and E. David Aja. n.d. What They Forgot to Teach You about r. https://rstats.wtf/.\n\n\nMarkowetz, Florian. 2015. “Five Selfish Reasons to Work Reproducibly.” Genome Biol. 16 (December): 274. https://doi.org/10.1186/s13059-015-0850-7.\n\n\nNational Academies of Sciences, Engineering, Medicine, Policy, Global Affairs, Engineering, Medicine Committee on Science, Public Policy, Board on Research Data, et al. 2019. Understanding Reproducibility and Replicability. National Academies Press (US). https://www.ncbi.nlm.nih.gov/books/NBK547546/.\n\n\nOECD Global Science Forum. 2020. “Building Digital Workforce Capacity and Skills for Data-Intensive Science.” http://www.oecd.org/officialdocuments/publicdisplaydocumentpdf/?cote=DSTI/STP/GSF(2020)6/FINAL&docLanguage=En.\n\n\nR Core Team. 2024. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.\n\n\nSandve, Geir Kjetil, Anton Nekrutenko, James Taylor, and Eivind Hovig. 2013. “Ten Simple Rules for Reproducible Computational Research.” PLoS Comput. Biol. 9 (10): e1003285. https://doi.org/10.1371/journal.pcbi.1003285.\n\n\nWilson, Greg, Jennifer Bryan, Karen Cranston, Justin Kitzes, Lex Nederbragt, and Tracy K Teal. 2017. “Good Enough Practices in Scientific Computing.” PLoS Comput. Biol. 13 (6): e1005510. https://doi.org/10.1371/journal.pcbi.1005510.\n\n\nXie, Yihui. 2024. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.\n\n\nZhu, Hao. 2021. “kableExtra: Construct Complex Table with ’Kable’ and Pipe Syntax.” https://CRAN.R-project.org/package=kableExtra.",
+ "text": "References\n\n\n\n🔗 About Core: Supporting Information 1\n\n\n\n\nAllaire, J. J., Charles Teague, Carlos Scheidegger, Yihui Xie, and Christophe Dervieux. 2024. “Quarto.” https://doi.org/10.5281/zenodo.5960048.\n\n\nBaggerly, Keith A, and Kevin R Coombes. 2009. “DERIVING CHEMOSENSITIVITY FROM CELL LINES: FORENSIC BIOINFORMATICS AND REPRODUCIBLE RESEARCH IN HIGH-THROUGHPUT BIOLOGY.” Ann. Appl. Stat. 3 (4): 1309–34. http://www.jstor.org/stable/27801549.\n\n\nBryan, Jennifer. 2018. “Excuse Me, Do You Have a Moment to Talk about Version Control?” Am. Stat. 72 (1): 20–27. https://doi.org/10.1080/00031305.2017.1399928.\n\n\nBryan, Jennifer, Jim Hester, Shannon Pileggi, and E. David Aja. n.d. What They Forgot to Teach You about r. https://rstats.wtf/.\n\n\nMarkowetz, Florian. 2015. “Five Selfish Reasons to Work Reproducibly.” Genome Biol. 16 (December): 274. https://doi.org/10.1186/s13059-015-0850-7.\n\n\nNational Academies of Sciences, Engineering, Medicine, Policy, Global Affairs, Engineering, Medicine Committee on Science, Public Policy, Board on Research Data, et al. 2019. Understanding Reproducibility and Replicability. National Academies Press (US). https://www.ncbi.nlm.nih.gov/books/NBK547546/.\n\n\nOECD Global Science Forum. 2020. “Building Digital Workforce Capacity and Skills for Data-Intensive Science.” http://www.oecd.org/officialdocuments/publicdisplaydocumentpdf/?cote=DSTI/STP/GSF(2020)6/FINAL&docLanguage=En.\n\n\nR Core Team. 2024. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.\n\n\nSandve, Geir Kjetil, Anton Nekrutenko, James Taylor, and Eivind Hovig. 2013. “Ten Simple Rules for Reproducible Computational Research.” PLoS Comput. Biol. 9 (10): e1003285. https://doi.org/10.1371/journal.pcbi.1003285.\n\n\nWilson, Greg, Jennifer Bryan, Karen Cranston, Justin Kitzes, Lex Nederbragt, and Tracy K Teal. 2017. “Good Enough Practices in Scientific Computing.” PLoS Comput. Biol. 13 (6): e1005510. https://doi.org/10.1371/journal.pcbi.1005510.\n\n\nXie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.\n\n\n———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.\n\n\n———. 2024. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.\n\n\nZhu, Hao. 2021. “kableExtra: Construct Complex Table with ’Kable’ and Pipe Syntax.” https://CRAN.R-project.org/package=kableExtra.",
"crumbs": [
"Core Supporting Info",
"Week 2: Supporting Information 1",
@@ -1011,953 +838,1389 @@
]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#overview",
- "href": "core/week-2-old/study_before_workshop.html#overview",
- "title": "Independent Study to prepare for workshop",
- "section": "Overview",
- "text": "Overview\n\nRStudio Projects revisited\n\nusing usethis package\nAdding a README\n\n\nFormatting code\nCode algorithmically / algebraically."
- },
- {
- "objectID": "core/week-2-old/study_before_workshop.html#reproducibility-is-a-continuum",
- "href": "core/week-2-old/study_before_workshop.html#reproducibility-is-a-continuum",
- "title": "Independent Study to prepare for workshop",
- "section": "Reproducibility is a continuum",
- "text": "Reproducibility is a continuum\nSome is better than none!\n\nOrganise your project\n\nScript everything.\n\nFormat code and follow a consistent style.\n\nCode algorithmically\nModularise your code: organise into sections and scripts\nDocument your project - commenting, READMEs\nUse literate programming e.g., R Markdown or Quarto\n\n\n\nMore advanced: Version control, continuous integration, environments, containers"
+ "objectID": "transcriptomics/week-5/study_after_workshop.html",
+ "href": "transcriptomics/week-5/study_after_workshop.html",
+ "title": "Independent Study to consolidate this week",
+ "section": "",
+ "text": "You need only do the section for one of the examples.\n🐸 Frogs\n🎬 Open your frogs-88H Project and script you began in the Consolidation study of Transcriptomics 1 and continued to work on in Transcriptomics 2. This is likely to be cont-fgf-s20.R or cont-fgf-s14.R. Use the code you used in the workshop (in cont-fgf-s30.R) as a template to visualise the s20/s14 results.\n🐭 Mice\n🎬 Open your mice-88H Project and the script you began in the Consolidation study of Transcriptomics 2. This is likely to be hspc-lthsc.R or lthsc-prog.R. Use the code you used in the workshop (in hspc-prog.R) as a template to visualise the hspc-lthsc/lthsc-prog results.\n🍂 xxxx\n🎬 Follow one of the other examples",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Consolidate!"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#rstudio-projects",
- "href": "core/week-2-old/study_before_workshop.html#rstudio-projects",
- "title": "Independent Study to prepare for workshop",
- "section": "RStudio Projects",
- "text": "RStudio Projects\n\n\nWe used RStudio Projects in stage one but they are so useful, it is worth covering them again in case you are not yet using them.\nWe will also cover the usethisworkflow to create an RStudio Project.\nRStudio Projects make it easy to manage working directories and paths because they set the working directory to the RStudio Projects directory automatically."
+ "objectID": "transcriptomics/week-5/workshop.html",
+ "href": "transcriptomics/week-5/workshop.html",
+ "title": "Workshop",
+ "section": "",
+ "text": "In the workshop, you will learn how to conduct and plot a Principle Component Analysis (PCA) as well as how to create a nicely formatted Volcano plot. You will also save significant genes to file to make it easier to identify genes of interest and perform Gene Ontology (GO) term enrichment analysis.\nimport log where needed write sig to file add go terms prep data for pca do pca and plot volcano go term enrichment",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#rstudio-projects-1",
- "href": "core/week-2-old/study_before_workshop.html#rstudio-projects-1",
- "title": "Independent Study to prepare for workshop",
- "section": "RStudio Projects",
- "text": "RStudio Projects\n\n\n\n-- stem_cell_rna\n |__stem_cell_rna.Rproj \n |__raw_ data/ \n |__2019-03-21_donor_1.csv\n |__README. md\n |__R/\n |__01_data_processing.R\n |__02_exploratory.R\n |__functions/\n |__theme_volcano.R\n |__normalise.R\n\n\nThe project directory is the folder at the top 1\n\nThanks to Mine Çetinkaya-Rundel who helped me work out how to highlight a line https://gist.github.com/mine-cetinkaya-rundel/3af3415eab70a65be3791c3dcff6e2e3. Note to futureself: the engine: knitr matters."
+ "objectID": "transcriptomics/week-5/workshop.html#session-overview",
+ "href": "transcriptomics/week-5/workshop.html#session-overview",
+ "title": "Workshop",
+ "section": "",
+ "text": "In the workshop, you will learn how to conduct and plot a Principle Component Analysis (PCA) as well as how to create a nicely formatted Volcano plot. You will also save significant genes to file to make it easier to identify genes of interest and perform Gene Ontology (GO) term enrichment analysis.\nimport log where needed write sig to file add go terms prep data for pca do pca and plot volcano go term enrichment",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#rstudio-projects-2",
- "href": "core/week-2-old/study_before_workshop.html#rstudio-projects-2",
- "title": "Independent Study to prepare for workshop",
- "section": "RStudio Projects",
- "text": "RStudio Projects\n\n\n\n-- stem_cell_rna\n |__stem_cell_rna.Rproj \n |__raw_ data/ \n |__2019-03-21_donor_1.csv\n |__README. md\n |__R/\n |__01_data_processing.R\n |__02_exploratory.R\n |__functions/\n |__theme_volcano.R\n |__normalise.R\n\n\nthe .RProj file is directly under the project folder. Its presence is what makes the folder an RStudio Project"
+ "objectID": "transcriptomics/week-5/workshop.html#frog-development",
+ "href": "transcriptomics/week-5/workshop.html#frog-development",
+ "title": "Workshop",
+ "section": "🐸 Frog development",
+ "text": "🐸 Frog development\n🎬 Open the frogs-88H RStudio Project and the cont-fgf-s30.R script.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#rstudio-projects-3",
- "href": "core/week-2-old/study_before_workshop.html#rstudio-projects-3",
- "title": "Independent Study to prepare for workshop",
- "section": "RStudio Projects",
- "text": "RStudio Projects\n\n\nWhen you open an RStudio Project, the working directory is set to the Project directory (i.e., the location of the .Rproj file).\nWhen you use an RStudio Project you do not need to use setwd()\nWhen someone, including future you, opens the project on another machine, all the paths just work."
+ "objectID": "transcriptomics/week-5/workshop.html#arabidopisis",
+ "href": "transcriptomics/week-5/workshop.html#arabidopisis",
+ "title": "Workshop",
+ "section": "🎄 Arabidopisis",
+ "text": "🎄 Arabidopisis\n🎬 Open the arabi-88H RStudio Project and the wildsuf-wilddef-s30.R script.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#rstudio-projects-4",
- "href": "core/week-2-old/study_before_workshop.html#rstudio-projects-4",
- "title": "Independent Study to prepare for workshop",
- "section": "RStudio Projects",
- "text": "RStudio Projects\n\nJenny BryanIn the words of Jenny Bryan:\n\n“If the first line of your R script is setwd(”C:/Users/jenny/path/that/only/I/have”) I will come into your office and SET YOUR COMPUTER ON FIRE”"
+ "objectID": "transcriptomics/week-5/workshop.html#leishmania-mexicana",
+ "href": "transcriptomics/week-5/workshop.html#leishmania-mexicana",
+ "title": "Workshop",
+ "section": "💉 Leishmania mexicana",
+ "text": "💉 Leishmania mexicana\n🎬 Open the leish-88H RStudio Project and the pro-meta-s30.R script.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#creating-an-rstudio-project",
- "href": "core/week-2-old/study_before_workshop.html#creating-an-rstudio-project",
- "title": "Independent Study to prepare for workshop",
- "section": "Creating an RStudio Project",
- "text": "Creating an RStudio Project\nThere are two ways to create an RStudio Project.\n\nUsing one of the two menus\nUsing the usethis package"
+ "objectID": "transcriptomics/week-5/workshop.html#stem-cells",
+ "href": "transcriptomics/week-5/workshop.html#stem-cells",
+ "title": "Workshop",
+ "section": "🐭 Stem cells",
+ "text": "🐭 Stem cells\n🎬 Open the mice-88H RStudio Project and the hspc-prog.R script.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#using-a-menu",
- "href": "core/week-2-old/study_before_workshop.html#using-a-menu",
- "title": "Independent Study to prepare for workshop",
- "section": "Using a menu",
- "text": "Using a menu\nThere are two menus:\n\nTop left, File menu\nTop Right, drop-down indicated by the .RProj icon\n\nThey both do the same thing.\nIn both cases you choose: New Project | New Directory | New Project\n\nMake sure you “Browse” to the folder you want to create the project."
+ "objectID": "transcriptomics/week-5/workshop.html#everyone",
+ "href": "transcriptomics/week-5/workshop.html#everyone",
+ "title": "Workshop",
+ "section": "Everyone",
+ "text": "Everyone\n🎬 Make a new folder figures in the project directory.\nThis is where we will save our figure files\n🎬 Load tidyverse (Wickham et al. 2019) and conflicted (Wickham 2023). You most likely have this code at the top of your script already.\n\nlibrary(tidyverse)\nlibrary(conflicted)\n\n── Attaching core tidyverse packages ─────────────────────────────────────────────── tidyverse 2.0.0 ──\n✔ dplyr 1.1.3 ✔ readr 2.1.4\n✔ forcats 1.0.0 ✔ stringr 1.5.0\n✔ ggplot2 3.4.3 ✔ tibble 3.2.1\n✔ lubridate 1.9.3 ✔ tidyr 1.3.0\n✔ purrr 1.0.2 \n── Conflicts ───────────────────────────────────────────────────────────────── tidyverse_conflicts() ──\n✖ dplyr::filter() masks stats::filter()\n✖ dplyr::lag() masks stats::lag()\nℹ Use the conflicted package to force all conflicts to become errors\nI recommend you set the dplyr versions of filter() and select() to use by default\n🎬 Use the dplyr version of filter() by default:\n\nconflicts_prefer(dplyr::filter)\nconflicts_prefer(dplyr::select)",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-1",
- "href": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-1",
- "title": "Independent Study to prepare for workshop",
- "section": "Using the usethis package",
- "text": "Using the usethis package\nI occasionally use the menu but I mostly use the usethis package.\n\n🎬 Go to RStudio and check your working directory:\n\ngetwd()\n\n\"C:/Users/er13/Desktop\"\n\n\n❔ Is your working directory a good place to create a Project folder?"
+ "objectID": "transcriptomics/week-5/workshop.html#everyone-1",
+ "href": "transcriptomics/week-5/workshop.html#everyone-1",
+ "title": "Workshop",
+ "section": "Everyone",
+ "text": "Everyone\n🎬 Import your results data. This should be a file in the results folder called xxxx_results.csv where xxxx indicates the comparison you made.\n🎬 Remind yourself what is in the rows and columns and the structure of the dataframes (perhaps using glimpse())\n\n\n\n\n\n\n\n\n\n\n\nWhen we do PCA we will want to label the samples with their treatment for figures. This labelling information is most easily added using the metadata. You will need to select only the samples for the comparison that was made in the results file. You may need to refer back to the Week 4 Statistical Analysis workshop to remind yourself how to import and select the metadata you need\n🎬 Import the metadata that maps the sample names to treatments. Remember to select only the samples for comparison that was made.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-2",
- "href": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-2",
- "title": "Independent Study to prepare for workshop",
- "section": "Using the usethis package",
- "text": "Using the usethis package\nIf this is a good place to create a Project directory then…\n🎬 Create a project with:\n\nusethis::create_project(\"bananas\")"
+ "objectID": "transcriptomics/week-5/workshop.html#frog-arab-and-leish",
+ "href": "transcriptomics/week-5/workshop.html#frog-arab-and-leish",
+ "title": "Workshop",
+ "section": "🐸 Frog, 🎄 Arab and 💉 Leish",
+ "text": "🐸 Frog, 🎄 Arab and 💉 Leish\n🎬 Design the code to log2 transform the normalised counts using the template given\nI recommend viewing the dataframe to see the new columns. Check you have the expected number of columns.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-3",
- "href": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-3",
- "title": "Independent Study to prepare for workshop",
- "section": "Using the usethis package",
- "text": "Using the usethis package\nOtherwise\nIf you want the project directory elsewhere, you will need to give the relative path, e.g.\n\nusethis::create_project(\"../Documents/bananas\")"
+ "objectID": "transcriptomics/week-5/workshop.html#stem-cells-1",
+ "href": "transcriptomics/week-5/workshop.html#stem-cells-1",
+ "title": "Workshop",
+ "section": "🐭 Stem cells",
+ "text": "🐭 Stem cells\ndo not because the data is already log2 transformed.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-4",
- "href": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-4",
- "title": "Independent Study to prepare for workshop",
- "section": "Using the usethis package",
- "text": "Using the usethis package\nThe output will look like this and a new RStudio session will start.\n> usethis::create_project(\"bananas\")\n√ Creating 'bananas/'\n√ Setting active project to 'C:/Users/er13/Desktop/bananas'\n√ Creating 'R/'\n√ Writing 'bananas.Rproj'\n√ Adding '.Rproj.user' to '.gitignore'\n√ Opening 'C:/Users/er13/Desktop/bananas/' in new RStudio session\n√ Setting active project to '<no active project>'"
+ "objectID": "transcriptomics/week-5/workshop.html#everyone-2",
+ "href": "transcriptomics/week-5/workshop.html#everyone-2",
+ "title": "Workshop",
+ "section": "Everyone",
+ "text": "Everyone\nWe now all have dataframes with all the information we need: normalised counts, log2 normalised counts, statistical comparisons with fold changes and p-values, and information about the gene.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-5",
- "href": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-5",
- "title": "Independent Study to prepare for workshop",
- "section": "Using the usethis package",
- "text": "Using the usethis package\nWhen you create a new RStudio Project with usethis:\n\n\nA folder called bananas/ is created\nRStudio starts a new session in bananas/ i.e., your working directory is now bananas/\n\nA folder called R/ is created\nA file called bananas.Rproj is created\nA file called .gitignore is created\nA hidden directory called .Rproj.user is created"
+ "objectID": "transcriptomics/week-5/workshop.html#everyone-3",
+ "href": "transcriptomics/week-5/workshop.html#everyone-3",
+ "title": "Workshop",
+ "section": "Everyone",
+ "text": "Everyone\nWe will create dataframe of the significant genes and write them to file. This is subset from the results file but will make it a little easier to examine and select genes of interest.\nThe general form of the code you need is:\n\n# DO NOT DO\n# create a dataframe of genes significant at 0.05 level\nxxxx_results_sig0.05 <- xxxx_results |> \n filter(padj <= 0.05)\n\nNote that you determine the significance level using the adjusted p-values (padj or FDR) rather than the uncorrected p-values.\n🎬 Create a dataframe of the genes significant at the 0.05 level.\n❓How many genes are significant at the 0.01 and 0.05 levels?\n\n\n\n\n\n\n🎬 Write the dataframe to a csv file. I recommend using the same file name as you used for the dataframe.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-6",
- "href": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-6",
- "title": "Independent Study to prepare for workshop",
- "section": "Using the usethis package",
- "text": "Using the usethis package\n\n\nthe .Rproj file is what makes the directory an RStudio Project\nthe Rproj.user directory is where project-specific temporary files are stored. You don’t need to mess with it.\nthe .gitignore is used for version controlled projects. If not using git, you can ignore it."
+ "objectID": "transcriptomics/week-5/workshop.html#frog-development-1",
+ "href": "transcriptomics/week-5/workshop.html#frog-development-1",
+ "title": "Workshop",
+ "section": "🐸 Frog development",
+ "text": "🐸 Frog development\n🎬 Transpose the log2 transformed normalised counts:\n\ns30_log2_trans <- s30_results |> \n select(starts_with(\"log2_\")) |>\n t() |> \n data.frame()\n\nWe have used the select() function to select all the columns that start with log2_. We then use the t() function to transpose the dataframe. We then convert the resulting matrix to a dataframe using data.frame(). If you view that dataframe you’ll see it has default column name which we can fix using colnames() to set the column names to the Xenbase gene ids.\n🎬 Set the column names to the Xenbase gene ids:\n\ncolnames(s30_log2_trans) <- s30_results$xenbase_gene_id\n\n🎬 Perform PCA on the log2 transformed normalised counts:\n\npca <- s30_log2_trans |>\n prcomp(rank. = 4) \n\nThe rank. argument tells prcomp() to only calculate the first 4 principal components. This is useful for visualisation as we can only plot in 2 or 3 dimensions. We can see the results of the PCA by viewing the summary() of the pca object.\n\nsummary(pca)\n\nImportance of first k=4 (out of 6) components:\n PC1 PC2 PC3 PC4\nStandard deviation 64.0124 47.3351 38.4706 31.4111\nProportion of Variance 0.4243 0.2320 0.1532 0.1022\nCumulative Proportion 0.4243 0.6562 0.8095 0.9116\n\n\nThe Proportion of Variance tells us how much of the variance is explained by each component. We can see that the first component explains 0.4243 of the variance, the second 0.2320, and the third 0.1532. Together the first three components explain nearly 81% of the total variance in the data. Plotting PC1 against PC2 will capture about 66% of the variance which is likely very much better than we would get plotting any two genes against each other. To plot the PC1 against PC2 we will need to extract the PC1 and PC2 “scores” from the PCA object and add labels for the samples. Those labels will come from the row names of the transformed data which has the sample ids and from the metadata.\n🎬 Create a vector of the sample ids from the row names. These include the log2 prefix which we can removed for labelling:\n\nsample_id <- row.names(s30_log2_trans) |> str_remove(\"log2_\")\n\nYou might want to check the result.\nNow we will extract the PC1 and PC2 scores from the PCA object and add. Our PCA object is called pca and the scores are in pca$x. We will create a dataframe of the scores and add the sample ids.\n🎬 Create a dataframe of PC1 and PC2 scores and add the sample ids:\n\npca_labelled <- data.frame(pca$x,\n sample_id)\n\n🎬 Merge with the metadata so we can label points by treatment and sibling pair:\n\npca_labelled <- pca_labelled |> \n left_join(meta_s30, \n by = \"sample_id\")\n\nSince the metadata contained the sample ids, it was especially important to remove the log2_ from the row names so that the join would work.\nThe dataframe should look like this:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nPC1\nPC2\nPC3\nPC4\nsample_id\nstage\ntreatment\nsibling_rep\n\n\n\n-76.38391\n0.814699\n-60.728327\n-5.820669\nS30_C_1\nstage_30\ncontrol\none\n\n\n-67.02571\n25.668563\n51.476835\n28.480254\nS30_C_2\nstage_30\ncontrol\ntwo\n\n\n-14.02772\n-78.474054\n15.282058\n-9.213076\nS30_C_3\nstage_30\ncontrol\nthree\n\n\n47.60726\n49.035510\n-19.288753\n20.928290\nS30_F_1\nstage_30\nFGF\none\n\n\n26.04954\n32.914201\n20.206072\n-55.752818\nS30_F_2\nstage_30\nFGF\ntwo\n\n\n83.78054\n-29.958919\n-6.947884\n21.378020\nS30_F_3\nstage_30\nFGF\nthree\n\n\n\n\n\nThe next task is to plot PC2 against PC1 and colour by sibling pair. This is just a scatterplot so we can use geom_point(). We will use colour to indicate the sibling pair and shape to indicate the treatment.\n🎬 Plot PC2 against PC1 and colour by sibling pair and shape by treatment:\n\npca_labelled |> \n ggplot(aes(x = PC1, y = PC2, \n colour = sibling_rep,\n shape = treatment)) +\n geom_point(size = 3) +\n theme_classic()\n\n\n\n\n\n\n\nThere is a good separation between treatments on PCA1. The sibling pairs do not seem to cluster together. You can also try plotting PC3 or PC4.\nI prefer to customise the colours and shapes. I especially like the\nviridis colour scales which provide colour scales that are perceptually uniform in both colour and black-and-white. They are also designed to be perceived by viewers with common forms of colour blindness. See Introduction to viridis for more information.\nggplot provides functions to access the viridis scales. Here I use scale_fill_viridis_d(). The d stands for discrete. The function scale_fill_viridis_c() would be used for continuous data. I’ve used the default “viridis” (or “D”) option (do ?scale_fill_viridis_d for all the options) and used the begin and end arguments to control the range of colour - I have set the range to be from 0.15 to 0.95 the avoid the strongest contrast. I have also set the name argument to provide a label for the legend.\nI have used scale_shape_manual() to set the shapes for the treatments. I have used the values 21 and 19 which are the codes for filled and open circles and filled triangles. I have set the name argument to NULL to remove the label (it’s obvious what that categories are treatments) and the labels argument to improve the legend.\n🎬 Plot PC2 against PC1 and colour by sibling pair and shape by treatment:\n\npca_labelled |> \n ggplot(aes(x = PC1, y = PC2, \n colour = sibling_rep,\n shape = treatment)) +\n geom_point(size = 3) +\n scale_colour_viridis_d(end = 0.95, begin = 0.15,\n name = \"Sibling pair\") +\n scale_shape_manual(values = c(21, 19),\n name = NULL,\n labels = c(\"Control\", \"FGF-Treated\")) +\n theme_classic()",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#opening-and-closing",
- "href": "core/week-2-old/study_before_workshop.html#opening-and-closing",
- "title": "Independent Study to prepare for workshop",
- "section": "Opening and closing",
- "text": "Opening and closing\nYou can close an RStudio Project with ONE of:\n\nFile | Close Project\nUsing the drop-down option on the far right of the tool bar where you see the Project name\n\n\nYou can open an RStudio Project with ONE of:\n\nFile | Open Project or File | Recent Projects\n\nUsing the drop-down option on the far right of the tool bar where you see the Project name\n\nDouble-clicking an .Rproj file from your file explorer/finder\n\nWhen you open project, a new R session starts."
+ "objectID": "transcriptomics/week-5/workshop.html#arabidopsis",
+ "href": "transcriptomics/week-5/workshop.html#arabidopsis",
+ "title": "Workshop",
+ "section": "🎄 Arabidopsis",
+ "text": "🎄 Arabidopsis",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-7",
- "href": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-7",
- "title": "Independent Study to prepare for workshop",
- "section": "Using the usethis package",
- "text": "Using the usethis package\nOnce the RStudio project has been created, usethis helps you follow good practice.\n\n🎬 We can add a README with:\n\nusethis::use_readme_md()\n\n\n\nThis creates a file called README.md, with a little default text, in the Project directory and opens it for editing.\n\n\nmd stands for markdown, it is a extremely widely used text formatting language which is readable as plain text. If you have ever used asterisks to make text bold or italic, you have used markdown."
+ "objectID": "transcriptomics/week-5/workshop.html#leishmainia-mexicana",
+ "href": "transcriptomics/week-5/workshop.html#leishmainia-mexicana",
+ "title": "Workshop",
+ "section": "💉 Leishmainia mexicana",
+ "text": "💉 Leishmainia mexicana",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#code-formatting-and-style-1",
- "href": "core/week-2-old/study_before_workshop.html#code-formatting-and-style-1",
- "title": "Independent Study to prepare for workshop",
- "section": "Code formatting and style",
- "text": "Code formatting and style\n\n“Good coding style is like correct punctuation: you can manage without it, butitsuremakesthingseasiertoread.”\n\nThe tidyverse style guide"
+ "objectID": "transcriptomics/week-5/workshop.html#stem-cells-2",
+ "href": "transcriptomics/week-5/workshop.html#stem-cells-2",
+ "title": "Workshop",
+ "section": "🐭 Stem cells",
+ "text": "🐭 Stem cells",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#code-formatting-and-style-2",
- "href": "core/week-2-old/study_before_workshop.html#code-formatting-and-style-2",
- "title": "Independent Study to prepare for workshop",
- "section": "Code formatting and style",
- "text": "Code formatting and style\nWe have all written code which is hard to read!\nWe all improve over time.\n\n\n\nThe only way to write good code is to write tons of shitty code first. Feeling shame about bad code stops you from getting to good code— Hadley Wickham (@hadleywickham) April 17, 2015"
+ "objectID": "transcriptomics/week-5/workshop.html#frog-development-2",
+ "href": "transcriptomics/week-5/workshop.html#frog-development-2",
+ "title": "Workshop",
+ "section": "🐸 Frog development",
+ "text": "🐸 Frog development\nWe will add a column to the results dataframe that contains the -log10(padj). You could perform this transformation within the plot command without adding a column to the data if you prefer.\n🎬 Add a column to the results dataframe that contains the -log10(padj):\n\ns30_results <- s30_results |> \n mutate(log10_padj = -log10(padj)) \n\n🎬 Create a volcano plot of the results:\n\ns30_results |> \n ggplot(aes(x = log2FoldChange, \n y = log10_padj)) +\n geom_point() +\n geom_hline(yintercept = -log10(0.05), \n linetype = \"dashed\") +\n geom_vline(xintercept = 2, \n linetype = \"dashed\") +\n geom_vline(xintercept = -2, \n linetype = \"dashed\") +\n scale_x_continuous(expand = c(0, 0)) +\n scale_y_continuous(expand = c(0, 0)) +\n theme_classic() +\n theme(legend.position = \"none\")\n\n\n\n\n\n\n\nOur dashed lines are at -log10(0.05) and log2(2) and log2(-2) to make more clear which genes (points) are significantly different between the control and the FGF-treated samples and have a fold change of at least 2.\nIn most cases, people colour the points to show that the quadrants. I like to add columns to the dataframe to indicate if the gene is significant and if the fold change is large and use those variables in the plot.\n🎬 Add columns to the results dataframe to indicate if the gene is significant and if the fold change is large:\n\ns30_results <- s30_results |> \n mutate(sig = padj <= 0.05,\n bigfc = abs(log2FoldChange) >= 2) \n\nThe use of abs() (absolute) means genes with a fold change of at least 2 in either direction will be considered to have a large fold change.\nNow we can colour the points by these new columns. I use interaction() to create four categories:\n\nnot significant and not large fold change (FF)\nsignificant and not large fold change (TF)\nnot significant and large fold (FT)\nsignificant and large fold change (TT)\n\nAnd I use scale_colour_manual() to set the colours for these categories.\n🎬 Create a volcano plot of the results with the points coloured by significance and fold change:\n\ns30_results |> \n ggplot(aes(x = log2FoldChange, \n y = log10_padj, \n colour = interaction(sig, bigfc))) +\n geom_point() +\n geom_hline(yintercept = -log10(0.05), \n linetype = \"dashed\") +\n geom_vline(xintercept = 2, \n linetype = \"dashed\") +\n geom_vline(xintercept = -2, \n linetype = \"dashed\") +\n scale_x_continuous(expand = c(0, 0)) +\n scale_y_continuous(expand = c(0, 0)) +\n scale_colour_manual(values = c(\"gray\", \n \"pink\",\n \"gray30\",\n \"deeppink\")) +\n theme_classic() +\n theme(legend.position = \"none\")\n\n\n\n\n\n\n\nFor exploring the data, I like add labels to all the significant genes with a large fold change so I can very quickly identity them. The ggrepel package has a function geom_text_repel() that is useful for adding labels so that they don’t overlap.\n🎬 Load the package:\n\nlibrary(ggrepel)\n\n🎬 Add labels to the significant genes with a large fold change:\n\ns30_results |> \n ggplot(aes(x = log2FoldChange, \n y = log10_padj, \n colour = interaction(sig, bigfc))) +\n geom_point() +\n geom_hline(yintercept = -log10(0.05), \n linetype = \"dashed\") +\n geom_vline(xintercept = 2, \n linetype = \"dashed\") +\n geom_vline(xintercept = -2, \n linetype = \"dashed\") +\n scale_x_continuous(expand = c(0, 0)) +\n scale_y_continuous(expand = c(0, 0)) +\n scale_colour_manual(values = c(\"gray\", \n \"pink\",\n \"gray30\",\n \"deeppink\")) +\n geom_text_repel(data = s30_results |> \n filter(bigfc == TRUE, sig == TRUE),\n aes(label = xenbase_gene_symbol),\n size = 3,\n max.overlaps = 50) +\n theme_classic() +\n theme(legend.position = \"none\")\n\n\n\n\n\n\n\nNotice that I have used filter() label only the genes that are both significant and have a large fold change. In systems you are familiar with, this labelling is very informative and can help you quickly identify common themes. Key to interpreting the volcano plot is to remember that positive fold changes means the gene is up-regulated in the FGF-treated samples and negative fold changes means the gene is down-regulated (i.e., higher in the control). This was determined by the order of the treatments in the contrast used in the DESeq2 analysis\nIf you do forget which way round you did the comparison, you can always examine the results dataframe to see which of the treatments seem to be higher for the positive fold changes.\nPlease note that Betsy doesn’t like graphs like this in the report!\nWhen you have a gene of interest, you may wish to label it on the plot. This is done in the same way except that you filter the data to only include the gene of interest. I have used and then use geom_label_repel() rather than geom_text_repel() to put the label in a box and nudged it’s position to get a line connecting the point and the label. I have also increased the size of the point.\n🎬 Add a label to one gene of interest (hoxb9.S) and :\n\ns30_results |> \n ggplot(aes(x = log2FoldChange, \n y = log10_padj, \n colour = interaction(sig, bigfc))) +\n geom_point() +\n geom_hline(yintercept = -log10(0.05), \n linetype = \"dashed\") +\n geom_vline(xintercept = 2, \n linetype = \"dashed\") +\n geom_vline(xintercept = -2, \n linetype = \"dashed\") +\n scale_x_continuous(expand = c(0, 0)) +\n scale_y_continuous(expand = c(0, 0)) +\n scale_colour_manual(values = c(\"gray\", \n \"pink\",\n \"gray30\",\n \"deeppink\")) +\n geom_label_repel(data = s30_results |> \n filter(xenbase_gene_symbol == \"hoxb9.S\"),\n aes(label = xenbase_gene_symbol),\n size = 4,\n nudge_x = .5,\n nudge_y = 1.5) +\n geom_point(data = s30_results |> \n filter(xenbase_gene_symbol == \"hoxb9.S\"),\n size = 3) +\n theme_classic() +\n theme(legend.position = \"none\")",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 5: Visualising and Interpreting",
+ "Workshop"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#code-formatting-and-style-3",
- "href": "core/week-2-old/study_before_workshop.html#code-formatting-and-style-3",
- "title": "Independent Study to prepare for workshop",
- "section": "Code formatting and style",
- "text": "Code formatting and style\nSome keys points:\n\nbe consistent, emulate experienced coders\n\nuse snake_case for variable names (not CamelCase, dot.case)\n\nuse <- not = for assignment\n\nuse spacing around most operators and after commas\n\nuse indentation\n\navoid long lines, break up code blocks with new lines\n\nuse \" for quoting text (not ') unless the text contains double quotes"
+ "objectID": "transcriptomics/transcriptomics.html",
+ "href": "transcriptomics/transcriptomics.html",
+ "title": "Transcriptomics Data Analysis for Group Project",
+ "section": "",
+ "text": "This week you will meet your data. There are four datasets, one for each project in this strand. The independent study will concisely cover how each of these four data sets were generated and how they have been processed before being given to you. It will also give an overview of the analysis we will carry out over three workshops. In the workshop, you will learn what steps to take to get a good understanding of transciptomics data before you consider any statistical analysis. This is an often overlooked, but very valuable and informative, part of any data pipeline. It will give you the understanding of the data and R data structures that you will need to code and trouble-shoot code. It will also allow you to spot failed or problematic samples and will inform your decisions on quality control. At the end of this workshop and the following independent study you will have performed quality control by filtering out uninformative genes and samples, and saved this filtered data for use in the next workshop. You will also have a script that you can use to repeat this process on other datasets.\n\n\n\nThis week we cover differential expression analysis on your quality controlled data. The independent study will allow you to check you have what you should have following the Transcriptomics 1: Hello Data workshop and Consolidation study. It then summarises the concepts and methods used to carry out differential expression analysis in workshop. In the workshop, you will perform the differential expression and learn how to compuationally annotate your genes with more information from the databases. This will include the Gene Ontology (GO) terms that describe the biological processes, molecular functions and cellular components that the gene is involved in. At the end of this workshop and the following independent study you will have files containing the genes which are differentially expressed, along with the statistical information, summary information and annotation. You will be able to consider which genes you want to investigates with your Project director and have what you need for the next workshop. You will also have a script that you can use to repeat this process on other datasets.\n\n\n\nThis week you will learn some how to do some common data visualisations for transcriptomic data. You will conduct and present a Principal Component Analysis (PCA) and a Volcano plot. We will also conduct a GO enrichment analysis. The independent study will allow you to check you have what you should have following the Transcriptomics 2: Statistical Analysis workshop and Consolidation study. At the end of this workshop and the following independent study you will at least two figures suitable for including in your report, along with an understanding of the results you can report on. You will also have a script that you can use to repeat this process on other datasets.\nReferences",
+ "crumbs": [
+ "Transcriptomics",
+ "Transcriptomics Data Analysis for Group Project"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#ugly-code",
- "href": "core/week-2-old/study_before_workshop.html#ugly-code",
- "title": "Independent Study to prepare for workshop",
- "section": "😩 Ugly code 😩",
- "text": "😩 Ugly code 😩\n\ndata<-read_csv('../data-raw/Y101_Y102_Y201_Y202_Y101-5.csv',skip=2)\nlibrary(janitor);sol<-clean_names(data)\ndata=data|>filter(str_detect(description,\"OS=Homo sapiens\"))|>filter(x1pep=='x')\ndata=data|>\nmutate(g=str_extract(description,\n\"GN=[^\\\\s]+\")|>str_replace(\"GN=\",''))\ndata<-data|>mutate(id=str_extract(accession,\"1::[^;]+\")|>str_replace(\"1::\",\"\"))"
+ "objectID": "transcriptomics/transcriptomics.html#transcriptomics-1-hello-data",
+ "href": "transcriptomics/transcriptomics.html#transcriptomics-1-hello-data",
+ "title": "Transcriptomics Data Analysis for Group Project",
+ "section": "",
+ "text": "This week you will meet your data. There are four datasets, one for each project in this strand. The independent study will concisely cover how each of these four data sets were generated and how they have been processed before being given to you. It will also give an overview of the analysis we will carry out over three workshops. In the workshop, you will learn what steps to take to get a good understanding of transciptomics data before you consider any statistical analysis. This is an often overlooked, but very valuable and informative, part of any data pipeline. It will give you the understanding of the data and R data structures that you will need to code and trouble-shoot code. It will also allow you to spot failed or problematic samples and will inform your decisions on quality control. At the end of this workshop and the following independent study you will have performed quality control by filtering out uninformative genes and samples, and saved this filtered data for use in the next workshop. You will also have a script that you can use to repeat this process on other datasets.",
+ "crumbs": [
+ "Transcriptomics",
+ "Transcriptomics Data Analysis for Group Project"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#ugly-code-1",
- "href": "core/week-2-old/study_before_workshop.html#ugly-code-1",
- "title": "Independent Study to prepare for workshop",
- "section": "😩 Ugly code 😩",
- "text": "😩 Ugly code 😩\n\nno spacing or indentation\ninconsistent splitting of code blocks over lines\ninconsistent use of quote characters\nno comments\nvariable names convey no meaning\nuse of = for assignment and inconsistently\nmultiple commands on a line\nlibrary statement in the middle of the analysis"
+ "objectID": "transcriptomics/transcriptomics.html#transcriptomics-2-statistical-analysis",
+ "href": "transcriptomics/transcriptomics.html#transcriptomics-2-statistical-analysis",
+ "title": "Transcriptomics Data Analysis for Group Project",
+ "section": "",
+ "text": "This week we cover differential expression analysis on your quality controlled data. The independent study will allow you to check you have what you should have following the Transcriptomics 1: Hello Data workshop and Consolidation study. It then summarises the concepts and methods used to carry out differential expression analysis in workshop. In the workshop, you will perform the differential expression and learn how to compuationally annotate your genes with more information from the databases. This will include the Gene Ontology (GO) terms that describe the biological processes, molecular functions and cellular components that the gene is involved in. At the end of this workshop and the following independent study you will have files containing the genes which are differentially expressed, along with the statistical information, summary information and annotation. You will be able to consider which genes you want to investigates with your Project director and have what you need for the next workshop. You will also have a script that you can use to repeat this process on other datasets.",
+ "crumbs": [
+ "Transcriptomics",
+ "Transcriptomics Data Analysis for Group Project"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#cool-code",
- "href": "core/week-2-old/study_before_workshop.html#cool-code",
- "title": "Independent Study to prepare for workshop",
- "section": "😎 Cool code 😎",
- "text": "😎 Cool code 😎\n\n# Packages ----------------------------------------------------------------\nlibrary(tidyverse)\nlibrary(janitor)\n\n# Import ------------------------------------------------------------------\n\n# define file name\nfile <- \"../data-raw/Y101_Y102_Y201_Y202_Y101-5.csv\"\n\n# import: column headers and data are from row 3\nsolu_protein <- read_csv(file, skip = 2) |>\n janitor::clean_names()\n\n# Tidy data ----------------------------------------------------------------\n\n# filter out the bovine proteins and those proteins \n# identified from fewer than 2 peptides\nsolu_protein <- solu_protein |>\n filter(str_detect(description, \"OS=Homo sapiens\")) |>\n filter(x1pep == \"x\")\n\n# Extract the genename from description column to a column\n# of its own\nsolu_protein <- solu_protein |>\n mutate(genename = str_extract(description,\"GN=[^\\\\s]+\") |>\n str_replace(\"GN=\", \"\"))\n\n# Extract the top protein identifier from accession column (first\n# Uniprot ID after \"1::\") to a column of its own\nsolu_protein <- solu_protein |>\n mutate(protid = str_extract(accession, \"1::[^;]+\") |>\n str_replace(\"1::\", \"\"))"
+ "objectID": "transcriptomics/transcriptomics.html#transcriptomics-3-visualising-and-interpreting",
+ "href": "transcriptomics/transcriptomics.html#transcriptomics-3-visualising-and-interpreting",
+ "title": "Transcriptomics Data Analysis for Group Project",
+ "section": "",
+ "text": "This week you will learn some how to do some common data visualisations for transcriptomic data. You will conduct and present a Principal Component Analysis (PCA) and a Volcano plot. We will also conduct a GO enrichment analysis. The independent study will allow you to check you have what you should have following the Transcriptomics 2: Statistical Analysis workshop and Consolidation study. At the end of this workshop and the following independent study you will at least two figures suitable for including in your report, along with an understanding of the results you can report on. You will also have a script that you can use to repeat this process on other datasets.\nReferences",
+ "crumbs": [
+ "Transcriptomics",
+ "Transcriptomics Data Analysis for Group Project"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#cool-code-1",
- "href": "core/week-2-old/study_before_workshop.html#cool-code-1",
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#overview",
+ "href": "transcriptomics/week-3/study_before_workshop.html#overview",
"title": "Independent Study to prepare for workshop",
- "section": "😎 Cool code 😎",
- "text": "😎 Cool code 😎\n\nlibrary() calls collected\nUses code sections to make it easier to navigate\nUses white space and proper indentation\nCommented\nUses more informative name for the dataframe"
+ "section": "Overview",
+ "text": "Overview\n\n\nConcise summary of the experimental design and aims\nWhat the raw data consist of\nWhat has been done to the data so far\nWhat steps we will take in the workshop",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#code-algorithmically-1",
- "href": "core/week-2-old/study_before_workshop.html#code-algorithmically-1",
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#the-data",
+ "href": "transcriptomics/week-3/study_before_workshop.html#the-data",
"title": "Independent Study to prepare for workshop",
- "section": "Code ‘algorithmically’",
- "text": "Code ‘algorithmically’\n\n\nWrite code which expresses the structure of the problem/solution.\nAvoid hard coding numbers if at all possible - declare variables instead\nDeclare frequently used values as variables at the start e.g., colour schemes, figure saving settings"
+ "section": "The Data",
+ "text": "The Data\nThere are three transcriptomic datasets\n\n🐸 bulk RNA-seq from Xenopus laevis embryos.\n🐭 single cell RNA-seq from mouse stemcells\n🎄 bulk RNA-seq from Arabidopsis thaliana\n💉 bulk RNA-seq from Leishmania mexicana",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#hard-coding-numbers.",
- "href": "core/week-2-old/study_before_workshop.html#hard-coding-numbers.",
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#experimental-design-1",
+ "href": "transcriptomics/week-3/study_before_workshop.html#experimental-design-1",
"title": "Independent Study to prepare for workshop",
- "section": "😩 Hard coding numbers.",
- "text": "😩 Hard coding numbers.\n\n\nSuppose we want to calculate the sums of squares, \\(SS(x)\\), for the number of eggs in five nests.\nThe formula is given by: \\(\\sum (x_i- \\bar{x})^2\\)\nWe could calculate the mean and copy it, and the individual numbers into the formula"
+ "section": "🐸 Experimental design",
+ "text": "🐸 Experimental design\n\nSchematic of frog development experiment",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#hard-coding-numbers.-1",
- "href": "core/week-2-old/study_before_workshop.html#hard-coding-numbers.-1",
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#experimental-design-2",
+ "href": "transcriptomics/week-3/study_before_workshop.html#experimental-design-2",
"title": "Independent Study to prepare for workshop",
- "section": "😩 Hard coding numbers.",
- "text": "😩 Hard coding numbers.\n\n# mean number of eggs per nest\nsum(3, 5, 6, 7, 8) / 5\n\n[1] 5.8\n\n# ss(x) of number of eggs\n(3 - 5.8)^2 + (5 - 5.8)^2 + (6 - 5.8)^2 + (7 - 5.8)^2 + (8 - 5.8)^2\n\n[1] 14.8\n\n\nI am coding the calculation of the mean rather using the mean() function only to explain what ‘coding algorithmically’ means using a simple example."
+ "section": "🐸 Experimental design",
+ "text": "🐸 Experimental design\n\nSchematic of frog development experiment\n\n3 fertilisations\ntwo siblings from each fertilisation one control, one FGF treated\nsequenced at three time points\n3 x 2 x 3 = 18 groups",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#hard-coding-numbers",
- "href": "core/week-2-old/study_before_workshop.html#hard-coding-numbers",
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#experimental-design-3",
+ "href": "transcriptomics/week-3/study_before_workshop.html#experimental-design-3",
"title": "Independent Study to prepare for workshop",
- "section": "😩 Hard coding numbers",
- "text": "😩 Hard coding numbers\n\n\nif any of the sample numbers must be altered, all the code needs changing\nit is hard to tell that the output of the first line is a mean\nits hard to recognise that the numbers in the mean calculation correspond to those in the next calculation\nit is hard to tell that 5 is just the number of nests\nno way of know if numbers are the same by coincidence or they refer to the same thing"
- },
- {
- "objectID": "core/week-2-old/study_before_workshop.html#better",
- "href": "core/week-2-old/study_before_workshop.html#better",
- "title": "Independent Study to prepare for workshop",
- "section": "😎 Better",
- "text": "😎 Better\n\n# eggs each nest\neggs <- c(3, 5, 6, 7, 8)\n\n# mean eggs per nest\nmean_eggs <- sum(eggs) / length(eggs)\n\n# ss(x) of number of eggs\nsum((eggs - mean_eggs)^2)\n\n[1] 14.8"
+ "section": "🐸 Experimental design",
+ "text": "🐸 Experimental design\n\nSchematic of frog development experiment\n\n3 fertilisations. These are the replicates, 1, 2, 3\ntwo siblings from each fertilisation one control, one FGF treated. The treatments are paired\nsequenced at three time points. S14, S20, S30\n3 x 2 x 3 = 18 groups",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#better-1",
- "href": "core/week-2-old/study_before_workshop.html#better-1",
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#aim",
+ "href": "transcriptomics/week-3/study_before_workshop.html#aim",
"title": "Independent Study to prepare for workshop",
- "section": "😎 Better",
- "text": "😎 Better\n\n\nthe commenting is similar but it is easier to follow\nif any of the sample numbers must be altered, only that number needs changing\nassigning a value you will later use to a variable with a meaningful name allows us to understand the first and second calculations\nmakes use of R’s elementwise calculation which resembles the formula (i.e., is expressed as the general rule)"
+ "section": "🐸 Aim",
+ "text": "🐸 Aim\n\n\nFind genes that are “differentially expressed” between control-treated and FGF-treated siblings\nDifferentially expressed means the expression in one group is significantly higher than in the other",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#summary",
- "href": "core/week-2-old/study_before_workshop.html#summary",
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#guided-analysis",
+ "href": "transcriptomics/week-3/study_before_workshop.html#guided-analysis",
"title": "Independent Study to prepare for workshop",
- "section": "Summary",
- "text": "Summary\n\n\nUse an RStudio project for any R work (you can also incorporate other languages)\nWrite Cool code not Ugly code: space, consistency, indentation, comments, meaningful variable names\nWrite code which expresses the structure of the problem/solution.\nAvoid hard coding numbers if at all possible - declare variables instead"
+ "section": "🐸 Guided analysis",
+ "text": "🐸 Guided analysis\n\n\nThe workshops will take you through comparing the control and FGF treated sibling at S30\nYou will make other comparisons independently\nYou will be guided to carefully document your work so you can apply the same methods to other comparisons\nDo the independent study before and after the workshop!",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/study_before_workshop.html#references",
- "href": "core/week-2-old/study_before_workshop.html#references",
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#experimental-design-4",
+ "href": "transcriptomics/week-3/study_before_workshop.html#experimental-design-4",
"title": "Independent Study to prepare for workshop",
- "section": "References",
- "text": "References\n\n\n\n🔗 About Core 2: File types, workflow tips and other tools\n\n\n\n\nBryan, Jennifer. 2018. “Excuse Me, Do You Have a Moment to Talk about Version Control?” Am. Stat. 72 (1): 20–27. https://doi.org/10.1080/00031305.2017.1399928.\n\n\nBryan, Jennifer, Jim Hester, Shannon Pileggi, and E. David Aja. n.d. What They Forgot to Teach You about r. https://rstats.wtf/.\n\n\nSandve, Geir Kjetil, Anton Nekrutenko, James Taylor, and Eivind Hovig. 2013. “Ten Simple Rules for Reproducible Computational Research.” PLoS Comput. Biol. 9 (10): e1003285. https://doi.org/10.1371/journal.pcbi.1003285.\n\n\nWilson, Greg, Jennifer Bryan, Karen Cranston, Justin Kitzes, Lex Nederbragt, and Tracy K Teal. 2017. “Good Enough Practices in Scientific Computing.” PLoS Comput. Biol. 13 (6): e1005510. https://doi.org/10.1371/journal.pcbi.1005510."
+ "section": "🐭 Experimental design",
+ "text": "🐭 Experimental design\n\nSchematic of stem cell experiment",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/workshop.html",
- "href": "core/week-2-old/workshop.html",
- "title": "Workshop",
- "section": "",
- "text": "In this workshop you will"
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#experimental-design-5",
+ "href": "transcriptomics/week-3/study_before_workshop.html#experimental-design-5",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🐭 Experimental design",
+ "text": "🐭 Experimental design\n\nSchematic of stem cell experiment\n\nCells were sorted using flow cytometry on the basis of cell surface markers\nThere are three cell types: LT-HSCs, HSPCs, Progs\nMany cells of each cell type were sequenced",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/workshop.html#session-overview",
- "href": "core/week-2-old/workshop.html#session-overview",
- "title": "Workshop",
- "section": "",
- "text": "In this workshop you will"
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#experimental-design-6",
+ "href": "transcriptomics/week-3/study_before_workshop.html#experimental-design-6",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🐭 Experimental design",
+ "text": "🐭 Experimental design\n\nSchematic of stem cell experiment\n\nThere are three cell types: LT-HSCs, HSPCs, Progs These are the “treaments”\nMany cells of each type were sequenced: These are the replicates\n155 LT-HSCs, 701 HSPCs, 798 Progs",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/workshop.html#omics",
- "href": "core/week-2-old/workshop.html#omics",
- "title": "Workshop",
- "section": "Omics",
- "text": "Omics\n\ngene/transcript/protein/metabolite expression\ntranscriptomics 1\ntranscriptomics 2\nproteomics"
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#aim-1",
+ "href": "transcriptomics/week-3/study_before_workshop.html#aim-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🐭 Aim",
+ "text": "🐭 Aim\n\n\nfind genes that are “differentially expressed” between at least two cell types\nDifferentially expressed means the expression in one group is significantly higher than in the other",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/workshop.html#images",
- "href": "core/week-2-old/workshop.html#images",
- "title": "Workshop",
- "section": "Images",
- "text": "Images\ncontrol_merged.tif\nlibrary(ijtiff)\nimg <- read_tif(\"data/control_merged.tif\")\nimg\n\nan image at least one and usually more matrices of numbers representing the intensity of light at each pixel in the image\nthe number of matrices depends on the number of ‘channels’ in the image\na channel is a colour in the image\na frame is a single image in a series of images\nwe might normally call this a multi-dimensional array: x and y coordinates of the pixels are 2 dimensions, the channel is the third dimension and time is the forth dimension\n\ndisplay(img)"
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#guided-analysis-1",
+ "href": "transcriptomics/week-3/study_before_workshop.html#guided-analysis-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🐭 Guided analysis",
+ "text": "🐭 Guided analysis\n\n\nThe workshops will take you through comparing the HSPC and Prog cells\nYou will make other comparisons independently\nYou will be guided to carefully document your work so you can apply the same methods to other comparisons\nDo the independent study before and after the workshop!",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/workshop.html#structure",
- "href": "core/week-2-old/workshop.html#structure",
- "title": "Workshop",
- "section": "Structure",
- "text": "Structure\n1cq2.pdb"
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#raw-sequence-data",
+ "href": "transcriptomics/week-3/study_before_workshop.html#raw-sequence-data",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Raw Sequence data",
+ "text": "Raw Sequence data\n\n\nThe raw data are “reads” from a sequencing machine in FASTQ files\nA read is sequence of RNA which is shorter than the whole transcriptome\nThe length of the reads depends on the type of sequencing machine\n\nShort-read technologies (e.g. Illumina) have higher base accuracy but are harder to align\nLong-read technologies (e.g. Nanopore) have lower base accuracy but are easier to align\n\nOptional: You can read more about Sequencing technologies in Statistically useful experimental design (Rand and Forrester 2022)\n\n\nWhat has been done to the data so far\n\n\n\nGeneral steps\n\n\nReads are filtered and trimmed on the basis of a quality score\nThey are then aligned/pseudo-aligned to a reference genome/transcriptome\nAnd then counted to quantify the expression\nCounts need to be normalised to account for differences in sequencing depth and transcript length before, or as part of, statistical analysis.\n\n\n\n\n🐸 Data\n\nUnpublished (so far!)\nExpression for the whole transcriptome X. laevis v10.1 genome assembly\nValues are raw counts\nThe statistical analysis method we will use DESeq2 (Love, Huber, and Anders 2014) requires raw counts and performs the normalisation itself\n\n\n\n🐭 Data\n\nPublished in Nestorowa et al. (2016)\nExpression for a subset of genes, the surfaceome\nValues are log2 normalised values\nThe statistical analysis method we will use scran (Lun, McCarthy, and Marioni 2016) requires normalised values\n\n\n\n\nWorkshops\n\n\n\nWorkshops\n\nTranscriptomics 1: Hello data Getting to know the data. Checking the distributions of values overall, across rows and columns to check things are as we expect and detect rows/columns that need to be removed\nTranscriptomics 2: Statistical Analysis. Identifying which genes are differentially expressed between treatments. This is the main analysis step. We will use different methods for bulk and single cell data.\nTranscriptomics 3: Visualising. Principal Component Analysis (PCA) volcano plots to visualise the results of the\n\n\n\nReferences\nPages made with R (R Core Team 2024), Quarto (Allaire et al. 2024), knitr (Xie 2024, 2015, 2014), kableExtra (Zhu 2021)\n\n\n\n🔗 About Transcriptomics 1: Hello data!\n\n\n\n\n\n\n\nAllaire, J. J., Charles Teague, Carlos Scheidegger, Yihui Xie, and Christophe Dervieux. 2024. “Quarto.” https://doi.org/10.5281/zenodo.5960048.\n\n\nLove, Michael I., Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-Seq Data with DESeq2.” Genome Biology 15: 550. https://doi.org/10.1186/s13059-014-0550-8.\n\n\nLun, Aaron T. L., Davis J. McCarthy, and John C. Marioni. 2016. “A Step-by-Step Workflow for Low-Level Analysis of Single-Cell RNA-Seq Data with Bioconductor.” F1000Res. 5: 2122. https://doi.org/10.12688/f1000research.9501.2.\n\n\nNestorowa, Sonia, Fiona K. Hamey, Blanca Pijuan Sala, Evangelia Diamanti, Mairi Shepherd, Elisa Laurenti, Nicola K. Wilson, David G. Kent, and Berthold Göttgens. 2016. “A Single-Cell Resolution Map of Mouse Hematopoietic Stem and Progenitor Cell Differentiation.” Blood 128 (8): e20–31. https://doi.org/10.1182/blood-2016-05-716480.\n\n\nR Core Team. 2024. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.\n\n\nRand, Emma, and Sarah Forrester. 2022. “Statistically Useful Experimental Design.” https://cloud-span.github.io/experimental_design00-overview/.\n\n\nXie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.\n\n\n———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.\n\n\n———. 2024. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.\n\n\nZhu, Hao. 2021. “kableExtra: Construct Complex Table with ’Kable’ and Pipe Syntax.” https://CRAN.R-project.org/package=kableExtra.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/workshop.html#the-command-line",
- "href": "core/week-2-old/workshop.html#the-command-line",
- "title": "Workshop",
- "section": "The command line",
- "text": "The command line\nThe command line - or shell - is a text interface for your computer. It’s a program that takes in commands, which it passes on to the computer’s operating system to run.\n\nWindows PowerShell is a command-line in windows. It uses bash-like commands unlike the Command Prompt which uses dos commands (a sort of windows only language). You can open is by going to Start | Windows PowerShell or by searching for it in the search bar.\nTerminal is the command line in Mac OS X. You can open it by going to Applications | Utilities | Terminal or by searching for it in the Spotlight search bar.\ngit bash. I used the bash shell that comes with Git"
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#general-steps",
+ "href": "transcriptomics/week-3/study_before_workshop.html#general-steps",
+ "title": "Independent Study to prepare for workshop",
+ "section": "General steps",
+ "text": "General steps\n\n\nReads are filtered and trimmed on the basis of a quality score\nThey are then aligned/pseudo-aligned to a reference genome/transcriptome\nAnd then counted to quantify the expression\nCounts need to be normalised to account for differences in sequencing depth and transcript length before, or as part of, statistical analysis.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/workshop.html#rstudio-terminal",
- "href": "core/week-2-old/workshop.html#rstudio-terminal",
- "title": "Workshop",
- "section": "RStudio terminal",
- "text": "RStudio terminal\nThe RStudio terminal is a convenient interface to the shell without leaving RStudio. It is useful for running commands that are not available in R. For example, you can use it to run other programs like fasqc, git, ftp, ssh\nNavigating your file system\nSeveral commands are frequently used to create, inspect, rename, and delete files and directories.\n$\nThe dollar sign is the prompt (like > on the R console), which shows us that the shell is waiting for input.\nYou can find out where you are using the pwd command, which stands for “print working directory”.\n\npwd\n\n/home/runner/work/BIO00088H-data/BIO00088H-data/core/week-2-old\n\n\nYou can find out what you can see with ls which stands for “list”.\n\nls\n\ndata\nimages\noverview.qmd\nstudy_after_workshop.qmd\nstudy_before_workshop.ipynb\nstudy_before_workshop.qmd\nworkshop.html\nworkshop.qmd\nworkshop.rmarkdown\nworkshop_files\n\n\nYou might have noticed that unlike R, the commands do not have brackets after them. Instead, options (or switches) are given after the command. For example, we can modify the ls command to give us more information with the -l option, which stands for “long”.\n\nls -l\n\ntotal 128\ndrwxr-xr-x 2 runner docker 4096 Sep 18 13:53 data\ndrwxr-xr-x 2 runner docker 4096 Sep 18 13:53 images\n-rw-r--r-- 1 runner docker 1597 Sep 18 13:53 overview.qmd\n-rw-r--r-- 1 runner docker 184 Sep 18 13:53 study_after_workshop.qmd\n-rw-r--r-- 1 runner docker 4807 Sep 18 13:53 study_before_workshop.ipynb\n-rw-r--r-- 1 runner docker 13029 Sep 18 13:53 study_before_workshop.qmd\n-rw-r--r-- 1 runner docker 58063 Sep 18 13:53 workshop.html\n-rw-r--r-- 1 runner docker 8550 Sep 18 13:53 workshop.qmd\n-rw-r--r-- 1 runner docker 8577 Sep 18 13:55 workshop.rmarkdown\ndrwxr-xr-x 3 runner docker 4096 Sep 18 13:53 workshop_files\n\n\nYou can use more than one option at once. The -h option stands for “human readable” and makes the file sizes easier to understand for humans:\n\nls -hl\n\ntotal 128K\ndrwxr-xr-x 2 runner docker 4.0K Sep 18 13:53 data\ndrwxr-xr-x 2 runner docker 4.0K Sep 18 13:53 images\n-rw-r--r-- 1 runner docker 1.6K Sep 18 13:53 overview.qmd\n-rw-r--r-- 1 runner docker 184 Sep 18 13:53 study_after_workshop.qmd\n-rw-r--r-- 1 runner docker 4.7K Sep 18 13:53 study_before_workshop.ipynb\n-rw-r--r-- 1 runner docker 13K Sep 18 13:53 study_before_workshop.qmd\n-rw-r--r-- 1 runner docker 57K Sep 18 13:53 workshop.html\n-rw-r--r-- 1 runner docker 8.4K Sep 18 13:53 workshop.qmd\n-rw-r--r-- 1 runner docker 8.4K Sep 18 13:55 workshop.rmarkdown\ndrwxr-xr-x 3 runner docker 4.0K Sep 18 13:53 workshop_files\n\n\nThe -a option stands for “all” and shows us all the files, including hidden files.\n\nls -alh\n\ntotal 136K\ndrwxr-xr-x 5 runner docker 4.0K Sep 18 13:55 .\ndrwxr-xr-x 8 runner docker 4.0K Sep 18 13:53 ..\ndrwxr-xr-x 2 runner docker 4.0K Sep 18 13:53 data\ndrwxr-xr-x 2 runner docker 4.0K Sep 18 13:53 images\n-rw-r--r-- 1 runner docker 1.6K Sep 18 13:53 overview.qmd\n-rw-r--r-- 1 runner docker 184 Sep 18 13:53 study_after_workshop.qmd\n-rw-r--r-- 1 runner docker 4.7K Sep 18 13:53 study_before_workshop.ipynb\n-rw-r--r-- 1 runner docker 13K Sep 18 13:53 study_before_workshop.qmd\n-rw-r--r-- 1 runner docker 57K Sep 18 13:53 workshop.html\n-rw-r--r-- 1 runner docker 8.4K Sep 18 13:53 workshop.qmd\n-rw-r--r-- 1 runner docker 8.4K Sep 18 13:55 workshop.rmarkdown\ndrwxr-xr-x 3 runner docker 4.0K Sep 18 13:53 workshop_files\n\n\nYou can move about with the cd command, which stands for “change directory”. You can use it to move into a directory by specifying the path to the directory:\n\ncd data\npwd\ncd ..\npwd\ncd data\npwd\n\n/home/runner/work/BIO00088H-data/BIO00088H-data/core/week-2-old/data\n/home/runner/work/BIO00088H-data/BIO00088H-data/core/week-2-old\n/home/runner/work/BIO00088H-data/BIO00088H-data/core/week-2-old/data\n\n\nhead 1cq2.pdb\nHEADER OXYGEN STORAGE/TRANSPORT 04-AUG-99 1CQ2 \nTITLE NEUTRON STRUCTURE OF FULLY DEUTERATED SPERM WHALE MYOGLOBIN AT 2.0 \nTITLE 2 ANGSTROM \nCOMPND MOL_ID: 1; \nCOMPND 2 MOLECULE: MYOGLOBIN; \nCOMPND 3 CHAIN: A; \nCOMPND 4 ENGINEERED: YES; \nCOMPND 5 OTHER_DETAILS: PROTEIN IS FULLY DEUTERATED \nSOURCE MOL_ID: 1; \nSOURCE 2 ORGANISM_SCIENTIFIC: PHYSETER CATODON; \nhead -20 data/1cq2.pdb\nHEADER OXYGEN STORAGE/TRANSPORT 04-AUG-99 1CQ2 \nTITLE NEUTRON STRUCTURE OF FULLY DEUTERATED SPERM WHALE MYOGLOBIN AT 2.0 \nTITLE 2 ANGSTROM \nCOMPND MOL_ID: 1; \nCOMPND 2 MOLECULE: MYOGLOBIN; \nCOMPND 3 CHAIN: A; \nCOMPND 4 ENGINEERED: YES; \nCOMPND 5 OTHER_DETAILS: PROTEIN IS FULLY DEUTERATED \nSOURCE MOL_ID: 1; \nSOURCE 2 ORGANISM_SCIENTIFIC: PHYSETER CATODON; \nSOURCE 3 ORGANISM_COMMON: SPERM WHALE; \nSOURCE 4 ORGANISM_TAXID: 9755; \nSOURCE 5 EXPRESSION_SYSTEM: ESCHERICHIA COLI; \nSOURCE 6 EXPRESSION_SYSTEM_TAXID: 562; \nSOURCE 7 EXPRESSION_SYSTEM_VECTOR_TYPE: PLASMID; \nSOURCE 8 EXPRESSION_SYSTEM_PLASMID: PET15A \nKEYWDS HELICAL, GLOBULAR, ALL-HYDROGEN CONTAINING STRUCTURE, OXYGEN STORAGE- \nKEYWDS 2 TRANSPORT COMPLEX \nEXPDTA NEUTRON DIFFRACTION \nAUTHOR F.SHU,V.RAMAKRISHNAN,B.P.SCHOENBORN \nless 1cq2.pdb\nless is a program that displays the contents of a file, one page at a time. It is useful for viewing large files because it does not load the whole file into memory before displaying it. Instead, it reads and displays a few lines at a time. You can navigate forward through the file with the spacebar, and backwards with the b key. Press q to quit.\nA wildcard is a character that can be used as a substitute for any of a class of characters in a search, The most common wildcard characters are the asterisk (*) and the question mark (?).\nls *.csv\ncp stands for “copy”. You can copy a file from one directory to another by giving cp the path to the file you want to copy and the path to the destination directory.\ncp 1cq2.pdb copy_of_1cq2.pdb\ncp 1cq2.pdb ../copy_of_1cq2.pdb\ncp 1cq2.pdb ../bob.txt\nTo delete a file use the rm command, which stands for “remove”.\nrm ../bob.txt\nbut be careful because the file will be gone forever. There is no “are you sure?” or undo.\nTo move a file from one directory to another, use the mv command. mv works like cp except that it also deletes the original file.\nmv ../copy_of_1cq2.pdb .\nMake a directory\nmkdir mynewdir"
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#data",
+ "href": "transcriptomics/week-3/study_before_workshop.html#data",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🐸 Data",
+ "text": "🐸 Data\n\nUnpublished (so far!)\nExpression for the whole transcriptome X. laevis v10.1 genome assembly\nValues are raw counts\nThe statistical analysis method we will use DESeq2 (Love, Huber, and Anders 2014) requires raw counts and performs the normalisation itself",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/workshop.html#differences-between-r-and-python",
- "href": "core/week-2-old/workshop.html#differences-between-r-and-python",
- "title": "Workshop",
- "section": "Differences between R and python",
- "text": "Differences between R and python\nDemo\nYou’re finished!"
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#data-1",
+ "href": "transcriptomics/week-3/study_before_workshop.html#data-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🐭 Data",
+ "text": "🐭 Data\n\nPublished in Nestorowa et al. (2016)\nExpression for a subset of genes, the surfaceome\nValues are log2 normalised values\nThe statistical analysis method we will use scran (Lun, McCarthy, and Marioni 2016) requires normalised values",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/overview.html",
- "href": "core/week-2-old/overview.html",
- "title": "Overview",
- "section": "",
- "text": "This week we will consider File types, workflow tips and other tools. The independent study reiterates the value of RStudio projects and shows you how you create them with usethis. You will also learn how to recognise and write cool 😎 code, not 😩 ugly code and code algorithmically. In the workshop we will examine some common biological data formats and discover some awesome short cuts to help you write cool 😎 code. You will also get a brief introduction to the command line and Google Colab.\n\nLearning objectives\nThe successful student will be able to:\n\nexplain why RStudio are useful/essential and be able to use the usethis package\nwrite cool 😎 code not 😩 ugly code\nexplain the value of code which expresses the structure of the problem/solution.\ndescribe some common file types for biological data\nuse some useful shortcuts to help write cool 😎 code\nknow what the command line is and how to use it for simple tasks\nuse Google colab to run code\nrecognise some of the differences between R and Python\n\n\n\nInstructions\n\nPrepare 20 mins reading on RStudio Projects revisited, formatting code and coding algorithmically\nWorkshop\n\n💬 Types of biological data files\n🪄 Workflow tips and shortcuts\n💻 The command line\n💻 Google colab\n💻 Python\n\nConsolidate\n\n💻 not sure yet :)"
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#workshops-1",
+ "href": "transcriptomics/week-3/study_before_workshop.html#workshops-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Workshops",
+ "text": "Workshops\n\nTranscriptomics 1: Hello data Getting to know the data. Checking the distributions of values overall, across rows and columns to check things are as we expect and detect rows/columns that need to be removed\nTranscriptomics 2: Statistical Analysis. Identifying which genes are differentially expressed between treatments. This is the main analysis step. We will use different methods for bulk and single cell data.\nTranscriptomics 3: Visualising. Principal Component Analysis (PCA) volcano plots to visualise the results of the",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2-old/study_after_workshop.html",
- "href": "core/week-2-old/study_after_workshop.html",
- "title": "Independent Study to consolidate this week",
- "section": "",
- "text": "bbbb"
+ "objectID": "transcriptomics/week-3/study_before_workshop.html#references",
+ "href": "transcriptomics/week-3/study_before_workshop.html#references",
+ "title": "Independent Study to prepare for workshop",
+ "section": "References",
+ "text": "References\nPages made with R (R Core Team 2024), Quarto (Allaire et al. 2024), knitr (Xie 2024, 2015, 2014), kableExtra (Zhu 2021)\n\n\n\n🔗 About Transcriptomics 1: Hello data!",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 3: Hello data!",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-2/overview.html",
- "href": "core/week-2/overview.html",
+ "objectID": "transcriptomics/week-3/overview.html",
+ "href": "transcriptomics/week-3/overview.html",
"title": "Overview",
"section": "",
- "text": "This week you will revise some essential concepts for scientific computing: file system organisation, file types, working directories and paths. The workshop will cover a rationale for working reproducibly, project oriented workflow, naming things and documenting your work.\n\nLearning objectives\nThe successful student will be able to:\n\nexplain the organisation of files and directories in a file systems including root, home and working directories\nexplain absolute and relative file paths\nexplain why working reproducibly is important\nknow how to use a project-oriented workflow to organise work\nbe able to give files human- and machine-readable names\nwrite cool 😎 code not 😩 ugly code\nexplain the value of code which expresses the structure of the problem/solution.\nuse some useful shortcuts to help write cool 😎 code\n\n\n\nInstructions\n\nPrepare\n\n📖 Read Understanding file systems\n\nWorkshop\nConsolidate",
+ "text": "This week you will meet your data. The independent study will summarise how these data were generated and how they have been processed before being given to you. There will also be an overview of the analysis we will carry out over three workshops. In the workshop, you will learn what steps to take to get a good understanding of transcriptomics data before you consider any statistical analysis. This is an often overlooked, but very valuable and informative, part of any data pipeline. It gives you the deep understanding of the data structures and values that you will need to code and trouble-shoot code, allows you to spot failed or problematic samples and informs your decisions on quality control.\nWe suggest you sit together with your group in the workshop.\n\nLearning objectives\nThe successful student will be able to:\n\nexplore transcriptomics data to find the number of rows and columns and know how these correspond to samples and variables\nexplore the distribution of expression measures across whole data sets, across variables and across samples by summarising and plotting\nexplain what distributions are expected and interpret the distributions they have\nexplain on what basis we might filter out variables or samples\nimport, explore and filter transcriptomics data reproducibly so they can understand and reuse their code in the future\n\n\n\nInstructions\n\nPrepare\n\n📖 Read how the data were generated and how they have been processed so far and a summary of the analysis we will carry out over three workshops.\n\nWorkshop\n\n💻 Set up a Project\n💻 Import data\n💻 Explore the distribution of values across rows and columns\n💻 Look after future you!\n\nConsolidate\n\n💻 Use the work you completed in the workshop as a template to apply to a new case.",
"crumbs": [
- "Core Supporting Info",
- "Week 2: Supporting Information 1",
+ "Transcriptomics",
+ "Week 3: Hello data!",
"About"
]
},
{
- "objectID": "core/week-2/study_after_workshop.html",
- "href": "core/week-2/study_after_workshop.html",
- "title": "Independent Study to consolidate this week",
- "section": "",
- "text": "These are suggestions\n\nWant github co-pilot?\n🎬 Create a GitHub account\n🎬 Apply for student benefits\nUpdate R and RStudio\n🎬 Update R\n🎬 Update RStudio.\nInstall package building tools\n🎬 Windows Install Rtools\n🎬 Mac install Xcode from Mac App Store\nUpdate packages:\n🎬 devtools, tidyverse, BiocManager, readxl",
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#overview",
+ "href": "transcriptomics/week-4/study_before_workshop.html#overview",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Overview",
+ "text": "Overview\nIn these slides we will:\n\n\nCheck where you are following week 3\n\nlearn some concepts in differential expression\n\nlog2 fold changes\nMultiple correction\nnormalisation\nstatistical model\n\n\nFind out what packages we will use",
"crumbs": [
- "Core Supporting Info",
- "Week 2: Supporting Information 1",
- "Consolidate!"
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
]
},
{
- "objectID": "core/week-1-old/workshop.html",
- "href": "core/week-1-old/workshop.html",
- "title": "Workshop",
- "section": "",
- "text": "In this workshop we will discuss why reproducibility matters and how to organise your work to make it reproducible. We will cover:"
- },
- {
- "objectID": "core/week-1-old/workshop.html#session-overview",
- "href": "core/week-1-old/workshop.html#session-overview",
- "title": "Workshop",
- "section": "",
- "text": "In this workshop we will discuss why reproducibility matters and how to organise your work to make it reproducible. We will cover:"
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#what-we-did-in-transcriptomics-1-hello-data",
+ "href": "transcriptomics/week-4/study_before_workshop.html#what-we-did-in-transcriptomics-1-hello-data",
+ "title": "Independent Study to prepare for workshop",
+ "section": "What we did in Transcriptomics 1: 👋 Hello data!",
+ "text": "What we did in Transcriptomics 1: 👋 Hello data!\n\n\n\nDiscovered how many rows and columns we had in our datasets and what these were.\nExamined the distribution of values\n\nacross the whole dataset\nacross the samples/cells (i.e., averaged over genes) to see variation between samples/cells\nacross the genes (i.e., averaged over samples/cells) to see variation between genes\n\n\nSaved files of filtered data.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-1-old/workshop.html#what-is-reproducibility",
- "href": "core/week-1-old/workshop.html#what-is-reproducibility",
- "title": "Workshop",
- "section": "What is reproducibility?",
- "text": "What is reproducibility?\n\nReproducible: Same data + same analysis = identical results. “… obtaining consistent results using the same input data; computational steps, methods, and code; and conditions of analysis. This definition is synonymous with”computational reproducibility” (National Academies of Sciences et al. 2019)\nReplicable: Different data + same analysis = qualitatively similar results. The work is not dependent on the specificities of the data.\nRobust: Same data + different analysis = qualitatively similar or identical results. The work is not dependent on the specificities of the analysis.\nGeneralisable: Different data + different analysis = qualitatively similar results and same conclusions. The findings can be generalised\n\n\n\n\nThe Turing Way's definitions of reproducible research"
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#where-should-you-be-1",
+ "href": "transcriptomics/week-4/study_before_workshop.html#where-should-you-be-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Where should you be?",
+ "text": "Where should you be?\nAfter the Transcriptomics 1: 👋 Hello data! Workshop including:\n\n🤗 Look after future you! and\nthe Independent Study to consolidate, you should have:",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-1-old/workshop.html#why-does-it-matter",
- "href": "core/week-1-old/workshop.html#why-does-it-matter",
- "title": "Workshop",
- "section": "Why does it matter?",
- "text": "Why does it matter?\n\n\n\nfutureself, CC-BY-NC, by Julen Colomb\n\n\n\nFive selfish reasons to work reproducibly (Markowetz 2015). Alternatively, see the very entertaining talk\nMany high profile cases of work which did not reproduce e.g. Anil Potti unravelled by Baggerly and Coombes (2009)\nWill become standard in Science and publishing e.g OECD Global Science Forum Building digital workforce capacity and skills for data-intensive science (OECD Global Science Forum 2020)"
- },
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#frogs",
+ "href": "transcriptomics/week-4/study_before_workshop.html#frogs",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🐸 Frogs",
+ "text": "🐸 Frogs\n\nAn RStudio Project called frogs-88H which contains:\n\nRaw data (S14, S20 and S30)\nProcessed data: s30_filtered.csv and equivalent for S14 OR S20)\nTwo scripts called cont-fgf-s30.R and either cont-fgf-s20.R OR cont-fgf-s14.R\n\n\n\n\nFiles should be organised into folders. Code should well commented and easy to read.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
{
- "objectID": "core/week-1-old/workshop.html#how-to-achieve-reproducibility",
- "href": "core/week-1-old/workshop.html#how-to-achieve-reproducibility",
- "title": "Workshop",
- "section": "How to achieve reproducibility",
- "text": "How to achieve reproducibility\n\nScripting\nOrganisation: Project-oriented workflows with file and folder structure, naming things\nDocumentation: Readme files, code comments, metadata, version control"
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#mice",
+ "href": "transcriptomics/week-4/study_before_workshop.html#mice",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🐭 Mice",
+ "text": "🐭 Mice\n\nAn RStudio Project called mice-88H which contains\n\nRaw data (hspc, prog, lthsc)\nProcessed data (hspc_summary_gene.csv, hspc_summary_samp.csv, prog_summary_gene.csv, prog_summary_samp.csv)\n\n\nOne script called hspc-prog.R\n\n\nFiles should be organised into folders. Code should well commented and easy to read.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-1-old/workshop.html#rationale-for-scripting",
- "href": "core/week-1-old/workshop.html#rationale-for-scripting",
- "title": "Workshop",
- "section": "Rationale for scripting?",
- "text": "Rationale for scripting?\n\nScience is the generation of ideas, designing work to test them and reporting the results.\nWe ensure laboratory and field work is replicable, robust and generalisable by planning and recording in lab books and using standard protocols. Repeating results is still hard.\nWorkflows for computational projects, and the data analysis and reporting of other work can, and should, be 100% reproducible!\nScripting is the way to achieve this."
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#arabidopisis",
+ "href": "transcriptomics/week-4/study_before_workshop.html#arabidopisis",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🎄 Arabidopisis",
+ "text": "🎄 Arabidopisis",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-1-old/workshop.html#project-oriented-workflow",
- "href": "core/week-1-old/workshop.html#project-oriented-workflow",
- "title": "Workshop",
- "section": "Project-oriented workflow",
- "text": "Project-oriented workflow\n\nuse folders to organise your work\nyou are aiming for structured, systematic and repeatable.\ninputs and outputs should be clearly identifiable from structure and/or naming\n\nExamples\n-- liver_transcriptome/\n |__data\n |__raw/\n |__processed/\n |__images/\n |__code/\n |__reports/\n |__figures/"
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#leishmania",
+ "href": "transcriptomics/week-4/study_before_workshop.html#leishmania",
+ "title": "Independent Study to prepare for workshop",
+ "section": "💉 Leishmania",
+ "text": "💉 Leishmania",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-1-old/workshop.html#naming-things",
- "href": "core/week-1-old/workshop.html#naming-things",
- "title": "Workshop",
- "section": "Naming things",
- "text": "Naming things\n\n\n\ndocuments, CC-BY-NC, https://xkcd.com/1459/\n\n\nGuiding principle - Have a convention! Good file names are:\n\nmachine readable\nhuman readable\nplay nicely with sorting\n\nI suggest\n\nno spaces in names\nuse snake_case or kebab-case rather than CamelCase or dot.case\nuse all lower case except very occasionally where convention is otherwise, e.g., README, LICENSE\nordering: use left-padded numbers e.g., 01, 02….99 or 001, 002….999\ndates ISO 8601 format: 2020-10-16\nwrite down your conventions\n\n-- liver_transcriptome/\n |__data\n |__raw/\n |__2022-03-21_donor_1.csv\n |__2022-03-21_donor_2.csv\n |__2022-03-21_donor_3.csv\n |__2022-05-14_donor_1.csv\n |__2022-05-14_donor_2.csv\n |__2022-05-14_donor_3.csv\n |__processed/\n |__images/\n |__code/\n |__functions/\n |__summarise.R\n |__normalise.R\n |__theme_volcano.R\n |__01_data_processing.py\n |__02_exploratory.R\n |__03_modelling.R\n |__04_figures.R\n |__reports/\n |__01_report.qmd\n |__02_supplementary.qmd\n |__figures/\n |__01_volcano_donor_1_vs_donor_2.eps\n |__02_volcano_donor_1_vs_donor_3.eps"
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#if-you-do-not-have-those",
+ "href": "transcriptomics/week-4/study_before_workshop.html#if-you-do-not-have-those",
+ "title": "Independent Study to prepare for workshop",
+ "section": "If you do not have those",
+ "text": "If you do not have those\nGo through:\n\nTranscriptomics 1: 👋 Hello data! Workshop including:\n🤗 Look after future you! and\nthe Independent Study to consolidate",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-1-old/workshop.html#readme-files",
- "href": "core/week-1-old/workshop.html#readme-files",
- "title": "Workshop",
- "section": "Readme files",
- "text": "Readme files\nREADMEs are a form of documentation which have been widely used for a long time. They contain all the information about the other files in a directory. They can be extensive but need not be. Concise is good. Bullet points are good\n\nGive a project title and description, brief\nstart date, last updated date and contact information\nOutline the folder structure\nGive software requirements: programs and versions used or required. There are packages that give session information in R Wickham et al. (2021) and Python Ostblom, Joel (2019)\n\nR:\nsessioninfo::session_info()\nPython:\nimport session_info\nsession_info.show()\n\nInstructions run the code, build reports, and reproduce the figures etc\nWhere to find the data, outputs\nAny other information that needed to understand and recreate the work\nIdeally, a summary of changes with the date\n\n-- liver_transcriptome/\n |__data\n |__raw/\n |__2022-03-21_donor_1.csv\n |__2022-03-21_donor_2.csv\n |__2022-03-21_donor_3.csv\n |__2022-05-14_donor_1.csv\n |__2022-05-14_donor_2.csv\n |__2022-05-14_donor_3.csv\n |__processed/\n |__images/\n |__code/\n |__functions/\n |__summarise.R\n |__normalise.R\n |__theme_volcano.R\n |__01_data_processing.py\n |__02_exploratory.R\n |__03_modelling.R\n |__04_figures.R\n |__README.md\n |__reports/\n |__01_report.qmd\n |__02_supplementary.qmd\n |__figures/\n |__01_volcano_donor_1_vs_donor_2.eps\n |__02_volcano_donor_1_vs_donor_3.eps"
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#differential-expression-1",
+ "href": "transcriptomics/week-4/study_before_workshop.html#differential-expression-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Differential expression",
+ "text": "Differential expression\n\n\nThe goal of differential expression is to test whether there is a significant difference in gene expression between groups.\nA large number of computational methods have been developed for differential expression analysis\nR is the leading language for differential expression analysis",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-1-old/workshop.html#code-comments",
- "href": "core/week-1-old/workshop.html#code-comments",
- "title": "Workshop",
- "section": "Code comments",
- "text": "Code comments\n\nComments are notes in the code which are not executed. They are ignored by the computer but are read by humans. They are used to explain what the code is doing and why. They are also used to temporarily remove code from execution."
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#differential-expression-2",
+ "href": "transcriptomics/week-4/study_before_workshop.html#differential-expression-2",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Differential expression",
+ "text": "Differential expression\n\n\nthe statistical concepts are very similar to those you have already encountered in stages 1 and 2\nyou are essentially doing paired- or independent-samples tests\nbut you are doing a lot of them! One for every gene\ndata need normalisation before comparison",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#statistical-concepts",
+ "href": "transcriptomics/week-4/study_before_workshop.html#statistical-concepts",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Statistical concepts",
+ "text": "Statistical concepts\nLike familiar tests:\n\n\nthe type of test (the function) you use depends on the type of data you have and the type of assumptions you want to make\nthe tests work by comparing the variation between groups to the variation within groups.\nyou will get: the difference between groups, a test statistic, and a p-value\nyou also get an adjusted p-value which is the ‘correction’ for multiple testing",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#the-difference-between-groups",
+ "href": "transcriptomics/week-4/study_before_workshop.html#the-difference-between-groups",
+ "title": "Independent Study to prepare for workshop",
+ "section": "The difference between groups",
+ "text": "The difference between groups\n\n\nThe difference between groups is given as the log2 fold change in expression between groups\nA fold change is the expression in one group divided by the expression in the other group\nwe use fold changes because the absolute expression values may not be accurate and relative changes are what matters\nwe use log2 fold changes because they are symmetrical around 0",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#why-log2-fold-change",
+ "href": "transcriptomics/week-4/study_before_workshop.html#why-log2-fold-change",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Why log2 fold change?",
+ "text": "Why log2 fold change?\n\n\nlog2 means log to the base 2\nSuppose the expression in group A is 5 and the expression in group B is 8\n\\(\\frac{A}{B} = \\frac{5}{8}\\) = 0.625 and \\(\\frac{B}{A} = \\frac{8}{5}\\) = 1.6\nIf B > A the range of \\(\\frac{A}{B}\\) is 0 - 1 but the range of \\(\\frac{B}{A}\\) is 1 - \\(\\infty\\)\nHowever, if we take the log2 of \\(\\frac{A}{B}\\) we get -0.678 and the log2 of \\(\\frac{B}{A}\\) is 0.678.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#adjusted-p-value",
+ "href": "transcriptomics/week-4/study_before_workshop.html#adjusted-p-value",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Adjusted p-value",
+ "text": "Adjusted p-value\n\n\nThe p-value has to be adjusted because of the number of tested being done\nIn stage 1, we used Tukey’s HSD to adjust for multiple testing following an ANOVA\nHere the Benjamini-Hochberg procedure (Benjamini and Hochberg 1995) is used to adjust for multiple testing\nBH controls the False Discovery Rate (FDR)\nThe FDR is the proportion of false positives among the genes called significant",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#normalisation",
+ "href": "transcriptomics/week-4/study_before_workshop.html#normalisation",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Normalisation",
+ "text": "Normalisation\n\n\nNormalisation adjusts raw counts to account for factors that prevent direct comparisons\nNormalisation usually influences the experimental design as well as the analysis\n\nNormalisation\n\n🐭 mice data are normalised\n🐸 frog, 🎄 Arabidopisis and 💉 Leishmania data are raw counts (not normalised) because the differential expression method will do this.\nNormalisation is a big topic. See Düren, Lederer, and Qin (2022); Bullard et al. (2010); Lytal, Ran, and An (2020); Abrams et al. (2019); Vallejos et al. (2017); Evans, Hardin, and Stoebel (2017)",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#normalisation-1",
+ "href": "transcriptomics/week-4/study_before_workshop.html#normalisation-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Normalisation",
+ "text": "Normalisation\n\n🐭 mice data are normalised\n🐸 frog, 🎄 Arabidopisis and 💉 Leishmania data are raw counts (not normalised) because the differential expression method will do this.\nNormalisation is a big topic. See Düren, Lederer, and Qin (2022); Bullard et al. (2010); Lytal, Ran, and An (2020); Abrams et al. (2019); Vallejos et al. (2017); Evans, Hardin, and Stoebel (2017)",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#type-of-de-tests",
+ "href": "transcriptomics/week-4/study_before_workshop.html#type-of-de-tests",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Type of DE tests",
+ "text": "Type of DE tests\n\n\nA large number of computational methods have been developed for differential expression analysis\nMethods vary in the types of normalisation they do, the statistical model they use, and the assumptions they make\nSome of the most well-known methods are provided by: DESeq2 (Love, Huber, and Anders 2014), edgeR (Robinson, McCarthy, and Smyth 2010; McCarthy, Chen, and Smyth 2012; Chen, Lun, and Smyth 2016), limma (Ritchie et al. 2015) and scran (Lun, McCarthy, and Marioni 2016)",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#type-of-test-the-function",
+ "href": "transcriptomics/week-4/study_before_workshop.html#type-of-test-the-function",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Type of test (the function)",
+ "text": "Type of test (the function)\n\n\n\nDESeq2 and edgeR\n\nboth require raw counts as input\nboth assume that most genes are not DE\nboth use a negative binomial distribution1 to model the data\nuse slightly different normalisation methods: DESeq2 uses the median of ratios method; edgeR uses the trimmed mean of M values (TMM) method\n\n\n\n\nA discrete distribution for counts, similar to the Poisson distribution",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#type-of-test-the-function-1",
+ "href": "transcriptomics/week-4/study_before_workshop.html#type-of-test-the-function-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Type of test (the function)",
+ "text": "Type of test (the function)\n\n\nscran\n\nworks on normalized log-expression values\nperforms Welch t-tests",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#meta-data",
+ "href": "transcriptomics/week-4/study_before_workshop.html#meta-data",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Meta data",
+ "text": "Meta data\n\n\nDE methods require two types of data: the expression data and the meta data\nThe meta data gives the information about the samples\nIt says which samples (columns of data) are in which treatment group (s)\nIt is usually stored in a separate file",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#data",
+ "href": "transcriptomics/week-4/study_before_workshop.html#data",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🐸 Data",
+ "text": "🐸 Data\n\nExpression for the whole transcriptome X. laevis v10.1 genome assembly\nValues are raw counts\nThe statistical analysis method we will use DESeq2 (Love, Huber, and Anders 2014) requires raw counts and performs the normalisation itself",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#arabidopisis-1",
+ "href": "transcriptomics/week-4/study_before_workshop.html#arabidopisis-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🎄 Arabidopisis",
+ "text": "🎄 Arabidopisis\n\nThe statistical analysis method we will use DESeq2 (Love, Huber, and Anders 2014) requires raw counts and performs the normalisation itself",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#leishmania-1",
+ "href": "transcriptomics/week-4/study_before_workshop.html#leishmania-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "💉 Leishmania",
+ "text": "💉 Leishmania\n\nThe statistical analysis method we will use DESeq2 (Love, Huber, and Anders 2014) requires raw counts and performs the normalisation itself",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#data-1",
+ "href": "transcriptomics/week-4/study_before_workshop.html#data-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🐭 Data",
+ "text": "🐭 Data\n\nExpression for a subset of genes, the surfaceome\nValues are log2 normalised values\nThe statistical analysis method we will use scran (Lun, McCarthy, and Marioni 2016) requires normalised values",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#adding-gene-information-1",
+ "href": "transcriptomics/week-4/study_before_workshop.html#adding-gene-information-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Adding gene information",
+ "text": "Adding gene information\n\n\nThe gene id is difficult to interpret\nTherefore we need to add information such as the gene name and a description to the results\n🐸 Frog data information comes from Xenbase (Fisher et al. 2023)\n🐭 Mice data information comes from Ensembl (Birney et al. 2004)",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#xenbase",
+ "href": "transcriptomics/week-4/study_before_workshop.html#xenbase",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🐸 Xenbase",
+ "text": "🐸 Xenbase\n\nxenbase logoXenbase is a model organism database that provides genomic, molecular, and developmental biology information about Xenopus laevis and Xenopus tropicalis.\n\nIt took me some time to find the information you need.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#xenbase-1",
+ "href": "transcriptomics/week-4/study_before_workshop.html#xenbase-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🐸 Xenbase",
+ "text": "🐸 Xenbase\n\n\nI got the information from the Xenbase information pages under Data Reports | Gene Information\nThis is listed: Xenbase Gene Product Information [readme] gzipped gpi (tab separated)\nClick on the readme link to see the file format and columns\nI downloaded xenbase.gpi.gz, unzipped it, removed header lines and the Xenopus tropicalis (taxon:8364) entries and saved it as xenbase_info.xlsx\nIn the workshop you will import this file and merge the information with the results file",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#ensembl",
+ "href": "transcriptomics/week-4/study_before_workshop.html#ensembl",
+ "title": "Independent Study to prepare for workshop",
+ "section": "🐭 Ensembl",
+ "text": "🐭 Ensembl\n\n\nEnsembl creates, integrates and distributes reference datasets and analysis tools that enable genomics\nBioMart (Smedley et al. 2009) provides uniform access to these large datasets\nbiomaRt (Durinck et al. 2009, 2005) is a Bioconductor package gives you programmatic access to BioMart.\nIn the workshop you use this package to get information you can merge with the results file",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#packages",
+ "href": "transcriptomics/week-4/study_before_workshop.html#packages",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Packages",
+ "text": "Packages\nThese packages are all on the University computers which you can access on campus or remotely using the VDS\nIf you want to use your own machine you will need to install the packages. ::: {style=“font-size: 60%;”}\nInstall BiocManager from CRAN in the the normal way and set the version of Bioconductor packages to install:\n\ninstall.packages(\"BiocManager\")\nBiocManager::install(version = \"3.19\")\n\nInstall DESeq2 from Bioconductor using BiocManager:\n\nBiocManager::install(\"DESeq2\")\n\nInstall scran from Bioconductor using BiocManager:\n\nBiocManager::install(\"scran\")\n\nInstall biomaRt from Bioconductor using BiocManager:\n\nBiocManager::install(\"biomaRt\")\n\n:::",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#workshops-1",
+ "href": "transcriptomics/week-4/study_before_workshop.html#workshops-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Workshops",
+ "text": "Workshops\n\nTranscriptomics 1: Hello data Getting to know the data. Checking the distributions of values overall, across rows and columns to check things are as we expect and detect rows/columns that need to be removed\nTranscriptomics 2: Statistical Analysis. Identifying which genes are differentially expressed between treatments. This is the main analysis step. We will use different methods for bulk and single cell data.\nTranscriptomics 3: Visualising. Principal Component Analysis (PCA) volcano plots to visualise the results of the",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
+ },
+ {
+ "objectID": "transcriptomics/week-4/study_before_workshop.html#references",
+ "href": "transcriptomics/week-4/study_before_workshop.html#references",
+ "title": "Independent Study to prepare for workshop",
+ "section": "References",
+ "text": "References\nPages made with R (R Core Team 2024), Quarto (Allaire et al. 2024), knitr (Xie 2024, 2015, 2014), kableExtra (Zhu 2021)\n\n\n\n🔗 About Transcriptomics 2: Statistical Analysis\n\n\n\n\nAbrams, Zachary B., Travis S. Johnson, Kun Huang, Philip R. O. Payne, and Kevin Coombes. 2019. “A Protocol to Evaluate RNA Sequencing Normalization Methods.” BMC Bioinformatics 20 (24): 679. https://doi.org/10.1186/s12859-019-3247-x.\n\n\nAllaire, J. J., Charles Teague, Carlos Scheidegger, Yihui Xie, and Christophe Dervieux. 2024. “Quarto.” https://doi.org/10.5281/zenodo.5960048.\n\n\nBenjamini, Yoav, and Yosef Hochberg. 1995. “Controlling the False Discovery Rate: A Practical and Powerful Approach to Multiple Testing.” J. R. Stat. Soc. Series B Stat. Methodol. 57 (1): 289–300. http://www.jstor.org/stable/2346101.\n\n\nBirney, Ewan, T. Daniel Andrews, Paul Bevan, Mario Caccamo, Yuan Chen, Laura Clarke, Guy Coates, et al. 2004. “An Overview of Ensembl.” Genome Research 14 (5): 925–28. https://doi.org/10.1101/gr.1860604.\n\n\nBullard, James H., Elizabeth Purdom, Kasper D. Hansen, and Sandrine Dudoit. 2010. “Evaluation of Statistical Methods for Normalization and Differential Expression in mRNA-Seq Experiments.” BMC Bioinformatics 11 (1): 94. https://doi.org/10.1186/1471-2105-11-94.\n\n\nChen, Yunshun, Aaron T. L. Lun, and Gordon K. Smyth. 2016. “From Reads to Genes to Pathways: Differential Expression Analysis of RNA-Seq Experiments Using Rsubread and the edgeR Quasi-Likelihood Pipeline.” https://doi.org/10.12688/f1000research.8987.2.\n\n\nDüren, Yannick, Johannes Lederer, and Li-Xuan Qin. 2022. “Depth Normalization of Small RNA Sequencing: Using Data and Biology to Select a Suitable Method.” Nucleic Acids Research 50 (10): e56. https://doi.org/10.1093/nar/gkac064.\n\n\nDurinck, Steffen, Yves Moreau, Arek Kasprzyk, Sean Davis, Bart De Moor, Alvis Brazma, and Wolfgang Huber. 2005. “BioMart and Bioconductor: A Powerful Link Between Biological Databases and Microarray Data Analysis.” Bioinformatics 21: 3439–40.\n\n\nDurinck, Steffen, Paul T. Spellman, Ewan Birney, and Wolfgang Huber. 2009. “Mapping Identifiers for the Integration of Genomic Datasets with the r/Bioconductor Package biomaRt.” Nature Protocols 4: 1184–91.\n\n\nEvans, Ciaran, Johanna Hardin, and Daniel M Stoebel. 2017. “Selecting Between-Sample RNA-Seq Normalization Methods from the Perspective of Their Assumptions.” Briefings in Bioinformatics 19 (5): 776–92. https://doi.org/10.1093/bib/bbx008.\n\n\nFisher, Malcolm, Christina James-Zorn, Virgilio Ponferrada, Andrew J Bell, Nivitha Sundararaj, Erik Segerdell, Praneet Chaturvedi, et al. 2023. “Xenbase: Key Features and Resources of the Xenopus Model Organism Knowledgebase.” Genetics 224 (1): iyad018. https://doi.org/10.1093/genetics/iyad018.\n\n\nLove, Michael I., Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-Seq Data with DESeq2.” Genome Biology 15: 550. https://doi.org/10.1186/s13059-014-0550-8.\n\n\nLun, Aaron T. L., Davis J. McCarthy, and John C. Marioni. 2016. “A Step-by-Step Workflow for Low-Level Analysis of Single-Cell RNA-Seq Data with Bioconductor.” F1000Res. 5: 2122. https://doi.org/10.12688/f1000research.9501.2.\n\n\nLytal, Nicholas, Di Ran, and Lingling An. 2020. “Normalization Methods on Single-Cell RNA-Seq Data: An Empirical Survey.” Frontiers in Genetics 11. https://www.frontiersin.org/articles/10.3389/fgene.2020.00041.\n\n\nMcCarthy, Davis J., Yunshun Chen, and Gordon K. Smyth. 2012. “Differential Expression Analysis of Multifactor RNA-Seq Experiments with Respect to Biological Variation.” Nucleic Acids Research 40 (10): 4288–97. https://doi.org/10.1093/nar/gks042.\n\n\nR Core Team. 2024. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.\n\n\nRitchie, Matthew E., Belinda Phipson, Di Wu, Yifang Hu, Charity W. Law, Wei Shi, and Gordon K. Smyth. 2015. “Limma Powers Differential Expression Analyses for RNA-Sequencing and Microarray Studies.” Nucleic Acids Research 43 (7): e47. https://doi.org/10.1093/nar/gkv007.\n\n\nRobinson, Mark D., Davis J. McCarthy, and Gordon K. Smyth. 2010. “edgeR: A Bioconductor Package for Differential Expression Analysis of Digital Gene Expression Data.” Bioinformatics 26 (1): 139–40. https://doi.org/10.1093/bioinformatics/btp616.\n\n\nSmedley, Damian, Syed Haider, Benoit Ballester, Richard Holland, Darin London, Gudmundur Thorisson, and Arek Kasprzyk. 2009. “BioMart Biological Queries Made Easy.” BMC Genomics 10 (1): 22. https://doi.org/10.1186/1471-2164-10-22.\n\n\nVallejos, Catalina A., Davide Risso, Antonio Scialdone, Sandrine Dudoit, and John C. Marioni. 2017. “Normalizing Single-Cell RNA Sequencing Data: Challenges and Opportunities.” Nature Methods 14 (6): 565–71. https://doi.org/10.1038/nmeth.4292.\n\n\nXie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.\n\n\n———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.\n\n\n———. 2024. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.\n\n\nZhu, Hao. 2021. “kableExtra: Construct Complex Table with ’Kable’ and Pipe Syntax.” https://CRAN.R-project.org/package=kableExtra.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "Prepare!"
+ ]
},
{
- "objectID": "core/week-1-old/study_before_workshop.html",
- "href": "core/week-1-old/study_before_workshop.html",
- "title": "Independent Study to prepare for workshop",
+ "objectID": "transcriptomics/week-4/overview.html",
+ "href": "transcriptomics/week-4/overview.html",
+ "title": "Overview",
"section": "",
- "text": "📖 Read Understanding file systems. This is an approximately 15 - 20 minute read revising file types and filesystems. It covers concepts of working directories and paths. We learned these ideas in stage 1 and you may feel completely confident with them but many students will benefit from a refresher. For BIO00070M students, this is part of the work you will also be asked to complete for BIO00052M Data Analysis in R.\nIn previous years you have submitted and RStudio Project as part of your BABS work. In this module you will develop this by submitting a Research Compendium. A Research Compendium is a documented collection of all the digital parts of the research project including data (or access to data), code and outputs. The Compendium might be a single Quarto/RStudio Project, (like you have done previously but with better documentation) or it might be a folder including an Quarto/RStudio Project and other material/scripts including the description of unscripted processing. You might want to remind yourself of the example RStudio Project, Y12345678.zip used in BABS 2."
+ "text": "This week we cover differential expression analysis on raw counts or log normalised values. The independent study will allow you to check you have what you should have following the Transcriptomics 1: Hello Data workshop and Consolidation study. It will also summarise the concepts and methods we will use in the workshop. In the workshop, you will learn how to perform differential expression analysis on raw counts using DESeq2 (Love, Huber, and Anders 2014) or on logged normalised expression values using scran (Lun, McCarthy, and Marioni 2016) or both. You will also add information about genes programmatically.\nWe suggest you sit together with your group in the workshop.\n\nLearning objectives\nThe successful student will be able to:\n\nverify they have the required RStudio Project set up and the data and code files from the previous Workshop and Consolidation study\nexplain the goal of differential expression analysis and the importance of normalisation\nexplain why and how the nature of the input values determines the analysis package used\ndescribe the metadata needed to carry out differential expression analysis and the statistical models used by DESeq2 and scran\nfind genes that are unexpressed or expressed in a just one group\nperform differential expression analysis on raw counts using DESeq2 or on logged normalised expression values using scran or both.\nexplain the output of differential expression: log fold change, p-value, adjusted p-value\nadd information about genes programmatically to their results\nprepare for a discussion with their project supervisor about genes of interest\n\n\n\nInstructions\n\nPrepare\n\n📖 Check what you should have after week 3\n📖 Read about concepts in differential expression analysis.\n📖 Find out what packages we will use.\n\nWorkshop\n\n💻 Find unexpressed genes and those expressed in a single cell type or treatment group.\n💻 Set up the metadata for differential expression analysis.\n💻 Perform differential expression analysis on raw counts using DESeq2 or on logged normalised expression values using scran.\nLook after future you!\n\nConsolidate\n\n💻 Use the work you completed in the workshop as a template to apply to a new case.\n\n\n\n\n\n\n\n\n\n\nReferences\n\nLove, Michael I., Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-Seq Data with DESeq2.” Genome Biology 15: 550. https://doi.org/10.1186/s13059-014-0550-8.\n\n\nLun, Aaron T. L., Davis J. McCarthy, and John C. Marioni. 2016. “A Step-by-Step Workflow for Low-Level Analysis of Single-Cell RNA-Seq Data with Bioconductor.” F1000Res. 5: 2122. https://doi.org/10.12688/f1000research.9501.2.",
+ "crumbs": [
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
+ "About"
+ ]
},
{
- "objectID": "core/week-6-old/workshop.html",
- "href": "core/week-6-old/workshop.html",
- "title": "Workshop",
+ "objectID": "index.html",
+ "href": "index.html",
+ "title": "Data Analysis for the Group Research Project",
"section": "",
- "text": "Use this session to ask any questions about Core 1 Organising reproducible data analyses and Core 2 File types, workflow tips and other tools in particular, or about R and RStudio in general. We will also try to answer any questions about the ’mics, Image and Structure strands.\n88H students might also review Stage 1 and 2 content to see if there are areas you might benefit from revisiting. You can access these through the past VLE sites but you might find it helpful to use the latest versions because there is no 2FA and the resources are searchable.\nStage 1\n\nData Analysis in R for Becoming a Bioscientist 1.Core concepts about scientific computing, types of variable, the role of variables in analysis and how to use RStudio to organise analysis and import, summarise and plot data.\nData Analysis in R for Becoming a Bioscientist 2. The logic of hypothesis testing, confidence intervals, what is meant by a statistical model, two-sample tests and one- and two-way analysis of variance (ANOVA).\n\nStage 2\n\nGet Introductory Statistical Tests as Linear models: A guide for R users\nA simple introduction to GLM for analysing Poisson and Binomial responses in R\n\n70M students might also review 52M content to see if there are areas you might benefit from revisiting. You can access these through the VLE site but you might find it helpful to use this link without 2FA.\n\n52M Data Analysis in R. Core concepts about scientific computing, types of variable, the role of variables in analysis and how to use RStudio to organise analysis and import, summarise and plot data, the logic of hypothesis testing, confidence intervals, what is meant by a statistical model, two-sample tests and one-way analysis of variance (ANOVA) and reproducible reports in Quarto.\n\nPages made with R (R Core Team 2024), Quarto (allaire2022?), knitr (knitr?), kableExtra (Zhu 2021)"
+ "text": "You are either\n\nan integrated masters student doing BIO00088H Group Research Project or\nan MSc Bioinformatics student doing BIO00070M Research, Professional and Team Skills\n\nIntegrated masters students doing 88H will be doing one of these projects:\nThe project types are:\n\n\n\n\n\n\n\n\nTitle\nDirector\nData analysis strand\n\n\n\n\nIdentifying transcriptional targets of FGF signalling in Xenopus embryos.\nBetsy Pownall\nTranscriptomics, Emma Rand\n\n\nInvestigating the differentiation of stem cells in healthy bone marrow\nJillian Barlow\nTranscriptomics, Emma Rand\n\n\nInvestigating pathways involved in the Nickel detoxification in Willow\nLiz Rylott\nTranscriptomics, Emma Rand\n\n\nInvestigating differential RNA expression through the Leishmania lifecycle\nPegine Walrad\nTranscriptomics, Emma Rand\n\n\nIdentifying novel proteins regulating synaptophagy\nRichard Maguire\nImage analysis, Richard Bingham\n\n\nDefining pathological cascades in dopaminergic neurons in a Parkinson’s model\nSean Sweeney\nImage analysis, Richard Bingham\n\n\nDiscovery proteins for biotech applications: new classes of antibody mimetics\nMichael Plevin\nStructure Analysis, Jon Agirre\n\n\n\nData Analysis compromises five workshops covering computational skills needed in your project. MSc Bioinformatics students do the Core workshops and the transcriptomics workshops as part of BIO00070M. The data analysis workshops are:\n\n\n\n\n\n\n\nWeek\nData Strand\n\n\n\n\n2\nCore 1 Supporting Information - reproducibility, project-oriented workflow, naming things, cool code, handy shortcuts\n\n\n3\nStrand specific 1\n\n\n4\nStrand specific 2\n\n\n5\nStrand specific 3\n\n\n6\nCore 2 Supporting Information - documenting with a README, curating code, non-coded processes\n\n\n\n\n\n\n\n\n\nStudents who successfully complete this module will be able to\n\nuse appropriate computational techniques to reproducibly process, analyse and visualise data and generate scientific reports based on project work.\n\n\n\n\nAll material is on the VLE so why is this site useful? This site collects everything together in a searchable way. The search icon is on the top right.\n\n\n\nRand E (2024). Data Analysis for Group Project. https://3mmarand.github.io/BIO00088H-data/.\nPages made with R (R Core Team 2024), Quarto (Allaire et al. 2024), knitr [Xie (2024); knitr2; knitr3], kableExtra (Zhu 2021)\nReferences"
},
{
- "objectID": "core/week-6-old/workshop.html#session-overview",
- "href": "core/week-6-old/workshop.html#session-overview",
- "title": "Workshop",
+ "objectID": "index.html#module-learning-outcome-linked-to-this-content",
+ "href": "index.html#module-learning-outcome-linked-to-this-content",
+ "title": "Data Analysis for the Group Research Project",
"section": "",
- "text": "Use this session to ask any questions about Core 1 Organising reproducible data analyses and Core 2 File types, workflow tips and other tools in particular, or about R and RStudio in general. We will also try to answer any questions about the ’mics, Image and Structure strands.\n88H students might also review Stage 1 and 2 content to see if there are areas you might benefit from revisiting. You can access these through the past VLE sites but you might find it helpful to use the latest versions because there is no 2FA and the resources are searchable.\nStage 1\n\nData Analysis in R for Becoming a Bioscientist 1.Core concepts about scientific computing, types of variable, the role of variables in analysis and how to use RStudio to organise analysis and import, summarise and plot data.\nData Analysis in R for Becoming a Bioscientist 2. The logic of hypothesis testing, confidence intervals, what is meant by a statistical model, two-sample tests and one- and two-way analysis of variance (ANOVA).\n\nStage 2\n\nGet Introductory Statistical Tests as Linear models: A guide for R users\nA simple introduction to GLM for analysing Poisson and Binomial responses in R\n\n70M students might also review 52M content to see if there are areas you might benefit from revisiting. You can access these through the VLE site but you might find it helpful to use this link without 2FA.\n\n52M Data Analysis in R. Core concepts about scientific computing, types of variable, the role of variables in analysis and how to use RStudio to organise analysis and import, summarise and plot data, the logic of hypothesis testing, confidence intervals, what is meant by a statistical model, two-sample tests and one-way analysis of variance (ANOVA) and reproducible reports in Quarto.\n\nPages made with R (R Core Team 2024), Quarto (allaire2022?), knitr (knitr?), kableExtra (Zhu 2021)"
+ "text": "Students who successfully complete this module will be able to\n\nuse appropriate computational techniques to reproducibly process, analyse and visualise data and generate scientific reports based on project work."
},
{
- "objectID": "core/week-6-old/study_before_workshop.html",
- "href": "core/week-6-old/study_before_workshop.html",
- "title": "Independent Study to prepare for workshop",
+ "objectID": "index.html#what-is-this-site-for",
+ "href": "index.html#what-is-this-site-for",
+ "title": "Data Analysis for the Group Research Project",
"section": "",
- "text": "📖 Read materials from Core 1 Organising reproducible data analyses and make a note of questions you have\n📖 Read materials from Core 2 File types, workflow tips and other tools and make a note of questions you have.\n📖 Review Stage 1 and 2 (88H students) or 52M (70M students) content to see if there are areas you might benefit from revisiting. You can access these through the past VLE sites but you might find it helpful to use the latest versions, particularly for stage 1.\n\nStage 1\n\nData Analysis in R for Becoming a Bioscientist 1.Core concepts about scientific computing, types of variable, the role of variables in analysis and how to use RStudio to organise analysis and import, summarise and plot data.\nData Analysis in R for Becoming a Bioscientist 2. The logic of hypothesis testing, confidence intervals, what is meant by a statistical model, two-sample tests and one- and two-way analysis of variance (ANOVA).\n\nStage 2\n\nGet Introductory Statistical Tests as Linear models: A guide for R users\nA simple introduction to GLM for analysing Poisson and Binomial responses in R\n\n52M\n\n52M Data Analysis in R. Core concepts about scientific computing, types of variable, the role of variables in analysis and how to use RStudio to organise analysis and import, summarise and plot data, the logic of hypothesis testing, confidence intervals, what is meant by a statistical model, two-sample tests and one-way analysis of variance (ANOVA) and reproducible reports in Quarto."
+ "text": "All material is on the VLE so why is this site useful? This site collects everything together in a searchable way. The search icon is on the top right."
},
{
- "objectID": "core/week-6/workshop.html",
- "href": "core/week-6/workshop.html",
- "title": "Workshop",
+ "objectID": "index.html#please-cite-as",
+ "href": "index.html#please-cite-as",
+ "title": "Data Analysis for the Group Research Project",
"section": "",
- "text": "In this workshop we will discuss why reproducibility matters and how to organise your work to make it reproducible. We will cover:",
- "crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
- "Workshop"
- ]
+ "text": "Rand E (2024). Data Analysis for Group Project. https://3mmarand.github.io/BIO00088H-data/.\nPages made with R (R Core Team 2024), Quarto (Allaire et al. 2024), knitr [Xie (2024); knitr2; knitr3], kableExtra (Zhu 2021)\nReferences"
},
{
- "objectID": "core/week-6/workshop.html#session-overview",
- "href": "core/week-6/workshop.html#session-overview",
- "title": "Workshop",
+ "objectID": "images/images.html",
+ "href": "images/images.html",
+ "title": "Image Data Analysis for Group Project",
"section": "",
- "text": "In this workshop we will discuss why reproducibility matters and how to organise your work to make it reproducible. We will cover:",
+ "text": "The following ImageJ workflow uses the processing steps you used in workshop 3 with one change. That change is to save the results to file rather than having the results window pop up and saving from there. Or maybe two changes: it also tells you to use meaning systematic file names that will be easy to process when importing data. The RStudio workflow shows you how to import multiple files into one dataframe with columns indicating the treatment.\n\nSave files with systematic names: ev_0.avi 343_0.avi ev_1.avi 343_1.avi ev_2.5.avi 343_2.5.avi\nOpen ImageJ\nOpen video file eg ev_2.5.avi\n\nConvert to 8-bit: Image | Type | 8-bit\nCrop to petri dish: Select then Image | Crop\nCalculate average pixel intensity: Image | Stacks | Z Project\n\nProjection type: Average Intensity to create AVG_ev_2.5.avi\n\n\n\nSubtract average from image: Process | Image Calculator\n\nImage 1: ev_2.5.avi\n\nOperation: Subtract\nImage 2: AVG_ev_2.5.avi\n\nCreate new window: checked\nOK, Yes to Process all\n\n\nInvert: Edit | Invert\nAdjust threshold: Image | Adjust | Threshold\n\nMethod: Default\nThresholding: Default, B&W\nDark background: checked\nAuto or adjust a little but make sure the larvae do not disappear at later points in the video (use the slider)\nApply\n\n\nInvert: Edit | Invert\nTrack: Plugins | wrMTrck\n\nSet minSize: 10\nSet maxSize: 400\nSet maxVelocity: 10\nSet maxAreaChange: 200\nSet bendThreshold: 1\n\nImportant: check Save Results File This is different to what you did in the workshop. It will help because the results will be saved automatically rather than to saving from the Results window that other pops up. Consequently, you will be able to save the results files with systematic names relating to their treatments and then read them into R simultaneously. That will also allow you to add information from the name of the file (which has the treatment information) to the resulting dataframes\n\n\nwrMTrck window with the settings listed above shown\n\n\nClick OK. Save to a folder for all the tracking data files. I recommend deleting the “Results of..” part of the name\n\n\nCheck that the Summary window indicates 3 tracks and that the 3 larvae are what is tracked by using the slider on the Result image\nRepeat for all videos\n\nThis is the code you need to import multiple csv files into a single dataframe and add a column with the treatment information from the file name. This is why systematic file names are good.\nIt assumes\n\nyour files are called type_concentration.txt for example: ev_0.txt 343_0.txt ev_1.txt 343_1.txt ev_2.5.txt 343_2.5.txt.\nthe .txt datafile are in a folder called track inside your working directory\nyou have installed the following packages: tidyverse, janitor\n\n\n🎬 Load the tidyverse\n\nlibrary(tidyverse)\n\n🎬 Put the file names into a vector we will iterate through\n\n# get a vector of the file names\nfiles <- list.files(path = \"track\", full.names = TRUE )\n\nWe can use map_df() from the purrr package which is one of the tidyverse gems loaded with tidyvserse. map_df() will iterate through files and read them into a dataframe with a specified import function. We are using read_table(). map_df() keeps track of the file by adding an index column called file to the resulting dataframe. Instead of this being a number (1 - 6 here) we can use set_names() to use the file names instead. The clean_names() function from the janitor package will clean up the column names (make them lower case, replace spaces with _ remove special characters etc)\n🎬 Import multiple csv files into one dataframe called tracking\n\n# import multiple data files into one dataframe called tracking\n# using map_df() from purrr package\n# clean the column names up using janitor::clean_names()\ntracking <- files |> \n set_names() |>\n map_dfr(read_table, .id = \"file\") |>\n janitor::clean_names()\n\nYou will get a warning Duplicated column names deduplicated: 'avgX' => 'avgX_1' [15] for each of the files because the csv files each have two columns called avgX. If you click on the tracking dataframe you see is contains the data from all the files.\nNow we can add columns for the type and the concentration by processing the values in the file. The values are like track/343_0.txt so we need to remove .txt and track/ and separate the remaining words into two columns.\n🎬 Process the file column to add columns for the type and the concentration\n\n# extract type and concentration from file name\n# and put them into additopnal separate columns\ntracking <- tracking |> \n mutate(file = str_remove(file, \".txt\")) |>\n mutate(file = str_remove(file, \"track/\")) |>\n extract(file, remove = \n FALSE,\n into = c(\"type\", \"conc\"), \n regex = \"([^_]{2,3})_(.+)\") \n\n[^_]{2,3} matches two or three characters that are not _ at the start of the string (^)\n.+ matches one or more characters. The extract() function puts the first match into the first column, type, and the second match into the second column, conc. The remove = FALSE argument means the original column is kept.\nYou now have a dataframe with all the tracking data which is relatively easy to summarise and plot using tools you know.\nThere is an example RStudio project containing this code here: tips. You can also download the project as a zip file from there but there is some code that will do that automatically for you. Since this is an RStudio Project, do not run the code from inside a project. You may want to navigate to a particular directory or edit the destdir:\n\nusethis::use_course(url = \"3mmaRand/tips\", destdir = \".\")\n\nYou can agree to deleting the zip. You should find RStudio restarts and you have a new project called tips-xxxxxx. The xxxxxx is a commit reference - you do not need to worry about that, it is just a way to tell you which version of the repo you downloaded. You can now run the code in the project.",
"crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
- "Workshop"
+ "Image Analysis",
+ "Image Data Analysis for Group Project"
]
},
{
- "objectID": "core/week-6/workshop.html#what-is-reproducibility",
- "href": "core/week-6/workshop.html#what-is-reproducibility",
- "title": "Workshop",
- "section": "What is reproducibility?",
- "text": "What is reproducibility?\n\nReproducible: Same data + same analysis = identical results. “… obtaining consistent results using the same input data; computational steps, methods, and code; and conditions of analysis. This definition is synonymous with”computational reproducibility” (National Academies of Sciences et al. 2019)\nReplicable: Different data + same analysis = qualitatively similar results. The work is not dependent on the specificities of the data.\nRobust: Same data + different analysis = qualitatively similar or identical results. The work is not dependent on the specificities of the analysis.\nGeneralisable: Different data + different analysis = qualitatively similar results and same conclusions. The findings can be generalised\n\n\n\n\nThe Turing Way's definitions of reproducible research",
+ "objectID": "images/images.html#worm-tracking",
+ "href": "images/images.html#worm-tracking",
+ "title": "Image Data Analysis for Group Project",
+ "section": "",
+ "text": "The following ImageJ workflow uses the processing steps you used in workshop 3 with one change. That change is to save the results to file rather than having the results window pop up and saving from there. Or maybe two changes: it also tells you to use meaning systematic file names that will be easy to process when importing data. The RStudio workflow shows you how to import multiple files into one dataframe with columns indicating the treatment.\n\nSave files with systematic names: ev_0.avi 343_0.avi ev_1.avi 343_1.avi ev_2.5.avi 343_2.5.avi\nOpen ImageJ\nOpen video file eg ev_2.5.avi\n\nConvert to 8-bit: Image | Type | 8-bit\nCrop to petri dish: Select then Image | Crop\nCalculate average pixel intensity: Image | Stacks | Z Project\n\nProjection type: Average Intensity to create AVG_ev_2.5.avi\n\n\n\nSubtract average from image: Process | Image Calculator\n\nImage 1: ev_2.5.avi\n\nOperation: Subtract\nImage 2: AVG_ev_2.5.avi\n\nCreate new window: checked\nOK, Yes to Process all\n\n\nInvert: Edit | Invert\nAdjust threshold: Image | Adjust | Threshold\n\nMethod: Default\nThresholding: Default, B&W\nDark background: checked\nAuto or adjust a little but make sure the larvae do not disappear at later points in the video (use the slider)\nApply\n\n\nInvert: Edit | Invert\nTrack: Plugins | wrMTrck\n\nSet minSize: 10\nSet maxSize: 400\nSet maxVelocity: 10\nSet maxAreaChange: 200\nSet bendThreshold: 1\n\nImportant: check Save Results File This is different to what you did in the workshop. It will help because the results will be saved automatically rather than to saving from the Results window that other pops up. Consequently, you will be able to save the results files with systematic names relating to their treatments and then read them into R simultaneously. That will also allow you to add information from the name of the file (which has the treatment information) to the resulting dataframes\n\n\nwrMTrck window with the settings listed above shown\n\n\nClick OK. Save to a folder for all the tracking data files. I recommend deleting the “Results of..” part of the name\n\n\nCheck that the Summary window indicates 3 tracks and that the 3 larvae are what is tracked by using the slider on the Result image\nRepeat for all videos\n\nThis is the code you need to import multiple csv files into a single dataframe and add a column with the treatment information from the file name. This is why systematic file names are good.\nIt assumes\n\nyour files are called type_concentration.txt for example: ev_0.txt 343_0.txt ev_1.txt 343_1.txt ev_2.5.txt 343_2.5.txt.\nthe .txt datafile are in a folder called track inside your working directory\nyou have installed the following packages: tidyverse, janitor\n\n\n🎬 Load the tidyverse\n\nlibrary(tidyverse)\n\n🎬 Put the file names into a vector we will iterate through\n\n# get a vector of the file names\nfiles <- list.files(path = \"track\", full.names = TRUE )\n\nWe can use map_df() from the purrr package which is one of the tidyverse gems loaded with tidyvserse. map_df() will iterate through files and read them into a dataframe with a specified import function. We are using read_table(). map_df() keeps track of the file by adding an index column called file to the resulting dataframe. Instead of this being a number (1 - 6 here) we can use set_names() to use the file names instead. The clean_names() function from the janitor package will clean up the column names (make them lower case, replace spaces with _ remove special characters etc)\n🎬 Import multiple csv files into one dataframe called tracking\n\n# import multiple data files into one dataframe called tracking\n# using map_df() from purrr package\n# clean the column names up using janitor::clean_names()\ntracking <- files |> \n set_names() |>\n map_dfr(read_table, .id = \"file\") |>\n janitor::clean_names()\n\nYou will get a warning Duplicated column names deduplicated: 'avgX' => 'avgX_1' [15] for each of the files because the csv files each have two columns called avgX. If you click on the tracking dataframe you see is contains the data from all the files.\nNow we can add columns for the type and the concentration by processing the values in the file. The values are like track/343_0.txt so we need to remove .txt and track/ and separate the remaining words into two columns.\n🎬 Process the file column to add columns for the type and the concentration\n\n# extract type and concentration from file name\n# and put them into additopnal separate columns\ntracking <- tracking |> \n mutate(file = str_remove(file, \".txt\")) |>\n mutate(file = str_remove(file, \"track/\")) |>\n extract(file, remove = \n FALSE,\n into = c(\"type\", \"conc\"), \n regex = \"([^_]{2,3})_(.+)\") \n\n[^_]{2,3} matches two or three characters that are not _ at the start of the string (^)\n.+ matches one or more characters. The extract() function puts the first match into the first column, type, and the second match into the second column, conc. The remove = FALSE argument means the original column is kept.\nYou now have a dataframe with all the tracking data which is relatively easy to summarise and plot using tools you know.\nThere is an example RStudio project containing this code here: tips. You can also download the project as a zip file from there but there is some code that will do that automatically for you. Since this is an RStudio Project, do not run the code from inside a project. You may want to navigate to a particular directory or edit the destdir:\n\nusethis::use_course(url = \"3mmaRand/tips\", destdir = \".\")\n\nYou can agree to deleting the zip. You should find RStudio restarts and you have a new project called tips-xxxxxx. The xxxxxx is a commit reference - you do not need to worry about that, it is just a way to tell you which version of the repo you downloaded. You can now run the code in the project.",
"crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
- "Workshop"
+ "Image Analysis",
+ "Image Data Analysis for Group Project"
]
},
{
- "objectID": "core/week-6/workshop.html#why-does-it-matter",
- "href": "core/week-6/workshop.html#why-does-it-matter",
+ "objectID": "transcriptomics/week-4/workshop.html",
+ "href": "transcriptomics/week-4/workshop.html",
"title": "Workshop",
- "section": "Why does it matter?",
- "text": "Why does it matter?\n\n\n\nfutureself, CC-BY-NC, by Julen Colomb\n\n\n\nFive selfish reasons to work reproducibly (Markowetz 2015). Alternatively, see the very entertaining talk\nMany high profile cases of work which did not reproduce e.g. Anil Potti unravelled by Baggerly and Coombes (2009)\nWill become standard in Science and publishing e.g OECD Global Science Forum Building digital workforce capacity and skills for data-intensive science (OECD Global Science Forum 2020)",
+ "section": "",
+ "text": "In the workshop, you will learn how to perform differential expression analysis on raw counts using DESeq2 (Love, Huber, and Anders 2014) or on logged normalised expression values using scran (Lun, McCarthy, and Marioni 2016) or both.",
"crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "core/week-6/workshop.html#how-to-achieve-reproducibility",
- "href": "core/week-6/workshop.html#how-to-achieve-reproducibility",
+ "objectID": "transcriptomics/week-4/workshop.html#session-overview",
+ "href": "transcriptomics/week-4/workshop.html#session-overview",
"title": "Workshop",
- "section": "How to achieve reproducibility",
- "text": "How to achieve reproducibility\n\nScripting\nOrganisation: Project-oriented workflows with file and folder structure, naming things\nDocumentation: Readme files, code comments, metadata, version control",
+ "section": "",
+ "text": "In the workshop, you will learn how to perform differential expression analysis on raw counts using DESeq2 (Love, Huber, and Anders 2014) or on logged normalised expression values using scran (Lun, McCarthy, and Marioni 2016) or both.",
"crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "core/week-6/workshop.html#rationale-for-scripting",
- "href": "core/week-6/workshop.html#rationale-for-scripting",
+ "objectID": "transcriptomics/week-4/workshop.html#frog-development",
+ "href": "transcriptomics/week-4/workshop.html#frog-development",
"title": "Workshop",
- "section": "Rationale for scripting?",
- "text": "Rationale for scripting?\n\nScience is the generation of ideas, designing work to test them and reporting the results.\nWe ensure laboratory and field work is replicable, robust and generalisable by planning and recording in lab books and using standard protocols. Repeating results is still hard.\nWorkflows for computational projects, and the data analysis and reporting of other work can, and should, be 100% reproducible!\nScripting is the way to achieve this.",
+ "section": "🐸 Frog development",
+ "text": "🐸 Frog development\n🎬 Open the frogs-88H RStudio Project and the cont-fgf-s30.R script.",
"crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "core/week-6/workshop.html#project-oriented-workflow",
- "href": "core/week-6/workshop.html#project-oriented-workflow",
+ "objectID": "transcriptomics/week-4/workshop.html#arabidopisis",
+ "href": "transcriptomics/week-4/workshop.html#arabidopisis",
"title": "Workshop",
- "section": "Project-oriented workflow",
- "text": "Project-oriented workflow\n\nuse folders to organise your work\nyou are aiming for structured, systematic and repeatable.\ninputs and outputs should be clearly identifiable from structure and/or naming\n\nExamples\n-- liver_transcriptome/\n |__data\n |__raw/\n |__processed/\n |__images/\n |__code/\n |__reports/\n |__figures/",
+ "section": "🎄 Arabidopisis",
+ "text": "🎄 Arabidopisis\n🎬 Open the arabi-88H RStudio Project and the wildsuf-wilddef-s30.R script.",
"crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "core/week-6/workshop.html#naming-things",
- "href": "core/week-6/workshop.html#naming-things",
+ "objectID": "transcriptomics/week-4/workshop.html#leishmania-mexicana",
+ "href": "transcriptomics/week-4/workshop.html#leishmania-mexicana",
"title": "Workshop",
- "section": "Naming things",
- "text": "Naming things\n\n\n\ndocuments, CC-BY-NC, https://xkcd.com/1459/\n\n\nGuiding principle - Have a convention! Good file names are:\n\nmachine readable\nhuman readable\nplay nicely with sorting\n\nI suggest\n\nno spaces in names\nuse snake_case or kebab-case rather than CamelCase or dot.case\nuse all lower case except very occasionally where convention is otherwise, e.g., README, LICENSE\nordering: use left-padded numbers e.g., 01, 02….99 or 001, 002….999\ndates ISO 8601 format: 2020-10-16\nwrite down your conventions\n\n-- liver_transcriptome/\n |__data\n |__raw/\n |__2022-03-21_donor_1.csv\n |__2022-03-21_donor_2.csv\n |__2022-03-21_donor_3.csv\n |__2022-05-14_donor_1.csv\n |__2022-05-14_donor_2.csv\n |__2022-05-14_donor_3.csv\n |__processed/\n |__images/\n |__code/\n |__functions/\n |__summarise.R\n |__normalise.R\n |__theme_volcano.R\n |__01_data_processing.py\n |__02_exploratory.R\n |__03_modelling.R\n |__04_figures.R\n |__reports/\n |__01_report.qmd\n |__02_supplementary.qmd\n |__figures/\n |__01_volcano_donor_1_vs_donor_2.eps\n |__02_volcano_donor_1_vs_donor_3.eps",
+ "section": "💉 Leishmania mexicana",
+ "text": "💉 Leishmania mexicana\n🎬 Open the leish-88H RStudio Project and the pro-meta-s30.R script.",
"crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "core/week-6/workshop.html#readme-files",
- "href": "core/week-6/workshop.html#readme-files",
+ "objectID": "transcriptomics/week-4/workshop.html#stem-cells",
+ "href": "transcriptomics/week-4/workshop.html#stem-cells",
"title": "Workshop",
- "section": "Readme files",
- "text": "Readme files\nREADMEs are a form of documentation which have been widely used for a long time. They contain all the information about the other files in a directory. They can be extensive but need not be. Concise is good. Bullet points are good\n\nGive a project title and description, brief\nstart date, last updated date and contact information\nOutline the folder structure\nGive software requirements: programs and versions used or required. There are packages that give session information in R Wickham et al. (2021) and Python Ostblom, Joel (2019)\n\nR:\nsessioninfo::session_info()\nPython:\nimport session_info\nsession_info.show()\n\nInstructions run the code, build reports, and reproduce the figures etc\nWhere to find the data, outputs\nAny other information that needed to understand and recreate the work\nIdeally, a summary of changes with the date\n\n-- liver_transcriptome/\n |__data\n |__raw/\n |__2022-03-21_donor_1.csv\n |__2022-03-21_donor_2.csv\n |__2022-03-21_donor_3.csv\n |__2022-05-14_donor_1.csv\n |__2022-05-14_donor_2.csv\n |__2022-05-14_donor_3.csv\n |__processed/\n |__images/\n |__code/\n |__functions/\n |__summarise.R\n |__normalise.R\n |__theme_volcano.R\n |__01_data_processing.py\n |__02_exploratory.R\n |__03_modelling.R\n |__04_figures.R\n |__README.md\n |__reports/\n |__01_report.qmd\n |__02_supplementary.qmd\n |__figures/\n |__01_volcano_donor_1_vs_donor_2.eps\n |__02_volcano_donor_1_vs_donor_3.eps",
+ "section": "🐭 Stem cells",
+ "text": "🐭 Stem cells\n🎬 Open the mice-88H RStudio Project and the hspc-prog.R script.",
"crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "core/week-6/workshop.html#code-comments",
- "href": "core/week-6/workshop.html#code-comments",
+ "objectID": "transcriptomics/week-4/workshop.html#everyone",
+ "href": "transcriptomics/week-4/workshop.html#everyone",
"title": "Workshop",
- "section": "Code comments",
- "text": "Code comments\n\nComments are notes in the code which are not executed. They are ignored by the computer but are read by humans. They are used to explain what the code is doing and why. They are also used to temporarily remove code from execution.",
+ "section": "Everyone",
+ "text": "Everyone\n🎬 Make a new folder results in the project directory.\nThis is where we will save our results.\n🎬 Load tidyverse (Wickham et al. 2019) You most likely have this code at the top of `your script already.\n\nlibrary(tidyverse)\n\n── Attaching core tidyverse packages ─────────────────────────────────────────────── tidyverse 2.0.0 ──\n✔ dplyr 1.1.3 ✔ readr 2.1.4\n✔ forcats 1.0.0 ✔ stringr 1.5.0\n✔ ggplot2 3.4.3 ✔ tibble 3.2.1\n✔ lubridate 1.9.3 ✔ tidyr 1.3.0\n✔ purrr 1.0.2 \n── Conflicts ───────────────────────────────────────────────────────────────── tidyverse_conflicts() ──\n✖ dplyr::filter() masks stats::filter()\n✖ dplyr::lag() masks stats::lag()\nℹ Use the conflicted package to force all conflicts to become errors\nHave you ever stopped to think about this message? It is telling us that there are functions in the dplyr package that have the same name as functions in the stats package and that R will use the dplyr version. As this is what you want, this has always been fine. It still is fine in this case. However, as you start to load more packages, you will want to know if you are using a function from a package that has the same name as a function in another loaded package. This is where the conflicted (Wickham 2023) package comes in. Conflicted will warn you when you are using a function that has the same name as a function in another package. You can then choose which function to use.\n🎬 Load the conflicted package:\n\nlibrary(conflicted)\n\nInstead of getting a warning every time you are using a function that has a function with the same name in another package, we can declare a preference for one function over another. This is useful for the functions you use a lot or ones where you are certain you always want to use a particular function.\nFor example, to always use the dplyr version of filter() by default you can add this to the top of your script:\n\nconflicts_prefer(dplyr::filter)\n\nWe will also want to ensure that we are using the setdiff() function from the GenomicRanges package.\n\nconflicts_prefer(GenomicRanges::setdiff)",
"crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
+ "Transcriptomics",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "core/week-6/study_before_workshop.html",
- "href": "core/week-6/study_before_workshop.html",
- "title": "Independent Study to prepare for workshop",
- "section": "",
- "text": "📖 Read Understanding file systems. This is an approximately 15 - 20 minute read revising file types and filesystems. It covers concepts of working directories and paths. We learned these ideas in stage 1 and you may feel completely confident with them but many students will benefit from a refresher. For BIO00070M students, this is part of the work you will also be asked to complete for BIO00052M Data Analysis in R.\nIn previous years you have submitted and RStudio Project as part of your BABS work. In this module you will develop this by submitting a Research Compendium. A Research Compendium is a documented collection of all the digital parts of the research project including data (or access to data), code and outputs. The Compendium might be a single Quarto/RStudio Project, (like you have done previously but with better documentation) or it might be a folder including an Quarto/RStudio Project and other material/scripts including the description of unscripted processing. You might want to remind yourself of the example RStudio Project, Y12345678.zip used in BABS 2.",
- "crumbs": [
- "Core Supporting Info",
- "Week 6: Supporting Information 2",
- "Prepare!"
- ]
- },
- {
- "objectID": "structures/structures.html",
- "href": "structures/structures.html",
- "title": "Structure Data Analysis for Group Project",
- "section": "",
- "text": "There is an RStudio project containing a Quarto version of the the Antibody Mimetics Workshop by Michael Plevin & Jon Agirre. Instructions to obtain the RStudio project are at the bottom of this document after the set up instructions.\nYou might find RStudio useful for Python because you are already familiar with it. It is also a good way to create Quarto documents with code chunks in more than one language. Quarto documents can be used in RStudio, VS Code or Jupyter notebooks\nSome set up is required before you will be able to execute code in antibody_mimetics_workshop_3.qmd. This in contrast to the Colab notebook which is a cloud-based Jupyter notebook and does not require any set up (except installing packages).\n\n🎬 If using your own machine, install Python from https://www.python.org/downloads/. This should not be necessary if you are using a university machine where Python is already installed.\n🎬 If using your own machine and you did not install Quarto in the Core 1 workshop, install it now from https://quarto.org/docs/get-started/. This should not be necessary if you are using a university machine where quarto is already installed.\n🎬 Open RStudio and check you are using a “Git bash” Terminal: Tools | Global Options| Terminal | New Terminal opens with… . If the option to choose Git bash, you will need to install Git from https://git-scm.com/downloads. Quit RStudio first. This should not be necessary if you are using a university machine where Git bash is already installed.\n🎬 If on your own machine: In RStudio, install the quarto and the recticulate packages. This should not be necessary if you are using a university machine where these packages are already installed.\n🎬 Whether you are using your own machine or a university machine, you need to install some python packages. In RStudio and go to the Terminal window (behind the Console window). Run the following commands in the Terminal window:\npython -m pip install --upgrade pip setuptools wheel\nYou may get these warnings about scripts not being on the path. You can ignore these.\n WARNING: The script wheel.exe is installed in 'C:\\Users\\er13\\AppData\\Roaming\\Python\\Python39\\Scripts' which is not on PATH.\n Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.\n WARNING: The scripts pip.exe, pip3.11.exe, pip3.9.exe and pip3.exe are installed in 'C:\\Users\\er13\\AppData\\Roaming\\Python\\Python39\\Scripts' which is not on PATH.\n Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.\nERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\nspyder 5.1.5 requires pyqt5<5.13, which is not installed.\nspyder 5.1.5 requires pyqtwebengine<5.13, which is not installed.\nconda-repo-cli 1.0.4 requires pathlib, which is not installed.\nanaconda-project 0.10.2 requires ruamel-yaml, which is not installed.\nSuccessfully installed pip-23.3.1 setuptools-69.0.2 wheel-0.41.3\npython -m pip install session_info\npython -m pip install wget\npython -m pip install gemmi\nNote: On my windows laptop at home, I also had to install C++ Build Tools to be able to install the gemmi python package. If this is true for you, you will get a fail message telling you to install C++ build tools if you need them. These are from https://visualstudio.microsoft.com/visual-cpp-build-tools/ You need to check the Workloads tab and select C++ build tools.\n\nYou can then install the gemmi package again.\nI think that’s it! You can now download the RStudio project and run each chunk in the quarto document.\nThere is an example RStudio project here: structure-analysis. You can also download the project as a zip file from there but there is some code that will do that automatically for you. Since this is an RStudio Project, do not run the code from inside a project. You may want to navigate to a particular directory or edit the destdir:\n\nusethis::use_course(url = \"3mmaRand/structure-analysis\", destdir = \".\")\n\nYou can agree to deleting the zip. You should find RStudio restarts and you have a new project called structure-analysis-xxxxxx. The xxxxxx is a commit reference - you do not need to worry about that, it is just a way to tell you which version of the repo you downloaded.\nYou should be able to open the antibody_mimetics_workshop_3.qmd file and run each chunk. You can also knit the document to html.",
- "crumbs": [
- "Structure Analysis",
- "Structure Data Analysis for Group Project"
- ]
- },
- {
- "objectID": "structures/structures.html#programmatic-protein-structure-analysis",
- "href": "structures/structures.html#programmatic-protein-structure-analysis",
- "title": "Structure Data Analysis for Group Project",
- "section": "",
- "text": "There is an RStudio project containing a Quarto version of the the Antibody Mimetics Workshop by Michael Plevin & Jon Agirre. Instructions to obtain the RStudio project are at the bottom of this document after the set up instructions.\nYou might find RStudio useful for Python because you are already familiar with it. It is also a good way to create Quarto documents with code chunks in more than one language. Quarto documents can be used in RStudio, VS Code or Jupyter notebooks\nSome set up is required before you will be able to execute code in antibody_mimetics_workshop_3.qmd. This in contrast to the Colab notebook which is a cloud-based Jupyter notebook and does not require any set up (except installing packages).\n\n🎬 If using your own machine, install Python from https://www.python.org/downloads/. This should not be necessary if you are using a university machine where Python is already installed.\n🎬 If using your own machine and you did not install Quarto in the Core 1 workshop, install it now from https://quarto.org/docs/get-started/. This should not be necessary if you are using a university machine where quarto is already installed.\n🎬 Open RStudio and check you are using a “Git bash” Terminal: Tools | Global Options| Terminal | New Terminal opens with… . If the option to choose Git bash, you will need to install Git from https://git-scm.com/downloads. Quit RStudio first. This should not be necessary if you are using a university machine where Git bash is already installed.\n🎬 If on your own machine: In RStudio, install the quarto and the recticulate packages. This should not be necessary if you are using a university machine where these packages are already installed.\n🎬 Whether you are using your own machine or a university machine, you need to install some python packages. In RStudio and go to the Terminal window (behind the Console window). Run the following commands in the Terminal window:\npython -m pip install --upgrade pip setuptools wheel\nYou may get these warnings about scripts not being on the path. You can ignore these.\n WARNING: The script wheel.exe is installed in 'C:\\Users\\er13\\AppData\\Roaming\\Python\\Python39\\Scripts' which is not on PATH.\n Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.\n WARNING: The scripts pip.exe, pip3.11.exe, pip3.9.exe and pip3.exe are installed in 'C:\\Users\\er13\\AppData\\Roaming\\Python\\Python39\\Scripts' which is not on PATH.\n Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.\nERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\nspyder 5.1.5 requires pyqt5<5.13, which is not installed.\nspyder 5.1.5 requires pyqtwebengine<5.13, which is not installed.\nconda-repo-cli 1.0.4 requires pathlib, which is not installed.\nanaconda-project 0.10.2 requires ruamel-yaml, which is not installed.\nSuccessfully installed pip-23.3.1 setuptools-69.0.2 wheel-0.41.3\npython -m pip install session_info\npython -m pip install wget\npython -m pip install gemmi\nNote: On my windows laptop at home, I also had to install C++ Build Tools to be able to install the gemmi python package. If this is true for you, you will get a fail message telling you to install C++ build tools if you need them. These are from https://visualstudio.microsoft.com/visual-cpp-build-tools/ You need to check the Workloads tab and select C++ build tools.\n\nYou can then install the gemmi package again.\nI think that’s it! You can now download the RStudio project and run each chunk in the quarto document.\nThere is an example RStudio project here: structure-analysis. You can also download the project as a zip file from there but there is some code that will do that automatically for you. Since this is an RStudio Project, do not run the code from inside a project. You may want to navigate to a particular directory or edit the destdir:\n\nusethis::use_course(url = \"3mmaRand/structure-analysis\", destdir = \".\")\n\nYou can agree to deleting the zip. You should find RStudio restarts and you have a new project called structure-analysis-xxxxxx. The xxxxxx is a commit reference - you do not need to worry about that, it is just a way to tell you which version of the repo you downloaded.\nYou should be able to open the antibody_mimetics_workshop_3.qmd file and run each chunk. You can also knit the document to html.",
- "crumbs": [
- "Structure Analysis",
- "Structure Data Analysis for Group Project"
- ]
- },
- {
- "objectID": "transcriptomics/week-3/overview.html",
- "href": "transcriptomics/week-3/overview.html",
- "title": "Overview",
- "section": "",
- "text": "This week you will meet your data. The independent study will concisely cover how these data were generated and how they have been processed before being given to you. There will also be an overview of the analysis we will carry out over three workshops. In the workshop, you will learn what steps to take to get a good understanding of ’omics data before you consider any statistical analysis. This is an often overlooked, but very valuable and informative, part of any data pipeline. It gives you the deep understanding of the data structures and values that you will need to code and trouble-shoot code, allows you to spot failed or problematic samples and informs your decisions on quality control.\nWe suggest you sit together with your group in the workshop.\n\nLearning objectives\nThe successful student will be able to:\n\nexplore transcriptomics data to find the number of rows and columns and know how these correspond to samples and variables\nexplore the distribution of expression measures across whole data sets, across variables and across samples by summarising and plotting\nexplain what distributions are expected and interpret the distributions they have\nexplain on what basis we might filter out variables or samples\nimport, explore and filter transcriptomics data reproducibly so they can understand and reuse their code in the future\n\n\n\nInstructions\n\nPrepare\n\n📖 Read how the data were generated and how they have been processed so far\n\nWorkshop\n\n💻 Set up a Project\n💻 Import data\n💻 Explore the distribution of values across samples/cells and across genes/species\n💻 Look after future you!\n\nConsolidate\n\n💻 Use the work you completed in the workshop as a template to apply to a new case.",
+ "objectID": "transcriptomics/week-4/workshop.html#frog-development-1",
+ "href": "transcriptomics/week-4/workshop.html#frog-development-1",
+ "title": "Workshop",
+ "section": "🐸 Frog development",
+ "text": "🐸 Frog development\nWe need to import the S30 data that were filtered to remove genes with 4, 5 or 6 zeros and those where the total counts was less than 20.\n🎬 Import the data from the data-processed folder.\nNow go to Differential Expression Analysis.",
"crumbs": [
"Transcriptomics",
- "Week 3: Hello data!",
- "About"
+ "Week 4: Statistical Analysis",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-3/study_after_workshop.html",
- "href": "transcriptomics/week-3/study_after_workshop.html",
- "title": "Independent Study to consolidate this week",
- "section": "",
- "text": "You need only do the section for your own project data\n🐸 Frogs\n🎬 Open your frogs-88H Project. Make a new script and, using cont-fgf-s30.R as a template, repeat the analysis on one of the other comparisons.\n🐭 Mice\n🎬 Open your mice-88H Project. Open your hspc-prog.R script and, using you code working with the hspc cells as a template, repeat the analysis on the prog cells.\n🍂 xxxx\nFollow one of the other examples.",
+ "objectID": "transcriptomics/week-4/workshop.html#arabidopisis-1",
+ "href": "transcriptomics/week-4/workshop.html#arabidopisis-1",
+ "title": "Workshop",
+ "section": "🎄 Arabidopisis",
+ "text": "🎄 Arabidopisis\nImport\nNow go to Differential Expression Analysis.",
"crumbs": [
"Transcriptomics",
- "Week 3: Hello data!",
- "Consolidate!"
+ "Week 4: Statistical Analysis",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/workshop.html",
- "href": "transcriptomics/week-5/workshop.html",
+ "objectID": "transcriptomics/week-4/workshop.html#leishmania-mexicana-1",
+ "href": "transcriptomics/week-4/workshop.html#leishmania-mexicana-1",
"title": "Workshop",
- "section": "",
- "text": "In the workshop, you will learn how to merge gene information into our results, conduct and plot a Principle Component Analysis (PCA) as well as how to create a nicely formatted Volcano plot and heatmap.",
+ "section": "💉 Leishmania mexicana",
+ "text": "💉 Leishmania mexicana\nImport\nNow go to Differential Expression Analysis.",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/workshop.html#session-overview",
- "href": "transcriptomics/week-5/workshop.html#session-overview",
+ "objectID": "transcriptomics/week-4/workshop.html#stem-cells-1",
+ "href": "transcriptomics/week-4/workshop.html#stem-cells-1",
"title": "Workshop",
- "section": "",
- "text": "In the workshop, you will learn how to merge gene information into our results, conduct and plot a Principle Component Analysis (PCA) as well as how to create a nicely formatted Volcano plot and heatmap.",
+ "section": "🐭 Stem cells",
+ "text": "🐭 Stem cells\nImport\nNow go to Differential Expression Analysis.",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/workshop.html#import",
- "href": "transcriptomics/week-5/workshop.html#import",
+ "objectID": "transcriptomics/week-4/workshop.html#frog-development-2",
+ "href": "transcriptomics/week-4/workshop.html#frog-development-2",
"title": "Workshop",
- "section": "Import",
- "text": "Import\nWe need to import both the normalised counts and the statistical results. We will need all of these for the visualisation and interpretation.\n🎬 Import files saved from last week from the results folder: S30_normalised_counts.csv and S30_results.csv. I used the names s30_count_norm and s30_results for the dataframes.\n🎬 Remind yourself what is in the rows and columns and the structure of the dataframes (perhaps using glimpse())\n\n\n\n\n\n\n\n\n\n\n\n\n\nIt is useful to have this information in a single dataframe to which we will add the gene information from xenbase. Having all the information together will make it easier to interpret the results and select genes of interest.\n🎬 Merge the two dataframes:\n\n# merge the results with the normalised counts\ns30_results <- s30_count_norm |>\n left_join(s30_results, by = \"xenbase_gene_id\")\n\nThis means you have the counts for each sample along with the statistical results for each gene.\n🎬 Import the metadata that maps the sample names to treatments:\n\n# Import metadata that maps the sample names to treatments\nmeta <- read_table(\"meta/frog_meta_data.txt\")\nrow.names(meta) <- meta$sample_id\n# We only need the s30\nmeta_s30 <- meta |>\n dplyr::filter(stage == \"stage_30\")",
+ "section": "🐸 Frog development",
+ "text": "🐸 Frog development\nThese are the steps we will take\n\nFind the genes that are expressed in only one treatment group.\nCreate a DESeqDataSet object. This is a special object that is used by the DESeq2 package\nPrepare the normalised counts from the DESeqDataSet object.\nDo differential expression analysis on the genes. This needs to be done on the raw counts.\n\nThe all but the first step are done with the DESeq2 package\n1. Genes expressed in one treatment\nThe genes expressed in only one treatment group are those with zeros in all three replicates in one group and non-zero values in all three replicates in the other group. For example, those shown here:\n\n\n\n\n\n\n\n\n\n\n\n\n\nxenbase_gene_id\nS30_C_1\nS30_C_2\nS30_C_3\nS30_F_1\nS30_F_2\nS30_F_3\n\n\n\nXB-GENE-1018260\n0\n0\n0\n10\n2\n16\n\n\nXB-GENE-17330117\n0\n0\n0\n13\n4\n17\n\n\nXB-GENE-17332184\n0\n0\n0\n6\n19\n6\n\n\n\n\n\nWe will use filter() to find these genes.\n🎬 Find the genes that are expressed only in the FGF-treated group:\n\ns30_fgf_only <- s30_filtered |> \n filter(S30_C_1 == 0, \n S30_C_2 == 0, \n S30_C_3 == 0, \n S30_F_1 > 0, \n S30_F_2 > 0, \n S30_F_3 > 0)\n\n❓ How many genes are expressed only in the FGF-treated group?\n\n\n🎬 Now you find any genes that are expressed only in the control group.\n❓ How many genes are expressed only in the control group?\n\n\n❓ Do the results make sense to you in light of what you know about the biology?\n\n\n\n\n\n\n\n🎬 Write all the genes that are expressed one group only to file (saved in results)\n2. Create DESeqDataSet object\n🎬 Load the DESeq2 package:\nA DEseqDataSet object is a custom data type that is used by DESeq2. Custom data types are common in the Bioconductor1 packages. They are used to store data in a way that is useful for the analysis. These data types typically have data, transformed data, metadata and experimental designs within them.\nTo create a DESeqDataSet object, we need to provide three things:\n\nThe raw counts - these are in s30_filtered\n\nThe meta data which gives information about the samples and which treatment groups they belong to\nA design matrix which captures the design of the statistical model.\n\nThe counts must in a matrix rather than a dataframe. Unlike a dataframe, a matrix has columns of all the same type. That is, it will contain only the counts. The gene ids are given as row names rather than a column. The matrix() function will create a matrix from a dataframe of columns of the same type and the select() function can be used to remove the gene ids column.\n🎬 Create a matrix of the counts:\n\ns30_count_mat <- s30_filtered |>\n select(-xenbase_gene_id) |>\n as.matrix()\n\n🎬 Add the gene ids as row names to the matrix:\n\n# add the row names to the matrix\nrownames(s30_count_mat) <- s30_filtered$xenbase_gene_id\n\nYou might want to view the matrix (click on it in your environment pane).\nThe metadata are in a file, frog_meta_data.txt. This is a tab-delimited file. The first column is the sample name and the second column is the treatment group.\n🎬 Make a folder called meta and save the file to it.\n🎬 Read the metadata into a dataframe:\n\nmeta <- read_table(\"meta/frog_meta_data.txt\")\n\n🎬 Examine the resulting dataframe.\nWe need to add the sample names as row names to the metadata dataframe. This is because the DESeqDataSet object will use the row names to match the samples in the metadata to the samples in the counts matrix.\n🎬 Add the sample names as row names to the metadata dataframe:\n\nrow.names(meta) <- meta$sample_id\n\n(you will get a warning message but you can ignore it)\nWe are dealing only with the S30 data so we need to remove the samples that are not in the S30 data.\n🎬 Filter the metadata to keep only the S30 information:\n\nmeta_s30 <- meta |>\n filter(stage == \"stage_30\")\n\nWe can now create the DESeqDataSet object. The design formula describes the statistical model. You should the form from previous work. The ~ indicates that the left hand side is the response variable (in this case the counts) and the right hand side are the explanatory variables. We are interested in the difference between the treatments but we include sibling_rep to account for the fact that the data are paired.\nNote that:\n\nThe names of the columns in the count matrix have to exactly match the names of the rows in the metadata dataframe. They also need to be in the same order.\nThe names of the explanatory variables in the design formula have to match the names of columns in the metadata.\n\n🎬 Create the DESeqDataSet object:\n\ndds <- DESeqDataSetFromMatrix(countData = s30_count_mat,\n colData = meta_s30,\n design = ~ treatment + sibling_rep)\n\nThe warning “Warning: some variables in design formula are characters, converting to factors” just means that the variable type of treatment and sibling_rep in the metadata dataframe are “char” and they have been converted into the factors.\nTo help you understand what the DESeqDataSet object we have called dds contains, we can look its contents\nThe counts are in dds@assays@data@listData[[\"counts\"]] and the metadata are in dds@colData but the easiest way to see them is to use the counts() and colData() functions from the DESeq2 package.\n🎬 View the counts:\n\ncounts(dds) |> View()\n\nError in .External2(C_dataviewer, x, title): unable to start data viewer\n\n\nYou should be able to see that this is the same as in s30_count_mat.\n\ncolData(dds)\n\nDataFrame with 6 rows and 4 columns\n sample_id stage treatment sibling_rep\n <character> <character> <factor> <factor>\nS30_C_1 S30_C_1 stage_30 control one \nS30_C_2 S30_C_2 stage_30 control two \nS30_C_3 S30_C_3 stage_30 control three\nS30_F_1 S30_F_1 stage_30 FGF one \nS30_F_2 S30_F_2 stage_30 FGF two \nS30_F_3 S30_F_3 stage_30 FGF three\n\n\n3. Prepare the normalised counts\nThe normalised counts are the counts that have been transformed to account for the library size (i.e., the total number of reads in a sample) and the gene length. We have to first estimate the normalisation factors and store them in the DESeqDataSet object and then we can get the normalised counts.\n🎬 Estimate the factors for normalisation and store them in the DESeqDataSet object:\n\ndds <- estimateSizeFactors(dds)\n\n🎬 Look at the factors (just for information):\n\nsizeFactors(dds)\n\n S30_C_1 S30_C_2 S30_C_3 S30_F_1 S30_F_2 S30_F_3 \n0.8812200 0.9454600 1.2989886 1.0881870 1.0518961 0.8322894 \n\n\nThe normalised counts will be useful to use later. To get the normalised counts we again used the counts() function but this time we use the normalized=TRUE argument.\n🎬 Save the normalised to a matrix:\n\nnormalised_counts <- counts(dds, normalized = TRUE)\n\nWe will write the normalised counts to a file so that we can use them in the future.\n🎬 Make a dataframe of the normalised counts, adding a column for the gene ids at the same time:\n\ns30_normalised_counts <- data.frame(normalised_counts,\n xenbase_gene_id = row.names(normalised_counts))\n\n4. Differential expression analysis\nWe use the DESeq() function to do the differential expression analysis. This function fits the statistical model to the data and then uses the model to calculate the significance of the difference between the treatments. It again stores the results in the DESseqDataSet object. Note that the differential expression needs the raw (unnormalised counts) as it does its own normalisation as part of the process.\n🎬 Run the differential expression analysis and store the results in the same object:\n\ndds <- DESeq(dds)\n\nThe function will take only a few moments to run on this data but can take longer for bigger datasets.\nWe need to define the contrasts we want to test. We want to test the difference between the treatments so we will define the contrast as FGF and control.\n🎬 Define the contrast:\n\ncontrast_fgf <- c(\"treatment\", \"FGF\", \"control\")\n\nNote that treatment is the name of the column in the metadata dataframe and FGF and control are the names of the levels in the treatment column. By putting them in the order FGF , control we are saying the fold change will be FGF / control. This means:\n\npositive log fold changes indicate FGF > control and\nnegative log fold changes indicates control > FGF.\n\nIf we had put them in the order control, FGF we would have the reverse.\n🎬 Extract the results from the DESseqDataSet object:\n\nresults_fgf <- results(dds,\n contrast = contrast_fgf)\n\nThis will give us the log2 fold change, the p-value and the adjusted p-value between the control and the FGF-treatment for each gene.\n🎬 Put the results in a dataframe and add the gene ids as a column:\n\ns30_results <- data.frame(results_fgf,\n xenbase_gene_id = row.names(results_fgf))\n\nIt is useful to have the normalised counts and the statistical results in one dataframe.\n🎬 Merge the two dataframes:\n\n# merge the results with the normalised counts\ns30_results <- s30_normalised_counts |>\n left_join(s30_results, by = \"xenbase_gene_id\")\n\nNow go to Add gene information.",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/workshop.html#log2-transform-the-data",
- "href": "transcriptomics/week-5/workshop.html#log2-transform-the-data",
+ "objectID": "transcriptomics/week-4/workshop.html#arabidopisis-2",
+ "href": "transcriptomics/week-4/workshop.html#arabidopisis-2",
"title": "Workshop",
- "section": "log2 transform the data",
- "text": "log2 transform the data\nWe use the normalised counts for data visualisations so that the comparisons are meaningful. Since the fold changes are given is log2 it is useful to log2 transform the normalised counts too. We will add columns to the dataframe with these transformed values. Since we have some counts of 0 we will add a tiny amount to avoid -Inf values.\n🎬 log2 transform the normalised counts:\n\n# log2 transform the counts plus a tiny amount to avoid log(0)\ns30_results <- s30_results |>\n mutate(across(starts_with(\"s30\"), \n \\(x) log2(x + 0.001),\n .names = \"log2_{.col}\"))\n\nThis is a wonderful bit or R wizardry. We are using the across() function to apply a transformation to multiple columns. We have selected all the columns that start with s30. The \\(x) is an “anonymous” function that takes the value of the column and adds 0.001 to it before applying the log2() function. The .names = \"log2_{.col}\" argument tells across() to name the new columns with the prefix log2_ followed by the original column name. You can read more about across() and anonymous functions from my posit::conf(2023) workshop\nI recommend viewing the dataframe to see the new columns.\nWe now have dataframe with all the information we need: normalised counts, log2 normalised counts, statistical comparisons with fold changes and p values, and information about the gene other than just the id.",
+ "section": "🎄 Arabidopisis",
+ "text": "🎄 Arabidopisis\nDE instructions\nNow go to Add gene information.",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/workshop.html#write-the-significant-genes-to-file",
- "href": "transcriptomics/week-5/workshop.html#write-the-significant-genes-to-file",
+ "objectID": "transcriptomics/week-4/workshop.html#leishmania-mexicana-2",
+ "href": "transcriptomics/week-4/workshop.html#leishmania-mexicana-2",
"title": "Workshop",
- "section": "Write the significant genes to file",
- "text": "Write the significant genes to file\nWe will create dataframe of the significant genes and write them to file. These are the files you want to examine in more detail along with the visualisations to select your genes of interest.\n🎬 Create a dataframe of the genes significant at the 0.01 level:\n\ns30_results_sig0.01 <- s30_results |> \n filter(padj <= 0.01)\n\n🎬 Write the dataframe to file\n🎬 Create a dataframe of the genes significant at the 0.05 level and write to file:\n❓How many genes are significant at the 0.01 and 0.05 levels?",
+ "section": "💉 Leishmania mexicana",
+ "text": "💉 Leishmania mexicana\nDE instructions\nNow go to Add gene information.",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/workshop.html#view-the-relationship-between-samples-using-pca",
- "href": "transcriptomics/week-5/workshop.html#view-the-relationship-between-samples-using-pca",
+ "objectID": "transcriptomics/week-4/workshop.html#stem-cells-2",
+ "href": "transcriptomics/week-4/workshop.html#stem-cells-2",
"title": "Workshop",
- "section": "View the relationship between samples using PCA",
- "text": "View the relationship between samples using PCA\nWe have 10,136 genes in our dataset. PCA will allow us to plot our samples in the “gene expression” space so we can see if FGF-treated sample cluster together and control samples cluster together as we would expect. We do this on the log2 transformed normalised counts.\nOur data have genes in rows and samples in columns which is a common organisation for gene expression data. However, PCA expects samples in rows and genes, the variables, in columns. We can transpose the data to get it in the correct format.\n🎬 Transpose the log2 transformed normalised counts:\n\ns30_log2_trans <- s30_results |> \n select(starts_with(\"log2_\")) |>\n t() |> \n data.frame()\n\nWe have used the select() function to select all the columns that start with log2_. We then use the t() function to transpose the dataframe. We then convert the resulting matrix to a dataframe using data.frame(). If you view that dataframe you’ll see it has default column name which we can fix using colnames() to set the column names to the Xenbase gene ids.\n🎬 Set the column names to the Xenbase gene ids:\n\ncolnames(s30_log2_trans) <- s30_results$xenbase_gene_id\n\n🎬 Perform PCA on the log2 transformed normalised counts:\n\npca <- s30_log2_trans |>\n prcomp(rank. = 4) \n\nThe rank. argument tells prcomp() to only calculate the first 4 principal components. This is useful for visualisation as we can only plot in 2 or 3 dimensions. We can see the results of the PCA by viewing the summary() of the pca object.\n\nsummary(pca)\n\nImportance of first k=4 (out of 6) components:\n PC1 PC2 PC3 PC4\nStandard deviation 64.0124 47.3351 38.4706 31.4111\nProportion of Variance 0.4243 0.2320 0.1532 0.1022\nCumulative Proportion 0.4243 0.6562 0.8095 0.9116\n\n\nThe Proportion of Variance tells us how much of the variance is explained by each component. We can see that the first component explains 0.4243 of the variance, the second 0.2320, and the third 0.1532. Together the first three components explain nearly 81% of the total variance in the data. Plotting PC1 against PC2 will capture about 66% of the variance which is likely much better than we would get plotting any two genes against each other. To plot the PC1 against PC2 we will need to extract the PC1 and PC2 score from the pca object and add labels for the samples.\n🎬 Remove log2 from the row names:\n\nsample_id <- row.names(s30_log2_trans) |> str_remove(\"log2_\")\n\n🎬 Create a dataframe of the PC1 and PC2 scores which are in pca$x and add the sample ids:\n\npca_labelled <- data.frame(pca$x,\n sample_id)\n\n🎬 Merge with the metadata so we can label points by treatment and sibling pair:\n\npca_labelled <- pca_labelled |> \n left_join(meta_s30, \n by = \"sample_id\")\n\nSince the metadata contained the sample ids, it was especially important to remove the log2_ from the row names so that the join would work. The dataframe should look like this:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nPC1\nPC2\nPC3\nPC4\nsample_id\nstage\ntreatment\nsibling_rep\n\n\n\n-76.38391\n0.814699\n-60.728327\n-5.820669\nS30_C_5\nstage_30\ncontrol\nfive\n\n\n-67.02571\n25.668563\n51.476835\n28.480254\nS30_C_6\nstage_30\ncontrol\nsix\n\n\n-14.02772\n-78.474054\n15.282058\n-9.213076\nS30_C_A\nstage_30\ncontrol\nA\n\n\n47.60726\n49.035510\n-19.288753\n20.928290\nS30_F_5\nstage_30\nFGF\nfive\n\n\n26.04954\n32.914201\n20.206072\n-55.752818\nS30_F_6\nstage_30\nFGF\nsix\n\n\n83.78054\n-29.958919\n-6.947884\n21.378020\nS30_F_A\nstage_30\nFGF\nA\n\n\n\n\n\n🎬 Plot PC1 against PC2 and colour by sibling pair and shape by treatment:\n\npca <- pca_labelled |> \n ggplot(aes(x = PC1, y = PC2, \n colour = sibling_rep,\n shape = treatment)) +\n geom_point(size = 3) +\n scale_colour_viridis_d(end = 0.95, begin = 0.15,\n name = \"Sibling pair\",\n labels = c(\"A\", \".5\", \".6\")) +\n scale_shape_manual(values = c(21, 19),\n name = NULL,\n labels = c(\"Control\", \"FGF-Treated\")) +\n theme_classic()\npca\n\n\n\n\n\n\n\nThere is a good separation between treatments on PCA1. The sibling pairs do not seem to cluster together.\n🎬 Save the plot to file:\n\nggsave(\"figures/frog-s30-pca.png\",\n plot = pca,\n height = 3, \n width = 4,\n units = \"in\",\n device = \"png\")",
+ "section": "🐭 Stem cells",
+ "text": "🐭 Stem cells\nDE instructions\nNow go to Add gene information.",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/workshop.html#visualise-the-expression-of-the-most-significant-genes-using-a-heatmap",
- "href": "transcriptomics/week-5/workshop.html#visualise-the-expression-of-the-most-significant-genes-using-a-heatmap",
+ "objectID": "transcriptomics/week-4/workshop.html#frog-development-3",
+ "href": "transcriptomics/week-4/workshop.html#frog-development-3",
"title": "Workshop",
- "section": "Visualise the expression of the most significant genes using a heatmap",
- "text": "Visualise the expression of the most significant genes using a heatmap\nA heatmap is a common way to visualise gene expression data. Often people will create heatmaps with thousands of genes but it can be more informative to use a subset along with clustering methods. We will use the genes which are significant at the 0.01 level.\nWe are going to create an interactive heatmap with the heatmaply (Galili et al. 2017) package. heatmaply takes a matrix as input so we need to convert a dataframe of the log2 values to a matrix. We will also set the rownames to the Xenbase gene symbols.\n🎬 Convert a dataframe of the log2 values to a matrix:\n\nmat <- s30_results_sig0.01 |> \n select(starts_with(\"log2_\")) |>\n as.matrix()\n\n🎬 Set the rownames to the Xenbase gene symbols:\n\nrownames(mat) <- s30_results_sig0.01$xenbase_gene_symbol\n\nYou might want to view the matrix by clicking on it in the environment pane.\n🎬 Load the heatmaply package:\n\nlibrary(heatmaply)\n\nWe need to tell the clustering algorithm how many clusters to create. We will set the number of clusters for the treatments to be 2 and the number of clusters for the genes to be the same since it makes sense to see what clusters of genes correlate with the treatments.\n🎬 Set the number of clusters for the treatments and genes:\n\nn_treatment_clusters <- 2\nn_gene_clusters <- 2\n\n🎬 Create the heatmap:\n\nheatmaply(mat, \n scale = \"row\",\n k_col = n_treatment_clusters,\n k_row = n_gene_clusters,\n fontsize_row = 7, fontsize_col = 10,\n labCol = str_remove(colnames(mat), pattern = \"log2_\"),\n labRow = rownames(mat),\n heatmap_layers = theme(axis.line = element_blank()))\n\n\n\n\n\nOn the vertical axis are genes which are differentially expressed at the 0.01 level. On the horizontal axis are samples. We can see that the FGF-treated samples cluster together and the control samples cluster together. We can also see two clusters of genes; one of these shows genes upregulated (more yellow) in the FGF-treated samples (the pink cluster) and the other shows genes down regulated (more blue, the blue cluster) in the FGF-treated samples.\nThe heatmap will open in the viewer pane (rather than the plot pane) because it is html. You can “Show in a new window” to see it in a larger format. You can also zoom in and out and pan around the heatmap and download it as a png. You might feel the colour bars is not adding much to the plot. You can remove it by setting hide_colorbar = TRUE, in the heatmaply() function.",
+ "section": "🐸 Frog development",
+ "text": "🐸 Frog development\n\nI got the information from the Xenbase information pages under Data Reports | Gene Information\nThis is listed: Xenbase Gene Product Information [readme] gzipped gpi (tab separated)\nClick on the readme link to see the file format and columns\nI downloaded xenbase.gpi.gz, unzipped it, removed header lines and the Xenopus tropicalis (taxon:8364) entries and saved it as xenbase_info.xlsx\n\nIf you want to emulate what I did you can use the following commands in the terminal after downloading the file:\ngunzip xenbase.gpi.gz\nless xenbase.gpi\nq\ngunzip unzips the file and less allows you to view the file. q quits the viewer. You will see the header lines and that the file contains both Xenopus tropicalis and Xenopus laevis. I read the file in with read_tsv (skipping the first header lines) then filtered out the Xenopus tropicalis entries, dropped some columns and saved the file as an excel file.\nHowever, I have already done this for you and saved the file as xenbase_info.xlsx in the meta folder. We will import this file and join it to the results dataframe.\n🎬 Load the readxl (Wickham and Bryan 2023) package:\n\nlibrary(readxl)\n\n🎬 Import the Xenbase gene information file:\n\ngene_info <- read_excel(\"meta/xenbase_info.xlsx\") \n\nYou should view the resulting dataframe to see what information is available. You can use glimpse() or View().\n🎬 Merge the gene information with the results:\n\n# join the gene info with the results\ns30_results <- s30_results |>\n left_join(gene_info, by = \"xenbase_gene_id\")\n\n🎬 Save the results to a file:\n\nwrite_csv(s30_results, file = \"results/s30_results.csv\")",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/workshop.html#visualise-all-the-results-with-a-volcano-plot",
- "href": "transcriptomics/week-5/workshop.html#visualise-all-the-results-with-a-volcano-plot",
+ "objectID": "transcriptomics/week-4/workshop.html#arabidopisis-3",
+ "href": "transcriptomics/week-4/workshop.html#arabidopisis-3",
"title": "Workshop",
- "section": "Visualise all the results with a volcano plot",
- "text": "Visualise all the results with a volcano plot\ncolour the points if padj < 0.05 and log2FoldChange > 1\n\nlibrary(ggrepel)\n\n\ns30_results <- s30_results |> \n mutate(log10_padj = -log10(padj),\n sig = padj < 0.05,\n bigfc = abs(log2FoldChange) >= 2) \n\n\nvol <- s30_results |> \n ggplot(aes(x = log2FoldChange, \n y = log10_padj, \n colour = interaction(sig, bigfc))) +\n geom_point() +\n geom_hline(yintercept = -log10(0.05), \n linetype = \"dashed\") +\n geom_vline(xintercept = 2, \n linetype = \"dashed\") +\n geom_vline(xintercept = -2, \n linetype = \"dashed\") +\n scale_x_continuous(expand = c(0, 0)) +\n scale_y_continuous(expand = c(0, 0)) +\n scale_colour_manual(values = c(\"gray\", \n \"pink\",\n \"gray30\",\n \"deeppink\")) +\n geom_text_repel(data = subset(s30_results, \n bigfc & sig),\n aes(label = xenbase_gene_symbol),\n size = 3,\n max.overlaps = 50) +\n theme_classic() +\n theme(legend.position = \"none\")\nvol\n\nError in `geom_text_repel()`:\n! Problem while computing aesthetics.\nℹ Error occurred in the 5th layer.\nCaused by error:\n! object 'xenbase_gene_symbol' not found\n\n\n\nggsave(\"figures/frog-s30-volcano.png\",\n plot = vol,\n height = 4.5, \n width = 4.5,\n units = \"in\",\n device = \"png\")\n\nError in `geom_text_repel()`:\n! Problem while computing aesthetics.\nℹ Error occurred in the 5th layer.\nCaused by error:\n! object 'xenbase_gene_symbol' not found",
+ "section": "🎄 Arabidopisis",
+ "text": "🎄 Arabidopisis",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/workshop.html#import-1",
- "href": "transcriptomics/week-5/workshop.html#import-1",
+ "objectID": "transcriptomics/week-4/workshop.html#leishmania-mexicana-3",
+ "href": "transcriptomics/week-4/workshop.html#leishmania-mexicana-3",
"title": "Workshop",
- "section": "Import",
- "text": "Import\nWe need to import both the normalised counts and the statistical results. We will need all of these for the visualisation and interpretation.\n🎬 Import the normalised counts for the Prog and HSPC cell types. I used the names prog and hspc for the dataframes.\n🎬 Combine the two dataframes (minus one set of gene ids) into one dataframe called prog_hspc:\n\n# combine into one dataframe dropping one of the gene id columns\nprog_hspc <- bind_cols(prog, hspc[-1])\n\n🎬 Import the statistical results in results/prog_hspc_results.csv. I used the name prog_hspc_results for the dataframe.\n🎬 Remind yourself what is in the rows and columns and the structure of the dataframe (perhaps using glimpse())\n\n\n\n\n\n\nIt is useful to have this information in a single dataframe to which we will add the gene information from Ensembl Having all the information together will make it easier to interpret the results and select genes of interest.\n🎬 Merge the two dataframes:\n\n# merge stats results with normalise values\nprog_hspc_results <- prog_hspc_results |> \n left_join(prog_hspc, by = \"ensembl_gene_id\")\n\nThis means you have the counts for each sample along with the statistical results for each gene.",
+ "section": "💉 Leishmania mexicana",
+ "text": "💉 Leishmania mexicana",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/workshop.html#write-the-significant-genes-to-file-1",
- "href": "transcriptomics/week-5/workshop.html#write-the-significant-genes-to-file-1",
+ "objectID": "transcriptomics/week-4/workshop.html#stem-cells-3",
+ "href": "transcriptomics/week-4/workshop.html#stem-cells-3",
"title": "Workshop",
- "section": "Write the significant genes to file",
- "text": "Write the significant genes to file\nWe will create dateframe of the signifcant genes and write them to file. These are the files you want to examine in more detail along with the visualisations to select your genes of interest.\n🎬 Create a dataframe of the genes significant at the 0.01 level:\n\nprog_hspc_results_sig0.01 <- prog_hspc_results |> \n filter(FDR <= 0.01)\n\n🎬 Write the dataframe to file\n🎬 Create a dataframe of the genes significant at the 0.05 level and write to file:\n❓How many genes are significant at the 0.01 and 0.05 levels?",
+ "section": "🐭 Stem cells",
+ "text": "🐭 Stem cells",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/workshop.html#view-the-relationship-between-cells-using-pca",
- "href": "transcriptomics/week-5/workshop.html#view-the-relationship-between-cells-using-pca",
+ "objectID": "transcriptomics/week-4/workshop.html#footnotes",
+ "href": "transcriptomics/week-4/workshop.html#footnotes",
"title": "Workshop",
- "section": "View the relationship between cells using PCA",
- "text": "View the relationship between cells using PCA\nWe have 280 genes in our dataset. PCA will allow us to plot our cells in the “gene expression” space so we can see if Prog cells cluster together and HSPC cells cluster together as we would expect. We do this on the log2 transformed normalised counts.\nOur data have genes in rows and samples in columns which is a common organisation for gene expression data. However, PCA expects cells in rows and genes, the variables, in columns. We can transpose the data to get it in the correct format.\n🎬 Transpose the log2 transformed normalised counts:\n\nprog_hspc_trans <- prog_hspc_results |> \n dplyr::select(starts_with(c(\"Prog_\", \"HSPC_\"))) |>\n t() |> \n data.frame()\n\nWe have used the select() function to select all the columns that start with Prog_ or HSPC_. We then use the t() function to transpose the dataframe. We then convert the resulting matrix to a dataframe using data.frame(). If you view that dataframe you’ll see it has default column name which we can fix using colnames() to set the column names to the gene ids.\n🎬 Set the column names to the gene ids:\n\ncolnames(prog_hspc_trans) <- prog_hspc_results$ensembl_gene_id\n\nperform PCA using standard functions\n\npca <- prog_hspc_trans |>\n prcomp(rank. = 15) \n\nThe rank. argument tells prcomp() to only calculate the first 15 principal components. This is useful for visualisation as we can only plot in 2 or 3 dimensions. We can see the results of the PCA by viewing the summary() of the pca object.\n\nsummary(pca)\n\nImportance of first k=15 (out of 280) components:\n PC1 PC2 PC3 PC4 PC5 PC6 PC7\nStandard deviation 12.5612 8.36646 5.98988 5.41386 4.55730 4.06142 3.84444\nProportion of Variance 0.1099 0.04874 0.02498 0.02041 0.01446 0.01149 0.01029\nCumulative Proportion 0.1099 0.15861 0.18359 0.20400 0.21846 0.22995 0.24024\n PC8 PC9 PC10 PC11 PC12 PC13 PC14\nStandard deviation 3.70848 3.66899 3.5549 3.48508 3.44964 3.42393 3.37882\nProportion of Variance 0.00958 0.00937 0.0088 0.00846 0.00829 0.00816 0.00795\nCumulative Proportion 0.24982 0.25919 0.2680 0.27645 0.28473 0.29290 0.30085\n PC15\nStandard deviation 3.33622\nProportion of Variance 0.00775\nCumulative Proportion 0.30860\n\n\nThe Proportion of Variance tells us how much of the variance is explained by each component. We can see that the first component explains 0.1099 of the variance, the second 0.04874, and the third 0.2498. Together the first three components explain 18% of the total variance in the data. Plotting PC1 against PC2 will capture about 16% of the variance. This is not that high but it likely better than we would get plotting any two genes against each other. To plot the PC1 against PC2 we will need to extract the PC1 and PC2 score from the pca object and add labels for the cells.\n🎬 Create a dataframe of the PC1 and PC2 scores which are in pca$x and add the cell ids:\n\npca_labelled <- data.frame(pca$x,\n cell_id = row.names(prog_hspc_trans))\n\nIt will be helpful to add a column for the cell type so we can label points. One way to do this is to extract the information in the cell_id column into two columns.\n🎬 Extract the cell type and cell number from the cell_id column (keeping the cell_id column):\n\npca_labelled <- pca_labelled |> \n extract(cell_id, \n remove = FALSE,\n c(\"cell_type\", \"cell_number\"),\n \"([a-zA-Z]{4})_([0-9]{3})\")\n\n\"([a-zA-Z]{4})_([0-9]{3})\" is a regular expression - or regex. [a-zA-Z] means any lower or upper case letter, {4} means 4 of them, and [0-9] means any number, {3} means 3 of them. The brackets around the two parts of the regex mean we want to extract those parts. The first part goes into cell_type and the second part goes into cell_number. The _ between the two patterns matches the underscore and the fact it isn’t in a bracket means we don’t want to keep it.\nWe can now plot the PC1 and PC2 scores.\n🎬 Plot PC1 against PC2 and colour the points by cell type:\n\npca <- pca_labelled |> \n ggplot(aes(x = PC1, y = PC2, \n colour = cell_type)) +\n geom_point(alpha = 0.4) +\n scale_colour_viridis_d(end = 0.8, begin = 0.15,\n name = \"Cell type\") +\n theme_classic()\npca\n\n\n\n\n\n\n\nFairly good separation of cell types but plenty of overlap\n🎬 Save the plot to file:\n\nggsave(\"figures/prog_hspc-pca.png\",\n plot = pca,\n height = 3, \n width = 4,\n units = \"in\",\n device = \"png\")",
+ "section": "Footnotes",
+ "text": "Footnotes\n\nBioconductor is a project that develops and supports R packages for bioinformatics.↩︎",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
+ "Week 4: Statistical Analysis",
"Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/workshop.html#visualise-the-expression-of-the-most-significant-genes-using-a-heatmap-1",
- "href": "transcriptomics/week-5/workshop.html#visualise-the-expression-of-the-most-significant-genes-using-a-heatmap-1",
- "title": "Workshop",
- "section": "Visualise the expression of the most significant genes using a heatmap",
- "text": "Visualise the expression of the most significant genes using a heatmap\nA heatmap is a common way to visualise gene expression data. Often people will create heatmaps with thousands of genes but it can be more informative to use a subset along with clustering methods. We will use the genes which are significant at the 0.01 level.\nWe are going to create an interactive heatmap with the heatmaply (Galili et al. 2017) package. heatmaply takes a matrix as input so we need to convert a dataframe of the log2 values to a matrix. We will also set the rownames to the gene names.\n🎬 Convert a dataframe of the log2 values to a matrix. I have used sample() to select 70 random columns so the heatmap is generated quickly:\n\nmat <- prog_hspc_results_sig0.01 |> \n dplyr::select(starts_with(c(\"Prog\", \"HSPC\"))) |>\n dplyr::select(sample(1:1499, size = 70)) |>\n as.matrix()\n\n🎬 Set the row names to the gene names:\n\nrownames(mat) <- prog_hspc_results_sig0.01$external_gene_name\n\nYou might want to view the matrix by clicking on it in the environment pane.\n🎬 Load the heatmaply package:\n\nlibrary(heatmaply)\n\nWe need to tell the clustering algorithm how many clusters to create. We will set the number of clusters for the cell types to be 2 and the number of clusters for the genes to be the same since it makes sense to see what clusters of genes correlate with the cell types.\n\nn_cell_clusters <- 2\nn_gene_clusters <- 2\n\n🎬 Create the heatmap:\n\nheatmaply(mat, \n scale = \"row\",\n k_col = n_cell_clusters,\n k_row = n_gene_clusters,\n fontsize_row = 7, fontsize_col = 10,\n labCol = colnames(mat),\n labRow = rownames(mat),\n heatmap_layers = theme(axis.line = element_blank()))\n\n\n\n\n\nIt will take a minute to run and display. On the vertical axis are genes which are differentially expressed at the 0.01 level. On the horizontal axis are cells. We can see that cells of the same type don’t cluster that well together. We can also see two clusters of genes but the pattern of gene is not as clear as it was for the frogs and the correspondence with the cell clusters is not as strong.\nThe heatmap will open in the viewer pane (rather than the plot pane) because it is html. You can “Show in a new window” to see it in a larger format. You can also zoom in and out and pan around the heatmap and download it as a png. You might feel the colour bars is not adding much to the plot. You can remove it by setting hide_colorbar = TRUE, in the heatmaply() function.\nUsing all the cells is worth doing but it will take a while to generate the heatmap and then show in the viewer so do it sometime when you’re ready for a coffee break.",
+ "objectID": "transcriptomics/week-4/study_after_workshop.html",
+ "href": "transcriptomics/week-4/study_after_workshop.html",
+ "title": "Independent Study to consolidate this week",
+ "section": "",
+ "text": "You need only do the section for your own project data\n🐸 Frog development\n🎬 Open your frogs-88H RStudio Project and the script you began in the Consolidation study last week. This will be cont-fgf-s20.R or cont-fgf-s14.R depending on which stage you moved to. Use the differential expression analysis you did in the workshop (in cont-fgf-s30.R) as a template to continue your script.\n🎄 Arabidopisis\n💉 Leishmania\n🐭 Stem cells\n🎬 Open your mice-88H RStudio Project. Make a new script and, using hspc-prog.R as a template, repeat the analysis on a different comparisons. You new script be called hspc-lthsc.R or lthsc-prog-3.R depending on which comparison you choose.",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Workshop"
+ "Week 4: Statistical Analysis",
+ "Consolidate!"
]
},
{
- "objectID": "transcriptomics/week-5/workshop.html#visualise-all-the-results-with-a-volcano-plot-1",
- "href": "transcriptomics/week-5/workshop.html#visualise-all-the-results-with-a-volcano-plot-1",
+ "objectID": "transcriptomics/week-3/workshop.html",
+ "href": "transcriptomics/week-3/workshop.html",
"title": "Workshop",
- "section": "Visualise all the results with a volcano plot",
- "text": "Visualise all the results with a volcano plot\ncolour the points if FDR < 0.05 and prog_hspc_results > 1\n\nlibrary(ggrepel)\n\n\nprog_hspc_results <- prog_hspc_results |> \n mutate(log10_FDR = -log10(FDR),\n sig = FDR < 0.05,\n bigfc = abs(summary.logFC) >= 2) \n\n\nvol <- prog_hspc_results |> \n ggplot(aes(x = summary.logFC, \n y = log10_FDR, \n colour = interaction(sig, bigfc))) +\n geom_point() +\n geom_hline(yintercept = -log10(0.05), \n linetype = \"dashed\") +\n geom_vline(xintercept = 2, \n linetype = \"dashed\") +\n geom_vline(xintercept = -2, \n linetype = \"dashed\") +\n scale_x_continuous(expand = c(0, 0)) +\n scale_y_continuous(expand = c(0, 0)) +\n scale_colour_manual(values = c(\"gray\",\n \"pink\",\n \"deeppink\")) +\n geom_text_repel(data = subset(prog_hspc_results, \n bigfc & sig),\n aes(label = external_gene_name),\n size = 3,\n max.overlaps = 50) +\n theme_classic() +\n theme(legend.position = \"none\")\nvol\n\nError in `geom_text_repel()`:\n! Problem while computing aesthetics.\nℹ Error occurred in the 5th layer.\nCaused by error:\n! object 'external_gene_name' not found\n\n\n\nggsave(\"figures/prog-hspc-volcano.png\",\n plot = vol,\n height = 4.5, \n width = 4.5,\n units = \"in\",\n device = \"png\")\n\nError in `geom_text_repel()`:\n! Problem while computing aesthetics.\nℹ Error occurred in the 5th layer.\nCaused by error:\n! object 'external_gene_name' not found",
+ "section": "",
+ "text": "In this workshop you will learn what steps to take to get a good understanding of your transcriptomics data before you consider any statistical analysis. This is an often overlooked, but very valuable and informative, part of any data pipeline. It gives you the deep understanding of the data structures and values that you will need to code and trouble-shoot code, allows you to spot failed or problematic samples and informs your decisions on quality control.\nIn this session, you should examine all four data sets because the comparisons will give you a much stronger understanding of your own project data. Compare and contrast is a very useful way to build understanding.",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
+ "Week 3: Hello data!",
"Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#overview",
- "href": "transcriptomics/week-5/study_before_workshop.html#overview",
- "title": "Independent Study to prepare for workshop",
- "section": "Overview",
- "text": "Overview\nIn these slides we will:\n\n\nCheck where you are\n\nlearn some concepts used omics visualisation\n\nPrinciple Component Analysis (PCA)\nVolcano plots\nHeatmaps\n\n\nFind out what packages to install before the workshop",
+ "objectID": "transcriptomics/week-3/workshop.html#session-overview",
+ "href": "transcriptomics/week-3/workshop.html#session-overview",
+ "title": "Workshop",
+ "section": "",
+ "text": "In this workshop you will learn what steps to take to get a good understanding of your transcriptomics data before you consider any statistical analysis. This is an often overlooked, but very valuable and informative, part of any data pipeline. It gives you the deep understanding of the data structures and values that you will need to code and trouble-shoot code, allows you to spot failed or problematic samples and informs your decisions on quality control.\nIn this session, you should examine all four data sets because the comparisons will give you a much stronger understanding of your own project data. Compare and contrast is a very useful way to build understanding.",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#what-we-did-in-transcriptomics-2-statistical-analysis",
- "href": "transcriptomics/week-5/study_before_workshop.html#what-we-did-in-transcriptomics-2-statistical-analysis",
- "title": "Independent Study to prepare for workshop",
- "section": "What we did in Transcriptomics 2: Statistical Analysis",
- "text": "What we did in Transcriptomics 2: Statistical Analysis\n\n\ncarried out differential expression analysis\nfound genes not expressed at all, or expressed in one group only\nSaved results files",
+ "objectID": "transcriptomics/week-3/workshop.html#frog-development",
+ "href": "transcriptomics/week-3/workshop.html#frog-development",
+ "title": "Workshop",
+ "section": "🐸 Frog development",
+ "text": "🐸 Frog development\nImport\nImport the data for stage 30.\n🎬 Import xlaevis_counts_S30.csv\n\n# 🐸 import the s30 data\ns30 <- read_csv(\"data-raw/xlaevis_counts_S30.csv\")\n\n🎬 Check the dataframe has the number of rows and columns you were expecting and that column types and names are as expected.\nDistribution of values across all the data in the file\nThe values are spread over multiple columns so in order to plot the distribution as a whole, we will need to first use pivot_longer() to put the data in ‘tidy’ format (Wickham 2014) by stacking the columns. We could save a copy of the stacked data and then plot it, but here, I have just piped the stacked data straight into ggplot(). This helps me avoid cluttering my R environment with temporary objects.\n🎬 Pivot the counts (stack the columns) so all the counts are in a single column (count) labelled in sample by the column it came from and pipe into ggplot() to create a histogram:\n\ns30 |>\n pivot_longer(cols = -xenbase_gene_id,\n names_to = \"sample\",\n values_to = \"count\") |>\n ggplot(aes(x = count)) +\n geom_histogram()\n\n\n\n\n\n\n\nThis data is very skewed - there are very many low counts and a very few higher numbers. It is hard to see the very low bars for the higher values. Logging the counts is a way to make the distribution more visible. You cannot take the log of 0 so we add 1 to the count before logging. The log of 1 is zero so we will be able to see how many zeros we had.\n🎬 Repeat the plot of log of the counts.\n\ns30 |>\n pivot_longer(cols = -xenbase_gene_id,\n names_to = \"sample\",\n values_to = \"count\") |>\n ggplot(aes(x = log10(count + 1))) +\n geom_histogram()\n\n\n\n\n\n\n\nI’ve used base 10 only because it easy to convert to the original scale (1 is 10, 2 is 100, 3 is 1000 etc). Notice we have a peak at zero indicating there are many zeros. We would expect the distribution of counts to be roughly log normal because this is expression of all the genes in the genome1. The number of low counts is inflated (small peak near the low end). This suggests that these lower counts might be false positives. The removal of low counts is a common processing step in ’omic data. We will revisit this after we have considered the distribution of counts across samples and genes.\nDistribution of values across the samples\nSummary statistics including the the number of NAs can be seen using the summary(). It is most helpful which you have up to about 25 columns. There is nothing special about the number 25, it is just that summaries of a larger number of columns are difficult to grasp.\n🎬 Get a quick overview of the 7 columns:\n\n# examine all the columns quickly\n# works well with smaller numbers of column\nsummary(s30)\n\n xenbase_gene_id S30_C_1 S30_C_2 S30_C_3 \n Length:11893 Min. : 0.0 Min. : 0.0 Min. : 0.0 \n Class :character 1st Qu.: 14.0 1st Qu.: 14.0 1st Qu.: 23.0 \n Mode :character Median : 70.0 Median : 75.0 Median : 107.0 \n Mean : 317.1 Mean : 335.8 Mean : 426.3 \n 3rd Qu.: 205.0 3rd Qu.: 220.0 3rd Qu.: 301.0 \n Max. :101746.0 Max. :118708.0 Max. :117945.0 \n S30_F_1 S30_F_2 S30_F_3 \n Min. : 0.0 Min. : 0.0 Min. : 0.0 \n 1st Qu.: 19.0 1st Qu.: 17.0 1st Qu.: 16.0 \n Median : 88.0 Median : 84.0 Median : 69.0 \n Mean : 376.2 Mean : 376.5 Mean : 260.4 \n 3rd Qu.: 251.0 3rd Qu.: 246.0 3rd Qu.: 187.0 \n Max. :117573.0 Max. :130672.0 Max. :61531.0 \n\n\nNotice that:\n\nthe minimum count is 0 and the maximums are very high in all the columns\nthe medians are quite a lot lower than the means so the data are skewed (hump to the left, tail to the right) and there must be quite a lot of zeros\n\nS30_F_3 does have a somewhat lower maximum count\n\nWe want to know how many zeros there are in each a column. A useful trick to determine this is to make use we can make use of the fact that TRUE evaluates to 1 and FALSE evaluates to 0. This means you can sum a column of TRUE/FALSE values to get the number of TRUE values. For example, sum(S30_C_1 > 0) gives the number of values above zero in the S30_C_1 column. If you wanted the number of zeros, you would use sum(S30_C_1 == 0).\n🎬 Find the number values above zero in all six columns:\n\ns30 |>\n summarise(sum(S30_C_1 > 0),\n sum(S30_C_2 > 0),\n sum(S30_C_3 > 0),\n sum(S30_F_1 > 0),\n sum(S30_F_2 > 0),\n sum(S30_F_3 > 0))\n\n# A tibble: 1 × 6\n `sum(S30_C_1 > 0)` `sum(S30_C_2 > 0)` `sum(S30_C_3 > 0)` `sum(S30_F_1 > 0)`\n <int> <int> <int> <int>\n1 10553 10532 10895 10683\n# ℹ 2 more variables: `sum(S30_F_2 > 0)` <int>, `sum(S30_F_3 > 0)` <int>\n\n\nThere is a better way of doing this that saves you having to repeat so much code - very useful if you have a lot more than 6 columns! We can use pivot_longer() to put the data in tidy format and then use the group_by() and summarise() approach we have used extensively before.\n🎬 Find the number of zeros in all columns:\n\ns30 |>\n pivot_longer(cols = -xenbase_gene_id,\n names_to = \"sample\",\n values_to = \"count\") |>\n group_by(sample) |>\n summarise(n_above_zero = sum(count > 0))\n\n# A tibble: 6 × 2\n sample n_above_zero\n <chr> <int>\n1 S30_C_1 10553\n2 S30_C_2 10532\n3 S30_C_3 10895\n4 S30_F_1 10683\n5 S30_F_2 10694\n6 S30_F_3 10930\n\n\nYou could expand this code to get get other useful summary information\n🎬 Summarise all the samples:\n\ns30 |>\n pivot_longer(cols = -xenbase_gene_id,\n names_to = \"sample\",\n values_to = \"count\") |>\n group_by(sample) |>\n summarise(min = min(count),\n lowerq = quantile(count, 0.25),\n mean = mean(count),\n median = median(count),\n upperq = quantile(count, 0.75),\n max = max(count),\n n_above_zero = sum(count > 0))\n\n# A tibble: 6 × 8\n sample min lowerq mean median upperq max n_above_zero\n <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int>\n1 S30_C_1 0 14 317. 70 205 101746 10553\n2 S30_C_2 0 14 336. 75 220 118708 10532\n3 S30_C_3 0 23 426. 107 301 117945 10895\n4 S30_F_1 0 19 376. 88 251 117573 10683\n5 S30_F_2 0 17 376. 84 246 130672 10694\n6 S30_F_3 0 16 260. 69 187 61531 10930\n\n\nThe mean count ranges from 260 to 426. S30_F_3 does stand out a little but not by too much. If we had more replicates we might consider analysing with and with out this replicate. Since we have just 3, we will leave it in. The potential effect of an odd replicate is slightly statistical power. The major differences in gene expression will still be uncovered. Differences between genes with lower average expression and or more variable expression might be missed. Whether this matters depends on the biological question you are asking. In this case, it does not matter because the major differences in gene expression will be enough.\n🎬 Save the summary as a dataframe, s30_summary_samp (using assignment).\nWe can also plot the distribution of counts across samples. We have many values (11893) so we are not limited to using geom_histogram(). geom_density() gives us a smooth distribution.\n🎬 Plot the log10 of the counts + 1 again but this time facet by the sample:\n\ns30 |>\n pivot_longer(cols = -xenbase_gene_id,\n names_to = \"sample\",\n values_to = \"count\") |>\n ggplot(aes(log10(count + 1))) +\n geom_density() +\n facet_wrap(. ~ sample, nrow = 3)\n\n\n\n\n\n\n\nThe key information to take from these plots is:\n\nthe distributions are roughly similar with S30_F_3 does stand out a little\nthe peak at zero suggests quite a few counts of 1.\nsince we would expect the distribution of counts in each sample to be roughly log normal so that the small rise near the low end, even before the peak at zero, suggests that these lower counts might be anomalies.\n\nWe have found the distribution across samples to be like that to the distribution over all. This is good because it means that the samples are fairly consistent with each other. We can now move on to the next step.\nDistribution of values across the genes\nThere are lots of genes in this dataset therefore we will take a slightly different approach. We would not want to use plot a distribution for each gene in the same way. Will pivot the data to tidy and then summarise the counts for each gene.\n🎬 Summarise the counts for each gene and save the result as s30_summary_gene. Include the same columns as we had in the by sample summary (s30_summary_samp) and an additional column, total for the total number of counts for each gene.\n🎬 View the s30_summary_gene dataframe.\nNotice that we have:\n\na lot of genes with counts of zero in every sample\na lot of genes with zero counts in several of the samples\nsome very very low counts.\n\nGenes with very low counts should be filtered out because they are unreliable - or, at the least, uninformative. The goal of our downstream analysis will be to see if there is a significant difference in gene expression between the control and FGF-treated sibling. Since we have only three replicates in each group, having one or two unreliable, missing or zero values, makes such a determination impossible for a particular gene. We will use the total counts (total) and the number of samples with non-zero values (n_above_zero) in this dataframe to filter our genes later.\nAs we have a lot of genes, it is again helpful to plot the mean counts with geom_pointrange() to get an overview of the distributions. We will again plot the log of the mean counts. We will also order the genes from lowest to highest mean count.\n🎬 Plot the logged mean counts for each gene in order of size using geom_pointrange():\n\ns30_summary_gene |> \n ggplot(aes(x = reorder(xenbase_gene_id, mean), y = log10(mean))) +\n geom_pointrange(aes(ymin = log10(mean - sd), \n ymax = log10(mean + sd )),\n size = 0.1)\n\n\n\n\n\n\n\n(Note the warning is expected since we have zero means).\nYou can see we also have quite a few genes with means less than 1 (log below zero). Note that the variability between genes (average counts between 0 and 102586) is far greater than between samples (average counts from 260 to 426) which is exactly what we would expect to see.",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#where-should-you-be-1",
- "href": "transcriptomics/week-5/study_before_workshop.html#where-should-you-be-1",
- "title": "Independent Study to prepare for workshop",
- "section": "Where should you be?",
- "text": "Where should you be?\nAfter the Transcriptomics 2: 👋 Statistical Analysis Workshop including:\n\n🤗 Look after future you! and\nthe Independent Study to consolidate, you should have:",
+ "objectID": "transcriptomics/week-3/workshop.html#stem-cells",
+ "href": "transcriptomics/week-3/workshop.html#stem-cells",
+ "title": "Workshop",
+ "section": "🐭 Stem cells",
+ "text": "🐭 Stem cells\nDistribution of values across all the data in the file\nDistribution of values across the samples\nDistribution of values across the genes",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#frogs",
- "href": "transcriptomics/week-5/study_before_workshop.html#frogs",
- "title": "Independent Study to prepare for workshop",
- "section": "🐸 Frogs",
- "text": "🐸 Frogs\n\n\nAn RStudio Project called frogs-88H which contains:\n\nRaw data (S14, S20 and S30)\nProcessed data (s30_filtered.csv, s30_summary_gene.csv, s30_summary_gene_filtered.csv, s30_summary_samp.csv and equivalents for S14 OR S20)\nResults files (s30_fgf_only.csv, S30_normalised_counts.csv, S30_results.csv and equivalents for S14 OR S20)\n\nTwo scripts called cont-fgf-s30.R and either cont-fgf-s20.R OR cont-fgf-s14.R\n\n\n\n\n\nFiles should be organised into folders. Code should well commented and easy to read.",
+ "objectID": "transcriptomics/week-3/workshop.html#arabidopsis",
+ "href": "transcriptomics/week-3/workshop.html#arabidopsis",
+ "title": "Workshop",
+ "section": "🎄 Arabidopsis",
+ "text": "🎄 Arabidopsis\nDistribution of values across all the data in the file\nDistribution of values across the samples\nDistribution of values across the genes",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#mice",
- "href": "transcriptomics/week-5/study_before_workshop.html#mice",
- "title": "Independent Study to prepare for workshop",
- "section": "🐭 Mice",
- "text": "🐭 Mice\n\n\nAn RStudio Project called mice-88H which contains\n\nRaw data (hspc, prog, lthsc)\nProcessed data (hspc_summary_gene.csv, hspc_summary_samp.csv, prog_summary_gene.csv, prog_summary_samp.csv, lthsc_summary_gene.csv, lthsc_summary_samp.csv)\n\n\nResults files (prog_hspc_results.csv and an equivalent for lthsc vs prog or hspc vs lthsc)\nTwo scripts called hspc-prog.R and either hspc-lthsc.R OR prog-lthsc.R\n\n\n\nFiles should be organised into folders. Code should well commented and easy to read.",
+ "objectID": "transcriptomics/week-3/workshop.html#leishmania",
+ "href": "transcriptomics/week-3/workshop.html#leishmania",
+ "title": "Workshop",
+ "section": "💉 Leishmania",
+ "text": "💉 Leishmania\nDistribution of values across all the data in the file\nDistribution of values across the samples\nDistribution of values across the genes",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#section",
- "href": "transcriptomics/week-5/study_before_workshop.html#section",
- "title": "Independent Study to prepare for workshop",
- "section": "🍂",
- "text": "🍂\nEither of the other examples.",
+ "objectID": "transcriptomics/week-3/workshop.html#frog-development-1",
+ "href": "transcriptomics/week-3/workshop.html#frog-development-1",
+ "title": "Workshop",
+ "section": "🐸 Frog development",
+ "text": "🐸 Frog development\nOur samples look to be similarly well sequenced. There are no samples we should remove. However, some genes are not expressed or the expression values are so low in for a gene that they are uninformative. We will filter the s30_summary_gene dataframe to obtain a list of xenbase_gene_id we can use to filter s30.\nMy suggestion is to include only the genes with counts in at least 3 samples. and those with total counts above 20. I chose 3 because that would keep genes expressed only in one sample: [0, 0, 0] [#,#,#]. This is a difference we cannot test statistically, but which matters biologically.\n🎬 Filter the summary by gene dataframe:\n\ns30_summary_gene_filtered <- s30_summary_gene |> \n filter(total > 20) |> \n filter(n_above_zero >= 3)\n\n❓ How many genes do you have left\n\n\n\n🎬 Use the list of xenbase_gene_id in the filtered summary to filter the original dataset:\n\ns30_filtered <- s30 |> \n filter(xenbase_gene_id %in% s30_summary_gene_filtered$xenbase_gene_id)\n\n🎬 Write the filtered original to file:\n\nwrite_csv(s30_filtered, \n file = \"data-processed/s30_filtered.csv\")",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#if-you-do-not-have-those",
- "href": "transcriptomics/week-5/study_before_workshop.html#if-you-do-not-have-those",
- "title": "Independent Study to prepare for workshop",
- "section": "If you do not have those",
- "text": "If you do not have those\nGo through:\n\nTranscriptomics 2: Statistical Analysis including:\n🤗 Look after future you! and\nthe Independent Study to consolidate",
+ "objectID": "transcriptomics/week-3/workshop.html#stem-cells-1",
+ "href": "transcriptomics/week-3/workshop.html#stem-cells-1",
+ "title": "Workshop",
+ "section": "🐭 Stem cells",
+ "text": "🐭 Stem cells\nWe will take a different approach to filtering the single cell data. For the Frog samples we are examining the control and the FGF treated samples. This means have a low number of counts overall means the gene is not really expressed (detected) in any condition, and filtering out those genes is removing things that definitely are not interesting. For the mice, we have examined only one cell type but will be making comparisons between cells types. It may be that low expression of a gene in this cell type tells us something if that gene is highly expressed in another cell type. Instead, we will make statistical comparisons between the cell types and then filter based on overall expression, the difference in expression between cell types and whether that difference is significant.\nThe number of “replicates” is also important. When you have only three in each group it is not possible to make statistical comparisons when several replicates are zero. This is less of an issue with single cell data.",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#examine-the-results-files-1",
- "href": "transcriptomics/week-5/study_before_workshop.html#examine-the-results-files-1",
- "title": "Independent Study to prepare for workshop",
- "section": "Examine the results files",
- "text": "Examine the results files\nRemind yourself of the key columns you have in the results files:\n\na log2 fold change\nan unadjusted p-value\na p value adjusted for multiple testing (FDR or padj)\na gene id",
+ "objectID": "transcriptomics/week-3/workshop.html#arabidopsis-1",
+ "href": "transcriptomics/week-3/workshop.html#arabidopsis-1",
+ "title": "Workshop",
+ "section": "🎄 Arabidopsis",
+ "text": "🎄 Arabidopsis",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#frogs-1",
- "href": "transcriptomics/week-5/study_before_workshop.html#frogs-1",
- "title": "Independent Study to prepare for workshop",
- "section": "🐸 Frogs",
- "text": "🐸 Frogs\n\n\nRows: 10,136\nColumns: 7\n$ baseMean <dbl> 237.553928, 531.565700, 86.392830, 49.813502, 419.9983…\n$ log2FoldChange <dbl> 0.096601855, -0.089588528, -0.192811203, -0.008858703,…\n$ lfcSE <dbl> 0.2079396, 0.1557384, 0.3253216, 0.4342614, 0.1685420,…\n$ stat <dbl> 0.46456683, -0.57525007, -0.59267874, -0.02039947, -0.…\n$ pvalue <dbl> 0.64224169, 0.56512218, 0.55339617, 0.98372471, 0.8699…\n$ padj <dbl> 0.9998970, 0.9998970, 0.9998970, 0.9998970, 0.9998970,…\n$ xenbase_gene_id <chr> \"XB-GENE-1000007\", \"XB-GENE-1000023\", \"XB-GENE-1000062…\n\n\n\n\n\nbaseMean is the mean of the normalised counts for the gene across all samples\n\nlfcSE standard error of the fold change\n\nstat is the test statistic (the Wald statistic)\nGenerated by DESeq2 (Love, Huber, and Anders 2014)",
+ "objectID": "transcriptomics/week-3/workshop.html#leishmania-1",
+ "href": "transcriptomics/week-3/workshop.html#leishmania-1",
+ "title": "Workshop",
+ "section": "💉 Leishmania",
+ "text": "💉 Leishmania",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#mice-1",
- "href": "transcriptomics/week-5/study_before_workshop.html#mice-1",
- "title": "Independent Study to prepare for workshop",
- "section": "🐭 Mice",
- "text": "🐭 Mice\n\n\nRows: 280\nColumns: 6\n$ Top <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,…\n$ p.value <dbl> 7.038138e-117, 4.736622e-90, 1.832630e-88, 4.211954e-7…\n$ FDR <dbl> 1.970679e-114, 6.631271e-88, 1.710455e-86, 2.948368e-7…\n$ summary.logFC <dbl> 1.596910, 3.035165, 3.261056, -2.146491, -3.056730, 3.…\n$ logFC.hspc <dbl> 1.596910, 3.035165, 3.261056, -2.146491, -3.056730, 3.…\n$ ensembl_gene_id <chr> \"ENSMUSG00000028639\", \"ENSMUSG00000024053\", \"ENSMUSG00…\n\n\n\n\nTop is the rank of the gene ordered by the p-value (smallest first)\n\nsummary.logFC and logFC.hspc give the same value (in this case since comparing two cell types)\ngenerated by scran (Lun, McCarthy, and Marioni 2016)",
+ "objectID": "transcriptomics/week-3/workshop.html#frogs-and-future-you",
+ "href": "transcriptomics/week-3/workshop.html#frogs-and-future-you",
+ "title": "Workshop",
+ "section": "🐸 Frogs and future you",
+ "text": "🐸 Frogs and future you\n🎬 Create a new Project, frogs-88H, populated with folders and your data. Make a script file called cont-fgf-s30.R. This will a be commented analysis of the control vs FGF at S30 comparison. You will build on this each workshop and be able to use it as a template to examine other comparisons. Copy in the appropriate code and comments from workshop-1.R. Edit to improve your comments where your understanding has developed since you made them. Make sure you can close down RStudio, reopen it and run your whole script again.",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#adding-gene-information-1",
- "href": "transcriptomics/week-5/study_before_workshop.html#adding-gene-information-1",
- "title": "Independent Study to prepare for workshop",
- "section": "Adding gene information",
- "text": "Adding gene information\n\n\nThe gene id is difficult to interpret in plots/tables\nTherefore we need to add information such as the gene name and a description to the results\nFor the 🐸 Frog data information comes from Xenbase (Fisher et al. 2023)\nFor the 🐭 Mice data information comes from Ensembl (Birney et al. 2004)",
+ "objectID": "transcriptomics/week-3/workshop.html#mice-and-future-you",
+ "href": "transcriptomics/week-3/workshop.html#mice-and-future-you",
+ "title": "Workshop",
+ "section": "🐭 Mice and future you",
+ "text": "🐭 Mice and future you\n🎬 Create a new Project, mice-88H, populated with folders and your data. Make a script file called hspc-prog.R. This will a be commented analysis of the hspc cells vs the prog cells. At this point you will have only code for the hspc cells. You will build on this each workshop and be able to use it as a template to examine other comparisons. Copy in the appropriate code and comments from workshop-1.R. Edit to improve your comments where your understanding has developed since you made them. Make sure you can close down RStudio, reopen it and run your whole script again.",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#xenbase",
- "href": "transcriptomics/week-5/study_before_workshop.html#xenbase",
- "title": "Independent Study to prepare for workshop",
- "section": "🐸 Xenbase",
- "text": "🐸 Xenbase\n\nxenbase logoXenbase is a model organism database that provides genomic, molecular, and developmental biology information about Xenopus laevis and Xenopus tropicalis.\n\nIt took me some time to find the information you need.",
+ "objectID": "transcriptomics/week-3/workshop.html#arabidopsis-and-future-you",
+ "href": "transcriptomics/week-3/workshop.html#arabidopsis-and-future-you",
+ "title": "Workshop",
+ "section": "🎄 Arabidopsis and future you",
+ "text": "🎄 Arabidopsis and future you",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#xenbase-1",
- "href": "transcriptomics/week-5/study_before_workshop.html#xenbase-1",
- "title": "Independent Study to prepare for workshop",
- "section": "🐸 Xenbase",
- "text": "🐸 Xenbase\n\n\nI got the information from the Xenbase information pages under Data Reports | Gene Information\nThis is listed: Xenbase Gene Product Information [readme] gzipped gpi (tab separated)\nClick on the readme link to see the file format and columns\nI downloaded xenbase.gpi.gz, unzipped it, removed header lines and the Xenopus tropicalis (taxon:8364) entries and saved it as xenbase_info.xlsx\nIn the workshop you will import this file and merge the information with the results file",
+ "objectID": "transcriptomics/week-3/workshop.html#leishmania-and-future-you",
+ "href": "transcriptomics/week-3/workshop.html#leishmania-and-future-you",
+ "title": "Workshop",
+ "section": "💉 Leishmania and future you",
+ "text": "💉 Leishmania and future you",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#ensembl",
- "href": "transcriptomics/week-5/study_before_workshop.html#ensembl",
- "title": "Independent Study to prepare for workshop",
- "section": "🐭 Ensembl",
- "text": "🐭 Ensembl\n\n\nEnsembl creates, integrates and distributes reference datasets and analysis tools that enable genomics\nBioMart provides a access to these large datasets\nbiomaRt (biomaRt?) is a Bioconductor package gives you programmatic access to BioMart.\nIn the workshop you use this package to get information you can merge with the results file",
+ "objectID": "transcriptomics/week-3/workshop.html#footnotes",
+ "href": "transcriptomics/week-3/workshop.html#footnotes",
+ "title": "Workshop",
+ "section": "Footnotes",
+ "text": "Footnotes\n\nThis a result of the Central limit theorem,one consequence of which is that adding together lots of distributions - whatever distributions they are - will tend to a normal distribution.↩︎",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Workshop"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#what-is-the-purpose-of-an-transcriptomics-plot",
- "href": "transcriptomics/week-5/study_before_workshop.html#what-is-the-purpose-of-an-transcriptomics-plot",
- "title": "Independent Study to prepare for workshop",
- "section": "What is the purpose of an Transcriptomics plot?",
- "text": "What is the purpose of an Transcriptomics plot?\n\n\nIn general, we plot data to help us summarise and understand it\nThis is especially import for omics data where we have a very large number of variables and often a large number of observations\nWe will look at three plots very commonly used in omics analysis: Principal Component Analysis (PCA) plot, Heatmaps and Volcano Plots",
+ "objectID": "transcriptomics/week-3/study_after_workshop.html",
+ "href": "transcriptomics/week-3/study_after_workshop.html",
+ "title": "Independent Study to consolidate this week",
+ "section": "",
+ "text": "You need only do the section for your own project data\n🐸 Frog development\n🎬 Open your frogs-88H Project. Make a new script and, using cont-fgf-s30.R as a template, repeat the analysis on one of the other comparisons. It does not matter which one you choose. I recommend making a new script.\n🐭 Stem cells\n🎬 Open your mice-88H Project. Open your hspc-prog.R script and, using your code working with the hspc cells as a template, repeat the analysis on the prog cells. Add the code to hspc-prog.R as you will later add the statistical comparison between these cell types.\n🎄 Arabidopisis\n💉 Leishmania",
"crumbs": [
"Transcriptomics",
- "Week 5: Visualising and Interpreting",
- "Prepare!"
+ "Week 3: Hello data!",
+ "Consolidate!"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#pca",
- "href": "transcriptomics/week-5/study_before_workshop.html#pca",
- "title": "Independent Study to prepare for workshop",
- "section": "PCA",
- "text": "PCA\n\n\nPrincipal Component Analysis is an unsupervised machine learning technique\nUnsupervised methods1 are unsupervised in that they do not use/optimise to a particular output. The goal is to uncover structure. They do not test hypotheses\nIt is often used to visualise high dimensional data because it is a dimension reduction technique\n\n\nYou may wish to read a previous introduction to unsupervised methods I have written An introduction to Machine Learning: Unsupervised methods (Rand 2021)",
+ "objectID": "transcriptomics/week-5/overview.html",
+ "href": "transcriptomics/week-5/overview.html",
+ "title": "Overview",
+ "section": "",
+ "text": "This week we cover how to visualise the results of your differential expression analysis. The independent study will allow you to check you have what you should have following the Transcriptomics 2: Statistical Analysis workshop and Consolidation study. It will also summarise the the methods and plots we will go through in the workshop. It will also explain how to write the methods for the analyses with have conducted. In the workshop, we will learn how to carry out and plot a Principle Component Analysis (PCA) as well as how to create a nicely formatted Volcano plot.\nThe plots you have by the end of this week will be suitable for including in your report.\nWe suggest you sit together with your group in the workshop.\n\nLearning objectives\nThe successful student will be able to:\n\nverify they have the required RStudio Project set up and the data and code files from the previous Workshop and Consolidation study\nperform a PCA and understand how to interpret them\ncreate a volcano plot and understand how to interpret them\nwrite the methods for the analyses they have conducted\n\n\n\nInstructions\n\nPrepare\n\n📖 Read what you should have so far\n📖 Read about concepts in PCA and volcano plots\n📖 Read about how to write the methods for the analyses you have conducted\n\nWorkshop\n\n💻 Perform and plot a PCA\n💻 Visualise all the results with a volcano plot\n💻 Look after future you!\n\nConsolidate\n\n💻 Use the work you completed in the workshop as a template to apply to a new case.\n\n\n\n\nReferences",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
- "Prepare!"
+ "About"
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#pca-1",
- "href": "transcriptomics/week-5/study_before_workshop.html#pca-1",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#overview",
+ "href": "transcriptomics/week-5/study_before_workshop.html#overview",
"title": "Independent Study to prepare for workshop",
- "section": "PCA",
- "text": "PCA\n\n\nIt takes a large number of continuous variables (like gene expression) and reduces them to a smaller number of variables (called principal components) that explain most of the variation in the data\nThe principal components can be plotted to see how samples cluster together",
+ "section": "Overview",
+ "text": "Overview\nIn these slides we will:\n\n\nCheck where you are\n\nlearn some concepts used omics visualisation\n\nPrinciple Component Analysis (PCA)\nVolcano plots\nHeatmaps\n\n\nFind out what packages to install before the workshop",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
@@ -1965,11 +2228,11 @@
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#pca-2",
- "href": "transcriptomics/week-5/study_before_workshop.html#pca-2",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#what-we-did-in-transcriptomics-2-statistical-analysis",
+ "href": "transcriptomics/week-5/study_before_workshop.html#what-we-did-in-transcriptomics-2-statistical-analysis",
"title": "Independent Study to prepare for workshop",
- "section": "PCA",
- "text": "PCA\n\n\nTo see if samples cluster as we would expect, we might plot the expression of one gene against another\n\n\n\n\n\n\n\n\n\nSamples\n\n\n\n\n\nCells\n\n\n\n\nThis gives some insight but we have 280 (mice) or 10,000+(frogs) genes to consider. How do we know if the pair we use is typical? How can we consider al the genes at once?",
+ "section": "What we did in Transcriptomics 2: Statistical Analysis",
+ "text": "What we did in Transcriptomics 2: Statistical Analysis\n\n\ncarried out differential expression analysis\nfound genes not expressed at all, or expressed in one group only\nSaved results files",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
@@ -1977,11 +2240,11 @@
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#pca-3",
- "href": "transcriptomics/week-5/study_before_workshop.html#pca-3",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#where-should-you-be-1",
+ "href": "transcriptomics/week-5/study_before_workshop.html#where-should-you-be-1",
"title": "Independent Study to prepare for workshop",
- "section": "PCA",
- "text": "PCA\n\n\nPCA is a solution for this - It takes a large number of continuous variables (like gene expression) and reduces them to a smaller number of “principal components” that explain most of the variation in the data.\n\n\n\n\n\n\n\n\n\nSamples\n\n\n\n\n\nCells",
+ "section": "Where should you be?",
+ "text": "Where should you be?\nAfter the Transcriptomics 2: 👋 Statistical Analysis Workshop including:\n\n🤗 Look after future you! and\nthe Independent Study to consolidate, you should have:",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
@@ -1989,11 +2252,11 @@
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#pca-4",
- "href": "transcriptomics/week-5/study_before_workshop.html#pca-4",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#frog-development",
+ "href": "transcriptomics/week-5/study_before_workshop.html#frog-development",
"title": "Independent Study to prepare for workshop",
- "section": "PCA",
- "text": "PCA\nWe have done PCA in Transcriptomics 3, but often PCA might be one of the first exploratory steps because it gives you an idea whether you expect general patterns in gene expression that distinguish groups.",
+ "section": "🐸 Frog development",
+ "text": "🐸 Frog development\n\n\nAn RStudio Project called frogs-88H which contains:\n\ndata-raw/ with xlaevis_counts_S14.csv, xlaevis_counts_S20.csv, xlaevis_counts_S30.csv\n\ndata-processed with s30_filtered.csv and equivalent for S14 OR S20\nresults/ with s30_fgf_only.csv (there were no control only genes in s30), s30_results.csv and equivalent for S14 OR S20)\n\nTwo scripts called cont-fgf-s30.R and either cont-fgf-s20.R OR cont-fgf-s14.R\n\n\n\n\n\nFiles should be organised into folders. Code should well commented and easy to read.",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
@@ -2001,11 +2264,11 @@
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#heatmaps-1",
- "href": "transcriptomics/week-5/study_before_workshop.html#heatmaps-1",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#arabidopisis",
+ "href": "transcriptomics/week-5/study_before_workshop.html#arabidopisis",
"title": "Independent Study to prepare for workshop",
- "section": "Heatmaps",
- "text": "Heatmaps\n\n\nare a grid of genes on one axis and samples on the other with each grid cell coloured by another variable\nin this case the other variable is gene expression\nthey allow you to quickly get an overview of the expression patterns across genes and samples\nwe often couple them with clustering to group genes and samples with similar expression patterns together which helps us see which genes are responsible for distinguishing groups",
+ "section": "🎄 Arabidopisis",
+ "text": "🎄 Arabidopisis",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
@@ -2013,11 +2276,11 @@
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#section-1",
- "href": "transcriptomics/week-5/study_before_workshop.html#section-1",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#leishmania-mexicana",
+ "href": "transcriptomics/week-5/study_before_workshop.html#leishmania-mexicana",
"title": "Independent Study to prepare for workshop",
- "section": "",
- "text": "Heat map for the frog data\n\nSee next slide for information",
+ "section": "💉 Leishmania mexicana",
+ "text": "💉 Leishmania mexicana",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
@@ -2025,11 +2288,11 @@
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#heatmaps-2",
- "href": "transcriptomics/week-5/study_before_workshop.html#heatmaps-2",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#stem-cells",
+ "href": "transcriptomics/week-5/study_before_workshop.html#stem-cells",
"title": "Independent Study to prepare for workshop",
- "section": "Heatmaps",
- "text": "Heatmaps\n\n\nOn the vertical axis are genes which are differentially expressed at the 0.01 level\nOn the horizontal axis are samples\nWe can see that the FGF-treated samples cluster together and the control samples cluster together\nWe can also see two clusters of genes; one of these shows genes upregulated (more yellow) in the FGF-treated samples and the other shows genes downregulated (more blue) in the FGF-treated samples",
+ "section": "🐭 Stem cells",
+ "text": "🐭 Stem cells\n\n\nAn RStudio Project called mice-88H which contains\n\nRaw data (hspc, prog, lthsc)\nProcessed data (hspc_summary_gene.csv, hspc_summary_samp.csv, prog_summary_gene.csv, prog_summary_samp.csv, lthsc_summary_gene.csv, lthsc_summary_samp.csv)\n\n\nResults files (prog_hspc_results.csv and an equivalent for lthsc vs prog or hspc vs lthsc)\nTwo scripts called hspc-prog.R and either hspc-lthsc.R OR prog-lthsc.R\n\n\n\nFiles should be organised into folders. Code should well commented and easy to read.",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
@@ -2037,11 +2300,11 @@
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#volcano-plots-1",
- "href": "transcriptomics/week-5/study_before_workshop.html#volcano-plots-1",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#if-you-do-not-have-those",
+ "href": "transcriptomics/week-5/study_before_workshop.html#if-you-do-not-have-those",
"title": "Independent Study to prepare for workshop",
- "section": "Volcano plots",
- "text": "Volcano plots\n\n\nVolcano plots often used to visualise the results of differential expression analysis\nThey are just a scatter of the corrected p value against the fold change….\nalmost - the we actually plot the negative log of the corrected p value against the fold change",
+ "section": "If you do not have those",
+ "text": "If you do not have those\nGo through:\n\nTranscriptomics 2: Statistical Analysis including:\n🤗 Look after future you! and\nthe Independent Study to consolidate",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
@@ -2049,11 +2312,11 @@
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#volcano-plots-2",
- "href": "transcriptomics/week-5/study_before_workshop.html#volcano-plots-2",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#all-results-files",
+ "href": "transcriptomics/week-5/study_before_workshop.html#all-results-files",
"title": "Independent Study to prepare for workshop",
- "section": "Volcano plots",
- "text": "Volcano plots\n\n\nThis is because just plotting the p-value means the axis is counter intuitive. Small p-values (i.e., significant values) are at the bottom of the axis)\nAnd since p-values range from 1 to very tiny the points are all squashed at the bottom of the axis\n\n\n\nVolcano plot FDR against fold change",
+ "section": "All results files",
+ "text": "All results files\nRemind yourself of the key columns in any of the results files:\n\nnormalised counts for each sample/cell\na log2 fold change\nan unadjusted p-value\na p value adjusted for multiple testing (called FDR or padj)\na gene id\nother information about each gene",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
@@ -2061,11 +2324,11 @@
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#volcano-plots-3",
- "href": "transcriptomics/week-5/study_before_workshop.html#volcano-plots-3",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#results-files",
+ "href": "transcriptomics/week-5/study_before_workshop.html#results-files",
"title": "Independent Study to prepare for workshop",
- "section": "Volcano plots",
- "text": "Volcano plots\n\n\nPlotting the negative log of the corrected p-value means that the values are spread out and the significant values are at the top of the axis\n\n\n\nVolcano plot -log(FDR) against fold change",
+ "section": "🐸 , 🎄 , 💉 results files",
+ "text": "🐸 , 🎄 , 💉 results files\n\n\nbaseMean is the mean of the normalised counts for the gene across all samples\n\nlfcSE standard error of the fold change\n\nstat is the test statistic (the Wald statistic)",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
@@ -2073,11 +2336,11 @@
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#visualisations",
- "href": "transcriptomics/week-5/study_before_workshop.html#visualisations",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#stem-cells-1",
+ "href": "transcriptomics/week-5/study_before_workshop.html#stem-cells-1",
"title": "Independent Study to prepare for workshop",
- "section": "Visualisations",
- "text": "Visualisations\n\nShould be done on normalised data so meaningful comparisons can be made\nThe 🐭 mouse data were already log2normalised\nThe 🐸 frog data were normalised by the DE method and saved to file. We will log2 transform before doing visualisations",
+ "section": "🐭 Stem cells",
+ "text": "🐭 Stem cells\n\nTop is the rank of the gene ordered by the p-value (smallest first)\n\nsummary.logFC and logFC.hspc give the same value (in this case since comparing two cell types)",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
@@ -2085,11 +2348,11 @@
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#packages-to-install-before-the-workshop",
- "href": "transcriptomics/week-5/study_before_workshop.html#packages-to-install-before-the-workshop",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#what-is-the-purpose-of-a-transcriptomics-plot",
+ "href": "transcriptomics/week-5/study_before_workshop.html#what-is-the-purpose-of-a-transcriptomics-plot",
"title": "Independent Study to prepare for workshop",
- "section": "Packages to install before the workshop",
- "text": "Packages to install before the workshop\nheatmaply (Galili et al. 2017) and ggrepel (Slowikowski 2024) from CRAN in the the normal way:\n\ninstall.packages(\"heatmaply\")\ninstall.packages(\"ggrepel\")\n\nbiomaRt (biomaRt?) from Bioconductor using BiocManager (Morgan and Ramos 2024)\n\nBiocManager::install(\"biomaRt\")",
+ "section": "What is the purpose of a Transcriptomics plot?",
+ "text": "What is the purpose of a Transcriptomics plot?\n\n\nIn general, we plot data to help us summarise and understand it\nThis is especially import for transcriptomics data where we have a very large number of variables and often a large number of observations\nWe will look at two plots very commonly used in transcriptomics analysis: Principal Component Analysis (PCA) plot and Volcano Plots",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
@@ -2097,11 +2360,11 @@
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#workshops-1",
- "href": "transcriptomics/week-5/study_before_workshop.html#workshops-1",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#pca",
+ "href": "transcriptomics/week-5/study_before_workshop.html#pca",
"title": "Independent Study to prepare for workshop",
- "section": "Workshops",
- "text": "Workshops\n\nTranscriptomics 1: Hello data Getting to know the data. Checking the distributions of values\nTranscriptomics 2: Statistical Analysis Identifying which genes are differentially expressed between treatments.\nTranscriptomics 3: Visualising and Interpreting. PCA, Volcano plots and heatmaps to visualise results. Interpreting the results and finding out more about genes of interest.",
+ "section": "PCA",
+ "text": "PCA\n\n\nPrincipal Component Analysis is an unsupervised machine learning technique\nUnsupervised methods1 are unsupervised in that they do not use/optimise to a particular output. The goal is to uncover structure. They do not test hypotheses\nIt is often used to visualise high dimensional data because it is a dimension reduction technique\n\n\nYou may wish to read a previous introduction to unsupervised methods I have written An introduction to Machine Learning: Unsupervised methods (Rand 2021)",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
@@ -2109,11 +2372,11 @@
]
},
{
- "objectID": "transcriptomics/week-5/study_before_workshop.html#references",
- "href": "transcriptomics/week-5/study_before_workshop.html#references",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#pca-1",
+ "href": "transcriptomics/week-5/study_before_workshop.html#pca-1",
"title": "Independent Study to prepare for workshop",
- "section": "References",
- "text": "References\n\n\n\n🔗 About Transcriptomics 3: Visualising and Interpreting\n\n\n\n\nBirney, Ewan, T. Daniel Andrews, Paul Bevan, Mario Caccamo, Yuan Chen, Laura Clarke, Guy Coates, et al. 2004. “An Overview of Ensembl.” Genome Research 14 (5): 925–28. https://doi.org/10.1101/gr.1860604.\n\n\nFisher, Malcolm, Christina James-Zorn, Virgilio Ponferrada, Andrew J Bell, Nivitha Sundararaj, Erik Segerdell, Praneet Chaturvedi, et al. 2023. “Xenbase: Key Features and Resources of the Xenopus Model Organism Knowledgebase.” Genetics 224 (1): iyad018. https://doi.org/10.1093/genetics/iyad018.\n\n\nGalili, Tal, O’Callaghan, Alan, Sidi, Jonathan, Sievert, and Carson. 2017. “Heatmaply: An r Package for Creating Interactive Cluster Heatmaps for Online Publishing.” Bioinformatics. https://doi.org/10.1093/bioinformatics/btx657.\n\n\nLove, Michael I., Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-Seq Data with DESeq2.” Genome Biology 15: 550. https://doi.org/10.1186/s13059-014-0550-8.\n\n\nLun, Aaron T. L., Davis J. McCarthy, and John C. Marioni. 2016. “A Step-by-Step Workflow for Low-Level Analysis of Single-Cell RNA-Seq Data with Bioconductor.” F1000Res. 5: 2122. https://doi.org/10.12688/f1000research.9501.2.\n\n\nMorgan, Martin, and Marcel Ramos. 2024. BiocManager: Access the Bioconductor Project Package Repository. https://bioconductor.github.io/BiocManager/.\n\n\nRand, Emma. 2021. Data Science Strand of BIO00058M. https://doi.org/10.5281/zenodo.5527705.\n\n\nSlowikowski, Kamil. 2024. Ggrepel: Automatically Position Non-Overlapping Text Labels with ’Ggplot2’. https://ggrepel.slowkow.com/.",
+ "section": "PCA",
+ "text": "PCA\n\n\nTakes a large number of continuous variables (like gene expression) and reduces them to a smaller number of variables (called principal components) that explain most of the variation in the data\nThe principal components can be plotted to see how samples cluster together",
"crumbs": [
"Transcriptomics",
"Week 5: Visualising and Interpreting",
@@ -2121,469 +2384,470 @@
]
},
{
- "objectID": "transcriptomics/week-4/workshop.html",
- "href": "transcriptomics/week-4/workshop.html",
- "title": "Workshop",
- "section": "",
- "text": "In the workshop, you will learn how to perform differential expression analysis on raw counts using DESeq2 (Love, Huber, and Anders 2014) or on logged normalised expression values using scran (Lun, McCarthy, and Marioni 2016) or both.",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Workshop"
- ]
- },
- {
- "objectID": "transcriptomics/week-4/workshop.html#session-overview",
- "href": "transcriptomics/week-4/workshop.html#session-overview",
- "title": "Workshop",
- "section": "",
- "text": "In the workshop, you will learn how to perform differential expression analysis on raw counts using DESeq2 (Love, Huber, and Anders 2014) or on logged normalised expression values using scran (Lun, McCarthy, and Marioni 2016) or both.",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Workshop"
- ]
- },
- {
- "objectID": "transcriptomics/week-4/workshop.html#import",
- "href": "transcriptomics/week-4/workshop.html#import",
- "title": "Workshop",
- "section": "Import",
- "text": "Import\nWe need to import the S30 data that were filtered to remove genes with 4, 5 or 6 zeros and those where the total counts was less than 20.\n🎬 Import the data from the data-processed folder.",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Workshop"
- ]
- },
- {
- "objectID": "transcriptomics/week-4/workshop.html#genes-expressed-in-one-treatment",
- "href": "transcriptomics/week-4/workshop.html#genes-expressed-in-one-treatment",
- "title": "Workshop",
- "section": "Genes expressed in one treatment",
- "text": "Genes expressed in one treatment\nThe genes expressed in only one treatment group are those with zeros in all three replicates in one group and non-zero values in all three replicates in the other group. For example, those shown here:\n\n\nError in `arrange()`:\nℹ In argument: `..1 = S30_C_3`.\nCaused by error:\n! object 'S30_C_3' not found\n\n\nWe will use filter() to find these genes.\n🎬 Find the genes that are expressed only in the FGF-treated group:\n\ns30_fgf_only <- s30_filtered |> \n filter(S30_C_1 == 0, \n S30_C_2 == 0, \n S30_C_3 == 0, \n S30_F_1 > 0, \n S30_F_2 > 0, \n S30_F_3 > 0)\n\nError in `filter()`:\nℹ In argument: `S30_C_1 == 0`.\nCaused by error:\n! object 'S30_C_1' not found\n\n\n❓ How many genes are expressed only in the FGF-treated group?\n\n\n🎬 Now you find any genes that are expressed only in the control group.\n\n\nError in `filter()`:\nℹ In argument: `S30_C_1 > 0`.\nCaused by error:\n! object 'S30_C_1' not found\n\n\n❓ Do the results make sense to you in light of what you know about the biology?\n\n\n\n\n\n\n\n🎬 Write to file (saved in results) all the genes that are expressed one group only.\n\n\nError in eval(expr, envir, enclos): object 's30_fgf_only' not found",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Workshop"
- ]
- },
- {
- "objectID": "transcriptomics/week-4/workshop.html#create-deseqdataset-object",
- "href": "transcriptomics/week-4/workshop.html#create-deseqdataset-object",
- "title": "Workshop",
- "section": "Create DESeqDataSet object",
- "text": "Create DESeqDataSet object\n🎬 Load the DESeq2 package:\nA DEseqDataSet object is a custom data type that is used by DESeq2. Custom data types are common in the Bioconductor1 packages. They are used to store data in a way that is useful for the analysis. These data types typically have data, transformed data, metadata and experimental designs within them.\nTo create a DESeqDataSet object, we need to provide three things:\n\nThe raw counts - these are what we imported into s30_filtered\n\nThe meta data which gives information about the samples and which treatment groups they belong to\nA design matrix which captures the design of the statistical model.\n\nThe counts must in a matrix rather than a dataframe. Unlike a dataframe, a matrix has columns of all the same type. That is, it will contain only the counts. The gene ids are given as row names rather than a column. The matrix() function will create a matrix from a dataframe of columns of the same type and the select() function can be used to remove the gene ids column.\n🎬 Create a matrix of the counts:\n\ns30_count_mat <- s30_filtered |>\n select(-xenbase_gene_id) |>\n as.matrix()\n\n🎬 Add the gene ids as row names to the matrix:\n\n# add the row names to the matrix\nrownames(s30_count_mat) <- s30_filtered$xenbase_gene_id\n\nYou might want to view the matrix.\nThe metadata are in a file, frog_meta_data.txt. This is a tab-delimited file. The first column is the sample name and the second column is the treatment group.\n🎬 Make a folder called meta and save the file to it.\n🎬 Read the metadata into a dataframe:\n\nmeta <- read_table(\"meta/frog_meta_data.txt\")\n\n🎬 Examine the resulting dataframe.\nWe need to add the sample names as row names to the metadata dataframe. This is because the DESeqDataSet object will use the row names to match the samples in the metadata to the samples in the counts matrix.\n🎬 Add the sample names as row names to the metadata dataframe:\n\nrow.names(meta) <- meta$sample_id\n\n(you will get a warning message but you can ignore it)\nWe are dealing only with the S30 data so we need to remove the samples that are not in the S30 data.\n🎬 Filter the metadata to keep only the S30 information:\n\nmeta_S30 <- meta |>\n dplyr::filter(stage == \"stage_30\")\n\n\n\n# A tibble: 6 × 4\n sample_id stage treatment sibling_rep\n* <chr> <chr> <chr> <chr> \n1 S30_C_5 stage_30 control five \n2 S30_C_6 stage_30 control six \n3 S30_C_A stage_30 control A \n4 S30_F_5 stage_30 FGF five \n5 S30_F_6 stage_30 FGF six \n6 S30_F_A stage_30 FGF A \n\n\nWe can now create the DESeqDataSet object. The design formula describes the statistical model You should notice that it is the same sort of formula we used in t.test(), lm(),glm() etc. The ~ indicates that the left hand side is the response variable (in this case counts) and the right hand side are the explanatory variables. We are interested in the difference between the treatments but we include sibling_rep to account for the fact that the data are paired. The names of the columns in the count matrix have to match the names in the metadata dataframe and the names of the explanatory variables in the design formula have to match the names of columns in the metadata.\n🎬 Create the DESeqDataSet object:\n\ndds <- DESeqDataSetFromMatrix(countData = s30_count_mat,\n colData = meta_S30,\n design = ~ treatment + sibling_rep)\n\nThe warning “Warning: some variables in design formula are characters, converting to factors” just means that the variable type of treatment and sibling_rep in the metadata dataframe are char. This is not a as DESeqDataSetFromMatrix() has made them into the factors it needs.\n🎬 Examine the DESeqDataSet object.\nThe counts are in dds@assays@data@listData[[\"counts\"]] and the metadata are in dds@colData but the easiest way to see them is to use the counts() and colData() functions from the DESeq2 package.\n🎬 View the counts:\n\ncounts(dds) |> View()\n\nError in .External2(C_dataviewer, x, title): unable to start data viewer\n\n\nYou should be able to see that this is the same as in s30_count_mat.\n\ncolData(dds)\n\nDataFrame with 6 rows and 4 columns\n sample_id stage treatment sibling_rep\n <character> <character> <factor> <factor>\nS30_C_5 S30_C_5 stage_30 control five\nS30_C_6 S30_C_6 stage_30 control six \nS30_C_A S30_C_A stage_30 control A \nS30_F_5 S30_F_5 stage_30 FGF five\nS30_F_6 S30_F_6 stage_30 FGF six \nS30_F_A S30_F_A stage_30 FGF A",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Workshop"
- ]
- },
- {
- "objectID": "transcriptomics/week-4/workshop.html#prepare-the-normalised-counts",
- "href": "transcriptomics/week-4/workshop.html#prepare-the-normalised-counts",
- "title": "Workshop",
- "section": "Prepare the normalised counts",
- "text": "Prepare the normalised counts\nThe normalised counts are the counts that have been transformed to account for the library size (i.e., the total number of reads in a sample) and the gene length. We have to first estimate the normalisation factors and store them in the DESeqDataSet object and then we can get the normalised counts.\n🎬 Estimate the factors for normalisation and store them in the DESeqDataSet object:\n\ndds <- estimateSizeFactors(dds)\n\n🎬 Look at the factors (just for information):\n\nsizeFactors(dds)\n\n S30_C_5 S30_C_6 S30_C_A S30_F_5 S30_F_6 S30_F_A \n0.8812200 0.9454600 1.2989886 1.0881870 1.0518961 0.8322894 \n\n\nTo get the normalised counts we again used the counts() function but this time we use the normalized=TRUE argument.\n🎬 Save the normalised to a matrix:\n\nnormalised_counts <- counts(dds, normalized = TRUE)\n\nWe will write the normalised counts to a file so that we can use them in the future.\n🎬 Make a dataframe of the normalised counts, add a column for the gene ids and write to file:\n\ndata.frame(normalised_counts,\n xenbase_gene_id = row.names(normalised_counts)) |>\n write_csv(file = \"results/S30_normalised_counts.csv\")",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Workshop"
- ]
- },
- {
- "objectID": "transcriptomics/week-4/workshop.html#differential-expression-analysis",
- "href": "transcriptomics/week-4/workshop.html#differential-expression-analysis",
- "title": "Workshop",
- "section": "Differential expression analysis",
- "text": "Differential expression analysis\nWe used the DESeq() function to do the differential expression analysis. This function fits the statistical model to the data and then uses the model to calculate the significance of the difference between the treatments. It again stored the results in the DESseqDataSet object. Note that the differential expression needs the raw (unnormalised counts) as it does its own normalisation as part of the process.\n🎬 Run the differential expression analysis:\n\ndds <- DESeq(dds)\n\nThe function will take only a few moments to run on this data but can take longer for bigger datasets.\nWe need to define the contrasts we want to test. We want to test the difference between the treatments so we will define the contrast as FGF and control.\n🎬 Define the contrast:\n\ncontrast_fgf <- c(\"treatment\", \"FGF\", \"control\")\n\nNote that treatment is the name of the column in the metadata dataframe and FGF and control are the names of the levels in the treatment column. By putting them in the order FGF , control we are saying the fold change will be FGF / control. If we had put them in the order control, FGF we would have got the fold change as control / FGF. This means:\n\npositive log fold changes indicate FGF > control and\nnegative log fold changes indicates control > FGF.\n\n🎬 Extract the results from the DESseqDataSet object:\n\nresults_fgf <- results(dds,\n contrast = contrast_fgf)\n\nThis will give us the log2 fold change and p-value for the contrast. ## Add gene information from Xenbase\n\nI got the information from the Xenbase information pages under Data Reports | Gene Information\nThis is listed: Xenbase Gene Product Information [readme] gzipped gpi (tab separated)\nClick on the readme link to see the file format and columns\nI downloaded xenbase.gpi.gz, unzipped it, removed header lines and the Xenopus tropicalis (taxon:8364) entries and saved it as xenbase_info.xlsx\n\nIf you want to emulate what I did you can use the following commands in the terminal after downloading the file:\ngunzip xenbase.gpi.gz\nless xenbase.gpi\nq\ngunzip unzips the file and less allows you to view the file. q quits the viewer. You will see the header lines and that the file contains both Xenopus tropicalis and Xenopus laevis. I read the file in with read_tsv (skipping the first header lines) then filtered out the Xenopus tropicalis entries, dropped some columns and saved the file as an excel file.\nHowever, I have already done this for you and saved the file as xenbase_info.xlsx in the meta folder. We will import this file and join it to the results dataframe.\n🎬 Load the readxl (Wickham and Bryan 2023) package:\n\nlibrary(readxl)\n\n🎬 Import the Xenbase gene information file:\n\ngene_info <- read_excel(\"meta/xenbase_info.xlsx\") \n\nError: `path` does not exist: 'meta/xenbase_info.xlsx'\n\n\nYou should view the resulting dataframe to see what information is available. You can use glimpse() or View().\n🎬 Merge the gene information with the results:\n\n# join the gene info with the results\ns30_results <- s30_results |>\n left_join(gene_info, by = \"xenbase_gene_id\")\n\nError in eval(expr, envir, enclos): object 's30_results' not found\n\n\nWe will also find it useful to import the metadata that maps the sample names to treatments. This will allow us to label the samples in the visualisations.\n🎬 Save the results to a file:\n\ndata.frame(results_fgf,\n xenbase_gene_id = row.names(results_fgf)) |> \n write_csv(file = \"results/S30_results.csv\")",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Workshop"
- ]
- },
- {
- "objectID": "transcriptomics/week-4/workshop.html#import-1",
- "href": "transcriptomics/week-4/workshop.html#import-1",
- "title": "Workshop",
- "section": "Import",
- "text": "Import\n🎬 Import surfaceome_hspc.csv and surfaceome_prog.csv into dataframes called hspc and prog respectively.",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#pca-2",
+ "href": "transcriptomics/week-5/study_before_workshop.html#pca-2",
+ "title": "Independent Study to prepare for workshop",
+ "section": "PCA",
+ "text": "PCA\n\n\nTo understand the logic of PCA, imagine we might plotting the expression of one gene against that of another\n\n\n\n\n\n\n\n\n\nSamples\n\n\n\n\n\nCells\n\n\n\n\nThis gives us some in insight in how the sample/cells cluster. But we have a lot of genes (even for the stem cells) to consider. How do we know if the pair we use is typical? How can we consider al the genes at once?",
"crumbs": [
"Transcriptomics",
- "Week 4: Statistical Analysis",
- "Workshop"
+ "Week 5: Visualising and Interpreting",
+ "Prepare!"
]
},
{
- "objectID": "transcriptomics/week-4/workshop.html#combine-the-two-datasets",
- "href": "transcriptomics/week-4/workshop.html#combine-the-two-datasets",
- "title": "Workshop",
- "section": "Combine the two datasets",
- "text": "Combine the two datasets\nWe need to combine the two datasets of 701 and 798 cells into one dataset of 1499 cells, i.e., 1499 columns. The number of rows is the number of genes, 280. Before combining, we must make sure genes in the same order in both dataframes or we would be comparing the expression of one gene in one cell type to the expression of a different gene in the other cell type!\n🎬 Check the gene ids are in the same order in both dataframes:\n\nidentical(prog$ensembl_gene_id, hspc$ensembl_gene_id)\n\n[1] TRUE\n\n\nscran can use a matrix or a dataframe of counts but theses must be log normalised counts. If using a dataframe, the columns must only contain the expression values (not the gene ids).\n🎬 Combine the two dataframes (minus the gene ids) into one dataframe called prog_hspc:\n\nprog_hspc <- bind_cols(prog[-1], hspc[-1])\n\n🎬 Now add the gene ids as the row names:\n\nrow.names(prog_hspc) <- prog$ensembl_gene_id",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#pca-3",
+ "href": "transcriptomics/week-5/study_before_workshop.html#pca-3",
+ "title": "Independent Study to prepare for workshop",
+ "section": "PCA",
+ "text": "PCA\n\n\nPCA is a solution for this - It takes a large number of continuous variables (like gene expression) and reduces them to a smaller number of “principal components” that explain most of the variation in the data.\n\n\n\n\n\n\n\n\n\nSamples\n\n\n\n\n\nCells",
"crumbs": [
"Transcriptomics",
- "Week 4: Statistical Analysis",
- "Workshop"
+ "Week 5: Visualising and Interpreting",
+ "Prepare!"
]
},
{
- "objectID": "transcriptomics/week-4/workshop.html#filter-to-remove-unexpressed-genes",
- "href": "transcriptomics/week-4/workshop.html#filter-to-remove-unexpressed-genes",
- "title": "Workshop",
- "section": "Filter to remove unexpressed genes",
- "text": "Filter to remove unexpressed genes\nIn this dataset, we will not see and genes that are not expressed in any of the cells because we are using a specific subset of the transcriptome that was deliberately selected. However, we will go through how to do this because it is an important step in most analyses.\nFor the 🐸 frog data you should remember that we were able to filter out our unexpressed genes in Transcripttranscriptomics 1 because we were examining both groups to be compared. In that workshop, we discussed that we could not filter out unexpressed genes in the 🐭 mouse data because we only had one cell types at that time. During the Consolidate Independent Study you examined the hspc cells.\nWhere the sum of all the values in the rows is zero, all the entries must be zero. We can use this to find the filter the genes that are not expressed in any of the cells. To do row wise aggregates such as the sum across rows we can use the rowwise() function. c_across() allows us to use the colon notation Prog_001:HSPC_852 in sum() rather than having to list all the column names: sum(Prog_001, Prog_002, Prog_002, Prog_004,.....)\n🎬 Find the genes that are 0 in every column of the prog_hspc dataframe:\n\nprog_hspc |> \n rowwise() |> \n filter(sum(c_across(Prog_001:HSPC_852)) == 0)\n\n# A tibble: 0 × 1,499\n# Rowwise: \n# ℹ 1,499 variables: Prog_001 <dbl>, Prog_002 <dbl>, Prog_003 <dbl>,\n# Prog_004 <dbl>, Prog_006 <dbl>, Prog_007 <dbl>, Prog_008 <dbl>,\n# Prog_009 <dbl>, Prog_010 <dbl>, Prog_011 <dbl>, Prog_012 <dbl>,\n# Prog_013 <dbl>, Prog_014 <dbl>, Prog_015 <dbl>, Prog_016 <dbl>,\n# Prog_017 <dbl>, Prog_018 <dbl>, Prog_019 <dbl>, Prog_020 <dbl>,\n# Prog_021 <dbl>, Prog_022 <dbl>, Prog_023 <dbl>, Prog_024 <dbl>,\n# Prog_025 <dbl>, Prog_026 <dbl>, Prog_027 <dbl>, Prog_028 <dbl>, …\n\n\nNotice that we have summed across all the columns.\n❓ What do you conclude?\n\n\nWe might also examine the genes which are least expressed.\n🎬 Find ten least expressed genes:\n\nrowSums(prog_hspc) |> sort() |> head(10)\n\nENSMUSG00000041046 ENSMUSG00000012428 ENSMUSG00000022225 ENSMUSG00000027863 \n 30.70322 35.35796 50.45975 61.27461 \nENSMUSG00000019359 ENSMUSG00000020701 ENSMUSG00000030772 ENSMUSG00000027376 \n 68.90961 77.95594 84.11234 97.69333 \nENSMUSG00000023132 ENSMUSG00000026285 \n 120.43065 126.95425 \n\n\n❓ What do you conclude?",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#pca-4",
+ "href": "transcriptomics/week-5/study_before_workshop.html#pca-4",
+ "title": "Independent Study to prepare for workshop",
+ "section": "PCA",
+ "text": "PCA\nWe have done PCA after differential expression, but often PCA might is one of the first exploratory steps because it gives you an idea whether you expect general patterns in gene expression that distinguish groups.",
"crumbs": [
"Transcriptomics",
- "Week 4: Statistical Analysis",
- "Workshop"
+ "Week 5: Visualising and Interpreting",
+ "Prepare!"
]
},
{
- "objectID": "transcriptomics/week-4/workshop.html#find-the-genes-that-are-expressed-in-only-one-cell-type",
- "href": "transcriptomics/week-4/workshop.html#find-the-genes-that-are-expressed-in-only-one-cell-type",
- "title": "Workshop",
- "section": "Find the genes that are expressed in only one cell type",
- "text": "Find the genes that are expressed in only one cell type\nTo find the genes that are expressed in only one cell type, we can use the same approach as above but only sum the columns for one cell type.\n🎬 Find the genes that are 0 in every column for the HSPC cells:\n\nprog_hspc |> \n rowwise() |> \n filter(sum(c_across(HSPC_001:HSPC_852)) == 0)\n\n# A tibble: 0 × 1,499\n# Rowwise: \n# ℹ 1,499 variables: Prog_001 <dbl>, Prog_002 <dbl>, Prog_003 <dbl>,\n# Prog_004 <dbl>, Prog_006 <dbl>, Prog_007 <dbl>, Prog_008 <dbl>,\n# Prog_009 <dbl>, Prog_010 <dbl>, Prog_011 <dbl>, Prog_012 <dbl>,\n# Prog_013 <dbl>, Prog_014 <dbl>, Prog_015 <dbl>, Prog_016 <dbl>,\n# Prog_017 <dbl>, Prog_018 <dbl>, Prog_019 <dbl>, Prog_020 <dbl>,\n# Prog_021 <dbl>, Prog_022 <dbl>, Prog_023 <dbl>, Prog_024 <dbl>,\n# Prog_025 <dbl>, Prog_026 <dbl>, Prog_027 <dbl>, Prog_028 <dbl>, …\n\n\nWe have summed across the HSPC cells only. Note that if we knew there were some rows that were all zero across both cell types, we would need to add |> filter(sum(c_across(Prog_001:Prog_852)) != 0)\nmeaning zero in all the HSPC but not zero in all the Prog\n🎬 Now you find the genes that are 0 in every column for the Prog cells:\n\n\n# A tibble: 0 × 1,499\n# Rowwise: \n# ℹ 1,499 variables: Prog_001 <dbl>, Prog_002 <dbl>, Prog_003 <dbl>,\n# Prog_004 <dbl>, Prog_006 <dbl>, Prog_007 <dbl>, Prog_008 <dbl>,\n# Prog_009 <dbl>, Prog_010 <dbl>, Prog_011 <dbl>, Prog_012 <dbl>,\n# Prog_013 <dbl>, Prog_014 <dbl>, Prog_015 <dbl>, Prog_016 <dbl>,\n# Prog_017 <dbl>, Prog_018 <dbl>, Prog_019 <dbl>, Prog_020 <dbl>,\n# Prog_021 <dbl>, Prog_022 <dbl>, Prog_023 <dbl>, Prog_024 <dbl>,\n# Prog_025 <dbl>, Prog_026 <dbl>, Prog_027 <dbl>, Prog_028 <dbl>, …\n\n\n❓ What do you conclude?",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#volcano-plots-1",
+ "href": "transcriptomics/week-5/study_before_workshop.html#volcano-plots-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Volcano plots",
+ "text": "Volcano plots\n\n\nVolcano plots often used to visualise the results of differential expression analysis\nThey are just a scatter of the adjusted p value against the fold change….\nalmost - the we actually plot the negative log of the adjusted p value against the log fold change",
"crumbs": [
"Transcriptomics",
- "Week 4: Statistical Analysis",
- "Workshop"
+ "Week 5: Visualising and Interpreting",
+ "Prepare!"
]
},
{
- "objectID": "transcriptomics/week-4/workshop.html#differential-expression-analysis-1",
- "href": "transcriptomics/week-4/workshop.html#differential-expression-analysis-1",
- "title": "Workshop",
- "section": "Differential expression analysis",
- "text": "Differential expression analysis\nLike DESeq2, scran uses a statistical model to calculate the significance of the difference between the treatments and needs metadata to define the treatments.\n🎬 Load the scran package:\nThe meta data needed for the frog data was information about which columns were in which treatment group and which sibling group and we had that information in a file. Similarly, here we need information on which columns are from which cell type. Instead of having this is a file, we will create a vector that indicates which column belongs to which cell type.\n🎬 Create a vector that indicates which column belongs to which cell type:\n\ncell_type <- rep(c(\"prog\",\"hspc\"), \n times = c(length(prog) - 1,\n length(hspc) - 1))\n\nThe number of times each cell type is repeated is the number of columns in that cell type minus 1. This is because we have removed the column with the gene ids. Do check that the length of the cell_type vector is the same as the number of columns in the prog_hspc dataframe.\n🎬 Run the differential expression analysis:\n\nres_prog_hspc <- findMarkers(prog_hspc, \n cell_type)\n\nfindMarkers() is the function that runs the differential expression analysis. The first argument is the dataframe containing the data. The second argument is the vector indicating which columns are in which cell type. It gives us two dataframes of the results - rather unnecessarily. One is the results with fold changes that are Prog/HSPC and the other is the results with fold changes that are HSPC/Prog. These have the same magnitude, just a different sign\nThe dataframe res_prog_hspc$prog is log prog - log hspc (i.e.,Prog/HSPC). This means - Positive fold change: prog is higher than hspc - Negative fold change: hspc is higher than prog\nThe dataframe res_prog_hspc$hspc is log hspc - log prog (i.e., HSPC/Prog). . This means - Positive fold change: hspc is higher than prog - Negative fold change: prog is higher than hspc\n\n\n\nThe res_prog_hspc$prog dataframe\n\n\n\n\n\n\n\n\n\n\n\nTop\np.value\nFDR\nsummary.logFC\nlogFC.hspc\nensembl_gene_id\n\n\n\nENSMUSG00000028639\n1\n0\n0\n1.596910\n1.596910\nENSMUSG00000028639\n\n\nENSMUSG00000024053\n2\n0\n0\n3.035165\n3.035165\nENSMUSG00000024053\n\n\nENSMUSG00000041329\n3\n0\n0\n3.261056\n3.261056\nENSMUSG00000041329\n\n\nENSMUSG00000030336\n4\n0\n0\n-2.146491\n-2.146491\nENSMUSG00000030336\n\n\nENSMUSG00000016494\n5\n0\n0\n-3.056730\n-3.056730\nENSMUSG00000016494\n\n\nENSMUSG00000002808\n6\n0\n0\n3.000810\n3.000810\nENSMUSG00000002808\n\n\n\n\n\n\n\n\nThe res_prog_hspc$hspc dataframe. Notice the sign of the fold change is the other way\n\n\n\n\n\n\n\n\n\n\n\nTop\np.value\nFDR\nsummary.logFC\nlogFC.prog\nensembl_gene_id\n\n\n\nENSMUSG00000028639\n1\n0\n0\n-1.596910\n-1.596910\nENSMUSG00000028639\n\n\nENSMUSG00000024053\n2\n0\n0\n-3.035165\n-3.035165\nENSMUSG00000024053\n\n\nENSMUSG00000041329\n3\n0\n0\n-3.261056\n-3.261056\nENSMUSG00000041329\n\n\nENSMUSG00000030336\n4\n0\n0\n2.146491\n2.146491\nENSMUSG00000030336\n\n\nENSMUSG00000016494\n5\n0\n0\n3.056730\n3.056730\nENSMUSG00000016494\n\n\nENSMUSG00000002808\n6\n0\n0\n-3.000810\n-3.000810\nENSMUSG00000002808",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#volcano-plots-2",
+ "href": "transcriptomics/week-5/study_before_workshop.html#volcano-plots-2",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Volcano plots",
+ "text": "Volcano plots\n\n\nThis is because small probabilities are important, large ones are not so the axis is counter intuitive because Small p-values (i.e., significant values) are at the bottom of the axis)\nAnd since p-values range from 1 to very tiny the important points are all squashed at the bottom of the axis\n\n\n\nVolcano plot padj against fold change",
"crumbs": [
"Transcriptomics",
- "Week 4: Statistical Analysis",
- "Workshop"
+ "Week 5: Visualising and Interpreting",
+ "Prepare!"
]
},
{
- "objectID": "transcriptomics/week-4/workshop.html#add-gene-information-from-ensembl-using-biomart",
- "href": "transcriptomics/week-4/workshop.html#add-gene-information-from-ensembl-using-biomart",
- "title": "Workshop",
- "section": "Add gene information from Ensembl using biomaRt",
- "text": "Add gene information from Ensembl using biomaRt\nEnsembl (Martin et al. 2023; Birney et al. 2004)is a bioinformatics project to organise all the biological information around the sequences of large genomes. The are a large number of databases but BioMart (Smedley et al. 2009) provides a consistent interface to the material. There are web-based tools to use these but the R package biomaRt (biomaRt?) gives you programmatic access making it easier to integrate information into R dataframes\n🎬 Load the biomaRt (biomaRt?) package:\n\nlibrary(biomaRt)\n\n🎬 Connect to the mouse database and see the first 20 bits of information we can retrieve:\n\n# Connect to the mouse database\nensembl <- useMart(biomart = \"ensembl\", \n dataset = \"mmusculus_gene_ensembl\")\n\n# See what information we can retrieve\nlistAttributes(mart = ensembl) |> head(20)\n\n name description\n1 ensembl_gene_id Gene stable ID\n2 ensembl_gene_id_version Gene stable ID version\n3 ensembl_transcript_id Transcript stable ID\n4 ensembl_transcript_id_version Transcript stable ID version\n5 ensembl_peptide_id Protein stable ID\n6 ensembl_peptide_id_version Protein stable ID version\n7 ensembl_exon_id Exon stable ID\n8 description Gene description\n9 chromosome_name Chromosome/scaffold name\n10 start_position Gene start (bp)\n11 end_position Gene end (bp)\n12 strand Strand\n13 band Karyotype band\n14 transcript_start Transcript start (bp)\n15 transcript_end Transcript end (bp)\n16 transcription_start_site Transcription start site (TSS)\n17 transcript_length Transcript length (including UTRs and CDS)\n18 transcript_tsl Transcript support level (TSL)\n19 transcript_gencode_basic GENCODE basic annotation\n20 transcript_appris APPRIS annotation\n page\n1 feature_page\n2 feature_page\n3 feature_page\n4 feature_page\n5 feature_page\n6 feature_page\n7 feature_page\n8 feature_page\n9 feature_page\n10 feature_page\n11 feature_page\n12 feature_page\n13 feature_page\n14 feature_page\n15 feature_page\n16 feature_page\n17 feature_page\n18 feature_page\n19 feature_page\n20 feature_page\n\n\nThere are many (2,985!) possible bits of information (attributes) that can be obtained. You can replace head(20) with View() to see them all.\nWe use the getBM() function to retrieve information from the database. The filters argument is used to specified what kind of identifier we are supplying to retrieve information. The attributes argument is used to select the information we want to retrieve. The values argument is used to specify the identifiers. The mart argument is used to specify the connection we created.\n🎬 Get the gene information:\n\ngene_info <- getBM(filters = \"ensembl_gene_id\",\n attributes = c(\"ensembl_gene_id\",\n \"external_gene_name\",\n \"description\"),\n values = prog_hspc_results$ensembl_gene_id,\n mart = ensembl)\n\nError in eval(expr, envir, enclos): object 'prog_hspc_results' not found\n\n\nWe are getting the gene name and and a description. We also need to get the id because we will use that to merge the gene_info dataframe with the prog_hspc_results dataframe. Notice the dataframe returned only has 279 rows - one of the ids does not have information.\n🎬 We can find which is missing with:\n\n# prog_hspc_results |> select(ensembl_gene_id) |> \n# filter(!ensembl_gene_id %in% gene_info$ensembl_gene_id)\n\nOh, conflicted has flagged a conflict for us.\n🎬 Take the appropriate action to resolve the conflict:\n❓ What is the id which is missing information?\n\n\nWe might want to look that up - but let’s worry about it later if it turns out to be something important.\n🎬 Merge the gene information with the results:\n\nprog_hspc_results <- prog_hspc_results |> \n left_join(gene_info, by = \"ensembl_gene_id\")\n\nError in eval(expr, envir, enclos): object 'prog_hspc_results' not found\n\n\nI recommend viewing the dataframe to see the new columns. We now have dataframe with all the info we need, normalised counts, log2 normalised counts, statistical comparisons with fold changes and p values, information about the gene other than just the id\n🎬 Write the results to file:\n\ndata.frame(res_prog_hspc$prog, \n ensembl_gene_id = row.names(res_prog_hspc$prog)) |> \n write_csv(\"results/prog_hspc_results.csv\")",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#volcano-plots-3",
+ "href": "transcriptomics/week-5/study_before_workshop.html#volcano-plots-3",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Volcano plots",
+ "text": "Volcano plots\n\n\nPlotting the negative log of the adjusted p-value means that the values are spread out, and most significant are at the top of the axis\n\n\n\nVolcano plot -log(adjusted p) against fold change",
"crumbs": [
"Transcriptomics",
- "Week 4: Statistical Analysis",
- "Workshop"
+ "Week 5: Visualising and Interpreting",
+ "Prepare!"
]
},
{
- "objectID": "transcriptomics/week-4/workshop.html#footnotes",
- "href": "transcriptomics/week-4/workshop.html#footnotes",
- "title": "Workshop",
- "section": "Footnotes",
- "text": "Footnotes\n\nBioconductor is a project that develops and supports R packages for bioinformatics.↩︎",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#visualisations",
+ "href": "transcriptomics/week-5/study_before_workshop.html#visualisations",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Visualisations",
+ "text": "Visualisations\n\nShould be done on normalised data so meaningful comparisons can be made\nThe 🐭 stem cell data were already log2normalised\nThe other datasets were normalised by the DE method and we saved the values to the results files. We will log transform them in the workshop",
"crumbs": [
"Transcriptomics",
- "Week 4: Statistical Analysis",
- "Workshop"
+ "Week 5: Visualising and Interpreting",
+ "Prepare!"
]
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#overview",
- "href": "transcriptomics/week-4/study_before_workshop.html#overview",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#packages",
+ "href": "transcriptomics/week-5/study_before_workshop.html#packages",
"title": "Independent Study to prepare for workshop",
- "section": "Overview",
- "text": "Overview\nIn these slides we will:\n\n\nCheck where you are\n\nlearn some concepts in differential expression\n\nlog2 fold changes\nMultiple correction\nnormalisation\nstatistical model\n\n\nFind out what packages to install before the workshop",
+ "section": "Packages",
+ "text": "Packages\nThis packages is on the University computers which you can access on campus or remotely using the VDS\nIf you want to use your own machine you will need to install the package. ::: {style=“font-size: 60%;”}\nInstall ggrepel from CRAN in the the normal way:\n\ninstall.packages(\"ggrepel\")\n\nThis package allows you to label points on a plot without them overlapping.",
"crumbs": [
"Transcriptomics",
- "Week 4: Statistical Analysis",
+ "Week 5: Visualising and Interpreting",
"Prepare!"
]
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#what-we-did-in-transcriptomics-1-hello-data",
- "href": "transcriptomics/week-4/study_before_workshop.html#what-we-did-in-transcriptomics-1-hello-data",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#workshops-1",
+ "href": "transcriptomics/week-5/study_before_workshop.html#workshops-1",
"title": "Independent Study to prepare for workshop",
- "section": "What we did in Transcriptomics 1: 👋 Hello data!",
- "text": "What we did in Transcriptomics 1: 👋 Hello data!\n\n\n\nDiscovered how many rows and columns we had in our datasets and what these were.\nExamined the distribution\n\nof values across the whole dataset\nof values across the samples/cells (i.e., averaged across genes) to see variation between samples/cells\nof values across the genes (i.e., averaged across samples/cells) to see variation between genes\n\n\nSaved files of filtered or summarised data.",
+ "section": "Workshops",
+ "text": "Workshops\n\nTranscriptomics 1: Hello data Getting to know the data. Checking the distributions of values overall, across rows and columns to check things are as we expect and detect rows/columns that need to be removed\nTranscriptomics 2: Statistical Analysis. Identifying which genes are differentially expressed between treatments. This is the main analysis step. We will use different methods for bulk and single cell data.\nTranscriptomics 3: Visualising. Principal Component Analysis (PCA) volcano plots to visualise the results of the",
"crumbs": [
"Transcriptomics",
- "Week 4: Statistical Analysis",
+ "Week 5: Visualising and Interpreting",
"Prepare!"
]
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#where-should-you-be-1",
- "href": "transcriptomics/week-4/study_before_workshop.html#where-should-you-be-1",
+ "objectID": "transcriptomics/week-5/study_before_workshop.html#references",
+ "href": "transcriptomics/week-5/study_before_workshop.html#references",
"title": "Independent Study to prepare for workshop",
- "section": "Where should you be?",
- "text": "Where should you be?\nAfter the Transcriptomics 1: 👋 Hello data! Workshop including:\n\n🤗 Look after future you! and\nthe Independent Study to consolidate, you should have:",
+ "section": "References",
+ "text": "References\n\n\n\n🔗 About Transcriptomics 3: Visualising\n\n\n\n\nRand, Emma. 2021. Data Science Strand of BIO00058M. https://doi.org/10.5281/zenodo.5527705.",
"crumbs": [
"Transcriptomics",
- "Week 4: Statistical Analysis",
+ "Week 5: Visualising and Interpreting",
"Prepare!"
]
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#frogs",
- "href": "transcriptomics/week-4/study_before_workshop.html#frogs",
- "title": "Independent Study to prepare for workshop",
- "section": "🐸 Frogs",
- "text": "🐸 Frogs\n\n\nAn RStudio Project called frogs-88H which contains:\n\nRaw data (S14, S20 and S30)\nProcessed data (s30_filtered.csv, s30_summary_gene.csv, s30_summary_gene_filtered.csv, s30_summary_samp.csv and equivalents for S14 OR S20)\nTwo scripts called cont-fgf-s30.R and cont-fgf-s20.R OR cont-fgf-s14.R\n\n\n\n\n\nFiles should be organised into folders. Code should well commented and easy to read.",
+ "objectID": "core/week-2/overview.html",
+ "href": "core/week-2/overview.html",
+ "title": "Overview",
+ "section": "",
+ "text": "This week you will revise some essential concepts for scientific computing: file system organisation, file types, working directories and paths. The workshop will cover a rationale for working reproducibly, project oriented workflow, naming things and documenting your work.\n\nLearning objectives\nThe successful student will be able to:\n\nexplain the organisation of files and directories in a file systems including root, home and working directories\nexplain absolute and relative file paths\nexplain why working reproducibly is important\nknow how to use a project-oriented workflow to organise work\nbe able to give files human- and machine-readable names\nwrite cool 😎 code not 😩 ugly code\nexplain the value of code which expresses the structure of the problem/solution.\nuse some useful shortcuts to help write cool 😎 code\n\n\n\nInstructions\n\nPrepare\n\n📖 Read Understanding file systems\n📖 Read Workflow in RStudio\n\nWorkshop\nConsolidate",
"crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
+ "Core Supporting Info",
+ "Week 2: Supporting Information 1",
+ "About"
]
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#mice",
- "href": "transcriptomics/week-4/study_before_workshop.html#mice",
+ "objectID": "core/week-2/study_before_workshop.html",
+ "href": "core/week-2/study_before_workshop.html",
"title": "Independent Study to prepare for workshop",
- "section": "🐭 Mice",
- "text": "🐭 Mice\n\nAn RStudio Project called mice-88H which contains\n\nRaw data (hspc, prog, lthsc)\nProcessed data (hspc_summary_gene.csv, hspc_summary_samp.csv, prog_summary_gene.csv, prog_summary_samp.csv)\n\n\nOne script called hspc-prog.R\n\n\nFiles should be organised into folders. Code should well commented and easy to read.",
+ "section": "",
+ "text": "📖 Read Understanding file systems. This is an approximately 15 - 20 minute read revising file types and file systems. It covers concepts of working directories and paths. We learned these ideas in stage 1 and you may feel completely confident with them but many students will benefit from a refresher. For BIO00070M students, this is part of the work you will also be asked to complete for BIO00052M Data Analysis in R.\n📖 Read Workflow in RStudio. You may find it helpful to remind yourself about RStudio Projects. In previous years, you have submitted an “RStudio Project” as part of your BABS work. In this module, you will submit “Supporting Information” for your Project Report. The Supporting Information is a documented and organised collection of all the digital parts of your research project. This includes data (or instructions for accessing data), code and/or non-coded processing, instructions for use, computational requirements and outputs. The Supporting Information could be a single RStudio Project (like you have done previously but with better documentation) or a folder that includes an RStudio Project and other material/scripts.",
"crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
+ "Core Supporting Info",
+ "Week 2: Supporting Information 1",
"Prepare!"
]
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#section",
- "href": "transcriptomics/week-4/study_before_workshop.html#section",
+ "objectID": "core/week-2-old/overview.html",
+ "href": "core/week-2-old/overview.html",
+ "title": "Overview",
+ "section": "",
+ "text": "This week we will consider File types, workflow tips and other tools. The independent study reiterates the value of RStudio projects and shows you how you create them with usethis. You will also learn how to recognise and write cool 😎 code, not 😩 ugly code and code algorithmically. In the workshop we will examine some common biological data formats and discover some awesome short cuts to help you write cool 😎 code. You will also get a brief introduction to the command line and Google Colab.\n\nLearning objectives\nThe successful student will be able to:\n\nexplain why RStudio are useful/essential and be able to use the usethis package\nwrite cool 😎 code not 😩 ugly code\nexplain the value of code which expresses the structure of the problem/solution.\ndescribe some common file types for biological data\nuse some useful shortcuts to help write cool 😎 code\nknow what the command line is and how to use it for simple tasks\nuse Google colab to run code\nrecognise some of the differences between R and Python\n\n\n\nInstructions\n\nPrepare 20 mins reading on RStudio Projects revisited, formatting code and coding algorithmically\nWorkshop\n\n💬 Types of biological data files\n🪄 Workflow tips and shortcuts\n💻 The command line\n💻 Google colab\n💻 Python\n\nConsolidate\n\n💻 not sure yet :)"
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#overview",
+ "href": "core/week-2-old/study_before_workshop.html#overview",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Overview",
+ "text": "Overview\n\nRStudio Projects revisited\n\nusing usethis package\nAdding a README\n\n\nFormatting code\nCode algorithmically / algebraically."
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#reproducibility-is-a-continuum",
+ "href": "core/week-2-old/study_before_workshop.html#reproducibility-is-a-continuum",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Reproducibility is a continuum",
+ "text": "Reproducibility is a continuum\nSome is better than none!\n\nOrganise your project\n\nScript everything.\n\nFormat code and follow a consistent style.\n\nCode algorithmically\nModularise your code: organise into sections and scripts\nDocument your project - commenting, READMEs\nUse literate programming e.g., R Markdown or Quarto\n\n\n\nMore advanced: Version control, continuous integration, environments, containers"
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#rstudio-projects",
+ "href": "core/week-2-old/study_before_workshop.html#rstudio-projects",
+ "title": "Independent Study to prepare for workshop",
+ "section": "RStudio Projects",
+ "text": "RStudio Projects\n\n\nWe used RStudio Projects in stage one but they are so useful, it is worth covering them again in case you are not yet using them.\nWe will also cover the usethisworkflow to create an RStudio Project.\nRStudio Projects make it easy to manage working directories and paths because they set the working directory to the RStudio Projects directory automatically."
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#rstudio-projects-1",
+ "href": "core/week-2-old/study_before_workshop.html#rstudio-projects-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "RStudio Projects",
+ "text": "RStudio Projects\n\n\n\n-- stem_cell_rna\n |__stem_cell_rna.Rproj \n |__raw_ data/ \n |__2019-03-21_donor_1.csv\n |__README. md\n |__R/\n |__01_data_processing.R\n |__02_exploratory.R\n |__functions/\n |__theme_volcano.R\n |__normalise.R\n\n\nThe project directory is the folder at the top 1\n\nThanks to Mine Çetinkaya-Rundel who helped me work out how to highlight a line https://gist.github.com/mine-cetinkaya-rundel/3af3415eab70a65be3791c3dcff6e2e3. Note to futureself: the engine: knitr matters."
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#rstudio-projects-2",
+ "href": "core/week-2-old/study_before_workshop.html#rstudio-projects-2",
+ "title": "Independent Study to prepare for workshop",
+ "section": "RStudio Projects",
+ "text": "RStudio Projects\n\n\n\n-- stem_cell_rna\n |__stem_cell_rna.Rproj \n |__raw_ data/ \n |__2019-03-21_donor_1.csv\n |__README. md\n |__R/\n |__01_data_processing.R\n |__02_exploratory.R\n |__functions/\n |__theme_volcano.R\n |__normalise.R\n\n\nthe .RProj file is directly under the project folder. Its presence is what makes the folder an RStudio Project"
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#rstudio-projects-3",
+ "href": "core/week-2-old/study_before_workshop.html#rstudio-projects-3",
+ "title": "Independent Study to prepare for workshop",
+ "section": "RStudio Projects",
+ "text": "RStudio Projects\n\n\nWhen you open an RStudio Project, the working directory is set to the Project directory (i.e., the location of the .Rproj file).\nWhen you use an RStudio Project you do not need to use setwd()\nWhen someone, including future you, opens the project on another machine, all the paths just work."
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#rstudio-projects-4",
+ "href": "core/week-2-old/study_before_workshop.html#rstudio-projects-4",
+ "title": "Independent Study to prepare for workshop",
+ "section": "RStudio Projects",
+ "text": "RStudio Projects\n\nJenny BryanIn the words of Jenny Bryan:\n\n“If the first line of your R script is setwd(”C:/Users/jenny/path/that/only/I/have”) I will come into your office and SET YOUR COMPUTER ON FIRE”"
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#creating-an-rstudio-project",
+ "href": "core/week-2-old/study_before_workshop.html#creating-an-rstudio-project",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Creating an RStudio Project",
+ "text": "Creating an RStudio Project\nThere are two ways to create an RStudio Project.\n\nUsing one of the two menus\nUsing the usethis package"
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#using-a-menu",
+ "href": "core/week-2-old/study_before_workshop.html#using-a-menu",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Using a menu",
+ "text": "Using a menu\nThere are two menus:\n\nTop left, File menu\nTop Right, drop-down indicated by the .RProj icon\n\nThey both do the same thing.\nIn both cases you choose: New Project | New Directory | New Project\n\nMake sure you “Browse” to the folder you want to create the project."
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-1",
+ "href": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Using the usethis package",
+ "text": "Using the usethis package\nI occasionally use the menu but I mostly use the usethis package.\n\n🎬 Go to RStudio and check your working directory:\n\ngetwd()\n\n\"C:/Users/er13/Desktop\"\n\n\n❔ Is your working directory a good place to create a Project folder?"
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-2",
+ "href": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-2",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Using the usethis package",
+ "text": "Using the usethis package\nIf this is a good place to create a Project directory then…\n🎬 Create a project with:\n\nusethis::create_project(\"bananas\")"
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-3",
+ "href": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-3",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Using the usethis package",
+ "text": "Using the usethis package\nOtherwise\nIf you want the project directory elsewhere, you will need to give the relative path, e.g.\n\nusethis::create_project(\"../Documents/bananas\")"
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-4",
+ "href": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-4",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Using the usethis package",
+ "text": "Using the usethis package\nThe output will look like this and a new RStudio session will start.\n> usethis::create_project(\"bananas\")\n√ Creating 'bananas/'\n√ Setting active project to 'C:/Users/er13/Desktop/bananas'\n√ Creating 'R/'\n√ Writing 'bananas.Rproj'\n√ Adding '.Rproj.user' to '.gitignore'\n√ Opening 'C:/Users/er13/Desktop/bananas/' in new RStudio session\n√ Setting active project to '<no active project>'"
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-5",
+ "href": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-5",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Using the usethis package",
+ "text": "Using the usethis package\nWhen you create a new RStudio Project with usethis:\n\n\nA folder called bananas/ is created\nRStudio starts a new session in bananas/ i.e., your working directory is now bananas/\n\nA folder called R/ is created\nA file called bananas.Rproj is created\nA file called .gitignore is created\nA hidden directory called .Rproj.user is created"
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-6",
+ "href": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-6",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Using the usethis package",
+ "text": "Using the usethis package\n\n\nthe .Rproj file is what makes the directory an RStudio Project\nthe Rproj.user directory is where project-specific temporary files are stored. You don’t need to mess with it.\nthe .gitignore is used for version controlled projects. If not using git, you can ignore it."
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#opening-and-closing",
+ "href": "core/week-2-old/study_before_workshop.html#opening-and-closing",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Opening and closing",
+ "text": "Opening and closing\nYou can close an RStudio Project with ONE of:\n\nFile | Close Project\nUsing the drop-down option on the far right of the tool bar where you see the Project name\n\n\nYou can open an RStudio Project with ONE of:\n\nFile | Open Project or File | Recent Projects\n\nUsing the drop-down option on the far right of the tool bar where you see the Project name\n\nDouble-clicking an .Rproj file from your file explorer/finder\n\nWhen you open project, a new R session starts."
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-7",
+ "href": "core/week-2-old/study_before_workshop.html#using-the-usethis-package-7",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Using the usethis package",
+ "text": "Using the usethis package\nOnce the RStudio project has been created, usethis helps you follow good practice.\n\n🎬 We can add a README with:\n\nusethis::use_readme_md()\n\n\n\nThis creates a file called README.md, with a little default text, in the Project directory and opens it for editing.\n\n\nmd stands for markdown, it is a extremely widely used text formatting language which is readable as plain text. If you have ever used asterisks to make text bold or italic, you have used markdown."
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#code-formatting-and-style-1",
+ "href": "core/week-2-old/study_before_workshop.html#code-formatting-and-style-1",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Code formatting and style",
+ "text": "Code formatting and style\n\n“Good coding style is like correct punctuation: you can manage without it, butitsuremakesthingseasiertoread.”\n\nThe tidyverse style guide"
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#code-formatting-and-style-2",
+ "href": "core/week-2-old/study_before_workshop.html#code-formatting-and-style-2",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Code formatting and style",
+ "text": "Code formatting and style\nWe have all written code which is hard to read!\nWe all improve over time.\n\n\n\nThe only way to write good code is to write tons of shitty code first. Feeling shame about bad code stops you from getting to good code— Hadley Wickham (@hadleywickham) April 17, 2015"
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#code-formatting-and-style-3",
+ "href": "core/week-2-old/study_before_workshop.html#code-formatting-and-style-3",
+ "title": "Independent Study to prepare for workshop",
+ "section": "Code formatting and style",
+ "text": "Code formatting and style\nSome keys points:\n\nbe consistent, emulate experienced coders\n\nuse snake_case for variable names (not CamelCase, dot.case)\n\nuse <- not = for assignment\n\nuse spacing around most operators and after commas\n\nuse indentation\n\navoid long lines, break up code blocks with new lines\n\nuse \" for quoting text (not ') unless the text contains double quotes"
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#ugly-code",
+ "href": "core/week-2-old/study_before_workshop.html#ugly-code",
+ "title": "Independent Study to prepare for workshop",
+ "section": "😩 Ugly code 😩",
+ "text": "😩 Ugly code 😩\n\ndata<-read_csv('../data-raw/Y101_Y102_Y201_Y202_Y101-5.csv',skip=2)\nlibrary(janitor);sol<-clean_names(data)\ndata=data|>filter(str_detect(description,\"OS=Homo sapiens\"))|>filter(x1pep=='x')\ndata=data|>\nmutate(g=str_extract(description,\n\"GN=[^\\\\s]+\")|>str_replace(\"GN=\",''))\ndata<-data|>mutate(id=str_extract(accession,\"1::[^;]+\")|>str_replace(\"1::\",\"\"))"
+ },
+ {
+ "objectID": "core/week-2-old/study_before_workshop.html#ugly-code-1",
+ "href": "core/week-2-old/study_before_workshop.html#ugly-code-1",
"title": "Independent Study to prepare for workshop",
- "section": "🍂",
- "text": "🍂\nEither of the other examples.",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
- ]
+ "section": "😩 Ugly code 😩",
+ "text": "😩 Ugly code 😩\n\nno spacing or indentation\ninconsistent splitting of code blocks over lines\ninconsistent use of quote characters\nno comments\nvariable names convey no meaning\nuse of = for assignment and inconsistently\nmultiple commands on a line\nlibrary statement in the middle of the analysis"
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#if-you-do-not-have-those",
- "href": "transcriptomics/week-4/study_before_workshop.html#if-you-do-not-have-those",
+ "objectID": "core/week-2-old/study_before_workshop.html#cool-code",
+ "href": "core/week-2-old/study_before_workshop.html#cool-code",
"title": "Independent Study to prepare for workshop",
- "section": "If you do not have those",
- "text": "If you do not have those\nGo through:\n\nTranscriptomics 1: 👋 Hello data! Workshop including:\n🤗 Look after future you! and\nthe Independent Study to consolidate",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
- ]
+ "section": "😎 Cool code 😎",
+ "text": "😎 Cool code 😎\n\n# Packages ----------------------------------------------------------------\nlibrary(tidyverse)\nlibrary(janitor)\n\n# Import ------------------------------------------------------------------\n\n# define file name\nfile <- \"../data-raw/Y101_Y102_Y201_Y202_Y101-5.csv\"\n\n# import: column headers and data are from row 3\nsolu_protein <- read_csv(file, skip = 2) |>\n janitor::clean_names()\n\n# Tidy data ----------------------------------------------------------------\n\n# filter out the bovine proteins and those proteins \n# identified from fewer than 2 peptides\nsolu_protein <- solu_protein |>\n filter(str_detect(description, \"OS=Homo sapiens\")) |>\n filter(x1pep == \"x\")\n\n# Extract the genename from description column to a column\n# of its own\nsolu_protein <- solu_protein |>\n mutate(genename = str_extract(description,\"GN=[^\\\\s]+\") |>\n str_replace(\"GN=\", \"\"))\n\n# Extract the top protein identifier from accession column (first\n# Uniprot ID after \"1::\") to a column of its own\nsolu_protein <- solu_protein |>\n mutate(protid = str_extract(accession, \"1::[^;]+\") |>\n str_replace(\"1::\", \"\"))"
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#differential-expression-1",
- "href": "transcriptomics/week-4/study_before_workshop.html#differential-expression-1",
+ "objectID": "core/week-2-old/study_before_workshop.html#cool-code-1",
+ "href": "core/week-2-old/study_before_workshop.html#cool-code-1",
"title": "Independent Study to prepare for workshop",
- "section": "Differential expression",
- "text": "Differential expression\n\n\nThe goal of differential expression is to test whether there is a significant difference in gene expression between groups.\nA large number of computational methods have been developed for differential expression analysis\nR is the leading language for differential expression analysis",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
- ]
+ "section": "😎 Cool code 😎",
+ "text": "😎 Cool code 😎\n\nlibrary() calls collected\nUses code sections to make it easier to navigate\nUses white space and proper indentation\nCommented\nUses more informative name for the dataframe"
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#differential-expression-2",
- "href": "transcriptomics/week-4/study_before_workshop.html#differential-expression-2",
+ "objectID": "core/week-2-old/study_before_workshop.html#code-algorithmically-1",
+ "href": "core/week-2-old/study_before_workshop.html#code-algorithmically-1",
"title": "Independent Study to prepare for workshop",
- "section": "Differential expression",
- "text": "Differential expression\n\n\nthe statistical concepts are very similar to those you have already encountered in stages 1 and 2\nyou are essentially doing paired- or independent-samples tests\nbut you are doing a lot of them! One for every gene\ndata need normalisation before comparison",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
- ]
+ "section": "Code ‘algorithmically’",
+ "text": "Code ‘algorithmically’\n\n\nWrite code which expresses the structure of the problem/solution.\nAvoid hard coding numbers if at all possible - declare variables instead\nDeclare frequently used values as variables at the start e.g., colour schemes, figure saving settings"
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#statistical-concepts",
- "href": "transcriptomics/week-4/study_before_workshop.html#statistical-concepts",
+ "objectID": "core/week-2-old/study_before_workshop.html#hard-coding-numbers.",
+ "href": "core/week-2-old/study_before_workshop.html#hard-coding-numbers.",
"title": "Independent Study to prepare for workshop",
- "section": "Statistical concepts",
- "text": "Statistical concepts\nLike familiar tests:\n\n\nthe type of test (the function) you use depends on the type of data you have and the type of assumptions you want to make\nthe tests work by comparing the variation between groups to the variation within groups.\nyou will get: the difference between groups, a test statistic, and a p-value\nyou also get an adjusted p-value which is the ‘correction’ for multiple testing",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
- ]
+ "section": "😩 Hard coding numbers.",
+ "text": "😩 Hard coding numbers.\n\n\nSuppose we want to calculate the sums of squares, \\(SS(x)\\), for the number of eggs in five nests.\nThe formula is given by: \\(\\sum (x_i- \\bar{x})^2\\)\nWe could calculate the mean and copy it, and the individual numbers into the formula"
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#the-difference-between-groups",
- "href": "transcriptomics/week-4/study_before_workshop.html#the-difference-between-groups",
+ "objectID": "core/week-2-old/study_before_workshop.html#hard-coding-numbers.-1",
+ "href": "core/week-2-old/study_before_workshop.html#hard-coding-numbers.-1",
"title": "Independent Study to prepare for workshop",
- "section": "The difference between groups",
- "text": "The difference between groups\n\n\nThe difference between groups is given as the log2 fold change in expression between groups\nA fold change is the expression in one group divided by the expression in the other group\nwe use fold changes because the absolute expression values may not be accurate and relative changes are what matters\nwe use log2 fold changes because they are symmetrical around 0",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
- ]
+ "section": "😩 Hard coding numbers.",
+ "text": "😩 Hard coding numbers.\n\n# mean number of eggs per nest\nsum(3, 5, 6, 7, 8) / 5\n\n[1] 5.8\n\n# ss(x) of number of eggs\n(3 - 5.8)^2 + (5 - 5.8)^2 + (6 - 5.8)^2 + (7 - 5.8)^2 + (8 - 5.8)^2\n\n[1] 14.8\n\n\nI am coding the calculation of the mean rather using the mean() function only to explain what ‘coding algorithmically’ means using a simple example."
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#log2-fold-change",
- "href": "transcriptomics/week-4/study_before_workshop.html#log2-fold-change",
+ "objectID": "core/week-2-old/study_before_workshop.html#hard-coding-numbers",
+ "href": "core/week-2-old/study_before_workshop.html#hard-coding-numbers",
"title": "Independent Study to prepare for workshop",
- "section": "log2 fold change",
- "text": "log2 fold change\n\n\nlog2 means log to the base 2\nSuppose the expression in group A is 5 and the expression in group B is 8\nA/B = 5/8 = 0.625 and B/A = 8/5 = 1.6\nIf B is greater than A the range of A/B is 0 to 1 but the range of B/A is 1 to infinity\nHowever, if we take the log2 of A/B we get -0.678 and the log2 of B/A is 0.678.",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
- ]
+ "section": "😩 Hard coding numbers",
+ "text": "😩 Hard coding numbers\n\n\nif any of the sample numbers must be altered, all the code needs changing\nit is hard to tell that the output of the first line is a mean\nits hard to recognise that the numbers in the mean calculation correspond to those in the next calculation\nit is hard to tell that 5 is just the number of nests\nno way of know if numbers are the same by coincidence or they refer to the same thing"
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#adjusted-p-value",
- "href": "transcriptomics/week-4/study_before_workshop.html#adjusted-p-value",
+ "objectID": "core/week-2-old/study_before_workshop.html#better",
+ "href": "core/week-2-old/study_before_workshop.html#better",
"title": "Independent Study to prepare for workshop",
- "section": "Adjusted p-value",
- "text": "Adjusted p-value\n\n\nThe p-value has to be adjusted because of the number of tested being done\nIn stage 1, we used Tukey’s HSD to adjust for multiple testing following an ANOVA\nHere the Benjamini-Hochberg procedure (Benjamini and Hochberg 1995) is used to adjust for multiple testing\nBH controls the False Discovery Rate (FDR)\nThe FDR is the proportion of false positives among the genes called significant",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
- ]
+ "section": "😎 Better",
+ "text": "😎 Better\n\n# eggs each nest\neggs <- c(3, 5, 6, 7, 8)\n\n# mean eggs per nest\nmean_eggs <- sum(eggs) / length(eggs)\n\n# ss(x) of number of eggs\nsum((eggs - mean_eggs)^2)\n\n[1] 14.8"
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#normalisation",
- "href": "transcriptomics/week-4/study_before_workshop.html#normalisation",
+ "objectID": "core/week-2-old/study_before_workshop.html#better-1",
+ "href": "core/week-2-old/study_before_workshop.html#better-1",
"title": "Independent Study to prepare for workshop",
- "section": "Normalisation",
- "text": "Normalisation\n\n\nNormalisation adjusts raw counts to account for factors that prevent direct comparisons\nNormalisation usually influences the experimental design as well as the analysis\nThe 🐭 mouse data have been normalised to simplify the analysis for you; the 🐸 frog data have not but the DE method will do this for you.\nNormalisation is a big topic. See Düren, Lederer, and Qin (2022); Bullard et al. (2010); Lytal, Ran, and An (2020); Abrams et al. (2019); Vallejos et al. (2017); Evans, Hardin, and Stoebel (2017)",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
- ]
+ "section": "😎 Better",
+ "text": "😎 Better\n\n\nthe commenting is similar but it is easier to follow\nif any of the sample numbers must be altered, only that number needs changing\nassigning a value you will later use to a variable with a meaningful name allows us to understand the first and second calculations\nmakes use of R’s elementwise calculation which resembles the formula (i.e., is expressed as the general rule)"
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#type-of-test-the-function",
- "href": "transcriptomics/week-4/study_before_workshop.html#type-of-test-the-function",
+ "objectID": "core/week-2-old/study_before_workshop.html#summary",
+ "href": "core/week-2-old/study_before_workshop.html#summary",
"title": "Independent Study to prepare for workshop",
- "section": "Type of test (the function)",
- "text": "Type of test (the function)\n\n\nA large number of computational methods have been developed for differential expression analysis\nMethods vary in the types of normalisation they do, the statistical model they use, and the assumptions they make\nSome of the most well-known methods are provided by: DESeq2 (Love, Huber, and Anders 2014), edgeR (Robinson, McCarthy, and Smyth 2010; McCarthy, Chen, and Smyth 2012; Chen, Lun, and Smyth 2016), limma (Ritchie et al. 2015) and scran (Lun, McCarthy, and Marioni 2016)",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
- ]
+ "section": "Summary",
+ "text": "Summary\n\n\nUse an RStudio project for any R work (you can also incorporate other languages)\nWrite Cool code not Ugly code: space, consistency, indentation, comments, meaningful variable names\nWrite code which expresses the structure of the problem/solution.\nAvoid hard coding numbers if at all possible - declare variables instead"
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#type-of-test-the-function-1",
- "href": "transcriptomics/week-4/study_before_workshop.html#type-of-test-the-function-1",
+ "objectID": "core/week-2-old/study_before_workshop.html#references",
+ "href": "core/week-2-old/study_before_workshop.html#references",
"title": "Independent Study to prepare for workshop",
- "section": "Type of test (the function)",
- "text": "Type of test (the function)\n\n\n\nDESeq2 and edgeR\n\nboth require raw counts as input\nboth assume that most genes are not DE\nboth use a negative binomial distribution1 to model the data\nuse slightly different normalisation methods: DESeq2 uses the median of ratios method; edgeR uses the trimmed mean of M values (TMM) method\n\n\n\n\nA discrete distribution for counts, similar to the Poisson distribution",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
- ]
+ "section": "References",
+ "text": "References\n\n\n\n🔗 About Core 2: File types, workflow tips and other tools\n\n\n\n\nBryan, Jennifer. 2018. “Excuse Me, Do You Have a Moment to Talk about Version Control?” Am. Stat. 72 (1): 20–27. https://doi.org/10.1080/00031305.2017.1399928.\n\n\nBryan, Jennifer, Jim Hester, Shannon Pileggi, and E. David Aja. n.d. What They Forgot to Teach You about r. https://rstats.wtf/.\n\n\nSandve, Geir Kjetil, Anton Nekrutenko, James Taylor, and Eivind Hovig. 2013. “Ten Simple Rules for Reproducible Computational Research.” PLoS Comput. Biol. 9 (10): e1003285. https://doi.org/10.1371/journal.pcbi.1003285.\n\n\nWilson, Greg, Jennifer Bryan, Karen Cranston, Justin Kitzes, Lex Nederbragt, and Tracy K Teal. 2017. “Good Enough Practices in Scientific Computing.” PLoS Comput. Biol. 13 (6): e1005510. https://doi.org/10.1371/journal.pcbi.1005510."
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#type-of-test-the-function-2",
- "href": "transcriptomics/week-4/study_before_workshop.html#type-of-test-the-function-2",
- "title": "Independent Study to prepare for workshop",
- "section": "Type of test (the function)",
- "text": "Type of test (the function)\n\n\nscran\n\nworks on normalized log-expression values\nperforms Welch t-tests",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
- ]
+ "objectID": "core/week-1-old/overview.html",
+ "href": "core/week-1-old/overview.html",
+ "title": "Overview",
+ "section": "",
+ "text": "This week you will revise some essential concepts for scientific computing: file system organisation, file types, working directories and paths. The workshop will cover a rationale for working reproducibly, project oriented workflow, naming things and documenting your work. We will also examine some file types and the concept of tidy data.\n\nLearning objectives\nThe successful student will be able to:\n\nexplain the organisation of files and directories in a file systems including root, home and working directories\nexplain absolute and relative file paths\nexplain why working reproducibly is important\nknow how to use a project-oriented workflow to organise work\nbe able to give files human- and machine-readable names\noutline some common biological data file formats\n\n\n\nInstructions\n\nPrepare\n\n📖 Read Understanding file systems\n\nWorkshop\nConsolidate"
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#meta-data",
- "href": "transcriptomics/week-4/study_before_workshop.html#meta-data",
+ "objectID": "core/week-1-old/study_before_workshop.html",
+ "href": "core/week-1-old/study_before_workshop.html",
"title": "Independent Study to prepare for workshop",
- "section": "Meta data",
- "text": "Meta data\n\n\nDE methods require two types of data: the expression data and the meta data\nThe meta data is the information about the samples\nIt says which samples (columns) are in which group (s)\nIt is usually stored in a separate file",
- "crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
- ]
+ "section": "",
+ "text": "📖 Read Understanding file systems. This is an approximately 15 - 20 minute read revising file types and filesystems. It covers concepts of working directories and paths. We learned these ideas in stage 1 and you may feel completely confident with them but many students will benefit from a refresher. For BIO00070M students, this is part of the work you will also be asked to complete for BIO00052M Data Analysis in R.\nIn previous years you have submitted and RStudio Project as part of your BABS work. In this module you will develop this by submitting a Research Compendium. A Research Compendium is a documented collection of all the digital parts of the research project including data (or access to data), code and outputs. The Compendium might be a single Quarto/RStudio Project, (like you have done previously but with better documentation) or it might be a folder including an Quarto/RStudio Project and other material/scripts including the description of unscripted processing. You might want to remind yourself of the example RStudio Project, Y12345678.zip used in BABS 2."
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#data",
- "href": "transcriptomics/week-4/study_before_workshop.html#data",
- "title": "Independent Study to prepare for workshop",
- "section": "🐸 Data",
- "text": "🐸 Data\n\nExpression for the whole transcriptome X. laevis v10.1 genome assembly\nValues are raw counts\nThe statistical analysis method we will use DESeq2 (Love, Huber, and Anders 2014) requires raw counts and performs the normalisation itself",
+ "objectID": "core/week-6/overview.html",
+ "href": "core/week-6/overview.html",
+ "title": "Overview",
+ "section": "",
+ "text": "This week you will revise some essential concepts for scientific computing: file system organisation, file types, working directories and paths. The workshop will cover a rationale for working reproducibly, project oriented workflow, naming things and documenting your work. We will also examine some file types and the concept of tidy data.\n\nLearning objectives\nThe successful student will be able to:\n\nexplain the organisation of files and directories in a file systems including root, home and working directories\nexplain absolute and relative file paths\nexplain why working reproducibly is important\nknow how to use a project-oriented workflow to organise work\nbe able to give files human- and machine-readable names\noutline some common biological data file formats\n\n\n\nInstructions\n\nPrepare\n\n📖 Read Understanding file systems\n\nWorkshop\nConsolidate",
"crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
+ "About"
]
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#data-1",
- "href": "transcriptomics/week-4/study_before_workshop.html#data-1",
+ "objectID": "core/week-6/study_before_workshop.html",
+ "href": "core/week-6/study_before_workshop.html",
"title": "Independent Study to prepare for workshop",
- "section": "🐭 Data",
- "text": "🐭 Data\n\nExpression for a subset of genes, the surfaceome\nValues are log2 normalised values\nThe statistical analysis method we will use scran (Lun, McCarthy, and Marioni 2016) requires normalised values",
+ "section": "",
+ "text": "📖 Read Understanding file systems. This is an approximately 15 - 20 minute read revising file types and filesystems. It covers concepts of working directories and paths. We learned these ideas in stage 1 and you may feel completely confident with them but many students will benefit from a refresher. For BIO00070M students, this is part of the work you will also be asked to complete for BIO00052M Data Analysis in R.\nIn previous years you have submitted and RStudio Project as part of your BABS work. In this module you will develop this by submitting a Research Compendium. A Research Compendium is a documented collection of all the digital parts of the research project including data (or access to data), code and outputs. The Compendium might be a single Quarto/RStudio Project, (like you have done previously but with better documentation) or it might be a folder including an Quarto/RStudio Project and other material/scripts including the description of unscripted processing. You might want to remind yourself of the example RStudio Project, Y12345678.zip used in BABS 2.",
"crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
+ "Core Supporting Info",
+ "Week 6: Supporting Information 2",
"Prepare!"
]
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#packages-to-install-before-the-workshop",
- "href": "transcriptomics/week-4/study_before_workshop.html#packages-to-install-before-the-workshop",
- "title": "Independent Study to prepare for workshop",
- "section": "Packages to install before the workshop",
- "text": "Packages to install before the workshop\nBiocManager from CRAN in the the normal way and set the version of Bioconductor packages to install:\n\ninstall.packages(\"BiocManager\")\nBiocManager::install(version = \"3.19\")\n\nDESeq2 from Bioconductor using BiocManager:\n\nBiocManager::install(\"DESeq2\")\n\nscran from Bioconductor using BiocManager:\n\nBiocManager::install(\"scran\")",
+ "objectID": "core/core.html",
+ "href": "core/core.html",
+ "title": "Core: Supporting Information",
+ "section": "",
+ "text": "futureself, CC-BY-NC, by Julen Colomb\n\n\nThere are two workshops taken by everyone on BIO00088H. These are in weeks 2 and 6. These are important in understanding both how to assemble, curate and document your “Supporting Information” and how to work reproducibly so future you (Spring semester you) can painlessly work with past you and your work is demonstrably repeatable. This is essential because you will want to be able to set work aside for holidays and assessment periods and then restart easily. The Supporting Information you submit with your Report will be be assessed on its organisation, reproducibility and documentation.\nBIO00070M students do week 1 and 6 of the core workshops along with weeks 3, 4 and 5 of transcriptomics.\n\n\nWhy reproducibility matters, project-oriented workflow, organisation and naming things. You will also learn how to recognise and write cool 😎 code, not 😩 ugly code and code algorithmically and discover some awesome short cuts to help you write cool 😎 code.\n\n\n\nDocumenting your Supporting Information with a read me and appropriate code commenting, curating code, non-coded processing",
"crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
+ "Core Supporting Info",
+ "Core: Supporting Information"
]
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#workshops-1",
- "href": "transcriptomics/week-4/study_before_workshop.html#workshops-1",
- "title": "Independent Study to prepare for workshop",
- "section": "Workshops",
- "text": "Workshops\n\nTranscriptomics 1: Hello data Getting to know the data. Checking the distributions of values\nTranscriptomics 2: Statistical Analysis Identifying which genes are differentially expressed between treatments.\nTranscriptomics 3: Visualising and Interpreting. PCA, Volcano plots and heatmaps to visualise results. Interpreting the results and finding out more about genes of interest.",
+ "objectID": "core/core.html#week-1-core-supporting-information-1",
+ "href": "core/core.html#week-1-core-supporting-information-1",
+ "title": "Core: Supporting Information",
+ "section": "",
+ "text": "Why reproducibility matters, project-oriented workflow, organisation and naming things. You will also learn how to recognise and write cool 😎 code, not 😩 ugly code and code algorithmically and discover some awesome short cuts to help you write cool 😎 code.",
"crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
+ "Core Supporting Info",
+ "Core: Supporting Information"
]
},
{
- "objectID": "transcriptomics/week-4/study_before_workshop.html#references",
- "href": "transcriptomics/week-4/study_before_workshop.html#references",
- "title": "Independent Study to prepare for workshop",
- "section": "References",
- "text": "References\nPages made with R (R Core Team 2024), Quarto (Allaire et al. 2024), knitr [Xie (2024); knitr2; knitr3], kableExtra (Zhu 2021)\n\n\n\n🔗 About Transcriptomics 2: Statistical Analysis\n\n\n\n\nAbrams, Zachary B., Travis S. Johnson, Kun Huang, Philip R. O. Payne, and Kevin Coombes. 2019. “A Protocol to Evaluate RNA Sequencing Normalization Methods.” BMC Bioinformatics 20 (24): 679. https://doi.org/10.1186/s12859-019-3247-x.\n\n\nAllaire, J. J., Charles Teague, Carlos Scheidegger, Yihui Xie, and Christophe Dervieux. 2024. “Quarto.” https://doi.org/10.5281/zenodo.5960048.\n\n\nBenjamini, Yoav, and Yosef Hochberg. 1995. “Controlling the False Discovery Rate: A Practical and Powerful Approach to Multiple Testing.” J. R. Stat. Soc. Series B Stat. Methodol. 57 (1): 289–300. http://www.jstor.org/stable/2346101.\n\n\nBullard, James H., Elizabeth Purdom, Kasper D. Hansen, and Sandrine Dudoit. 2010. “Evaluation of Statistical Methods for Normalization and Differential Expression in mRNA-Seq Experiments.” BMC Bioinformatics 11 (1): 94. https://doi.org/10.1186/1471-2105-11-94.\n\n\nChen, Yunshun, Aaron T. L. Lun, and Gordon K. Smyth. 2016. “From Reads to Genes to Pathways: Differential Expression Analysis of RNA-Seq Experiments Using Rsubread and the edgeR Quasi-Likelihood Pipeline.” https://doi.org/10.12688/f1000research.8987.2.\n\n\nDüren, Yannick, Johannes Lederer, and Li-Xuan Qin. 2022. “Depth Normalization of Small RNA Sequencing: Using Data and Biology to Select a Suitable Method.” Nucleic Acids Research 50 (10): e56. https://doi.org/10.1093/nar/gkac064.\n\n\nEvans, Ciaran, Johanna Hardin, and Daniel M Stoebel. 2017. “Selecting Between-Sample RNA-Seq Normalization Methods from the Perspective of Their Assumptions.” Briefings in Bioinformatics 19 (5): 776–92. https://doi.org/10.1093/bib/bbx008.\n\n\nLove, Michael I., Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-Seq Data with DESeq2.” Genome Biology 15: 550. https://doi.org/10.1186/s13059-014-0550-8.\n\n\nLun, Aaron T. L., Davis J. McCarthy, and John C. Marioni. 2016. “A Step-by-Step Workflow for Low-Level Analysis of Single-Cell RNA-Seq Data with Bioconductor.” F1000Res. 5: 2122. https://doi.org/10.12688/f1000research.9501.2.\n\n\nLytal, Nicholas, Di Ran, and Lingling An. 2020. “Normalization Methods on Single-Cell RNA-Seq Data: An Empirical Survey.” Frontiers in Genetics 11. https://www.frontiersin.org/articles/10.3389/fgene.2020.00041.\n\n\nMcCarthy, Davis J., Yunshun Chen, and Gordon K. Smyth. 2012. “Differential Expression Analysis of Multifactor RNA-Seq Experiments with Respect to Biological Variation.” Nucleic Acids Research 40 (10): 4288–97. https://doi.org/10.1093/nar/gks042.\n\n\nR Core Team. 2024. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.\n\n\nRitchie, Matthew E., Belinda Phipson, Di Wu, Yifang Hu, Charity W. Law, Wei Shi, and Gordon K. Smyth. 2015. “Limma Powers Differential Expression Analyses for RNA-Sequencing and Microarray Studies.” Nucleic Acids Research 43 (7): e47. https://doi.org/10.1093/nar/gkv007.\n\n\nRobinson, Mark D., Davis J. McCarthy, and Gordon K. Smyth. 2010. “edgeR: A Bioconductor Package for Differential Expression Analysis of Digital Gene Expression Data.” Bioinformatics 26 (1): 139–40. https://doi.org/10.1093/bioinformatics/btp616.\n\n\nVallejos, Catalina A., Davide Risso, Antonio Scialdone, Sandrine Dudoit, and John C. Marioni. 2017. “Normalizing Single-Cell RNA Sequencing Data: Challenges and Opportunities.” Nature Methods 14 (6): 565–71. https://doi.org/10.1038/nmeth.4292.\n\n\nXie, Yihui. 2024. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.\n\n\nZhu, Hao. 2021. “kableExtra: Construct Complex Table with ’Kable’ and Pipe Syntax.” https://CRAN.R-project.org/package=kableExtra.",
+ "objectID": "core/core.html#week-6-core-supporting-information-2",
+ "href": "core/core.html#week-6-core-supporting-information-2",
+ "title": "Core: Supporting Information",
+ "section": "",
+ "text": "Documenting your Supporting Information with a read me and appropriate code commenting, curating code, non-coded processing",
"crumbs": [
- "Transcriptomics",
- "Week 4: Statistical Analysis",
- "Prepare!"
+ "Core Supporting Info",
+ "Core: Supporting Information"
]
},
{
- "objectID": "images/images.html",
- "href": "images/images.html",
- "title": "Image Data Analysis for Group Project",
+ "objectID": "core/week-6-old/workshop.html",
+ "href": "core/week-6-old/workshop.html",
+ "title": "Workshop",
"section": "",
- "text": "The following ImageJ workflow uses the processing steps you used in workshop 3 with one change. That change is to save the results to file rather than having the results window pop up and saving from there. Or maybe two changes: it also tells you to use meaning systematic file names that will be easy to process when importing data. The RStudio workflow shows you how to import multiple files into one dataframe with columns indicating the treatment.\n\nSave files with systematic names: ev_0.avi 343_0.avi ev_1.avi 343_1.avi ev_2.5.avi 343_2.5.avi\nOpen ImageJ\nOpen video file eg ev_2.5.avi\n\nConvert to 8-bit: Image | Type | 8-bit\nCrop to petri dish: Select then Image | Crop\nCalculate average pixel intensity: Image | Stacks | Z Project\n\nProjection type: Average Intensity to create AVG_ev_2.5.avi\n\n\n\nSubtract average from image: Process | Image Calculator\n\nImage 1: ev_2.5.avi\n\nOperation: Subtract\nImage 2: AVG_ev_2.5.avi\n\nCreate new window: checked\nOK, Yes to Process all\n\n\nInvert: Edit | Invert\nAdjust threshold: Image | Adjust | Threshold\n\nMethod: Default\nThresholding: Default, B&W\nDark background: checked\nAuto or adjust a little but make sure the larvae do not disappear at later points in the video (use the slider)\nApply\n\n\nInvert: Edit | Invert\nTrack: Plugins | wrMTrck\n\nSet minSize: 10\nSet maxSize: 400\nSet maxVelocity: 10\nSet maxAreaChange: 200\nSet bendThreshold: 1\n\nImportant: check Save Results File This is different to what you did in the workshop. It will help because the results will be saved automatically rather than to saving from the Results window that other pops up. Consequently, you will be able to save the results files with systematic names relating to their treatments and then read them into R simultaneously. That will also allow you to add information from the name of the file (which has the treatment information) to the resulting dataframes\n\n\nwrMTrck window with the settings listed above shown\n\n\nClick OK. Save to a folder for all the tracking data files. I recommend deleting the “Results of..” part of the name\n\n\nCheck that the Summary window indicates 3 tracks and that the 3 larvae are what is tracked by using the slider on the Result image\nRepeat for all videos\n\nThis is the code you need to import multiple csv files into a single dataframe and add a column with the treatment information from the file name. This is why systematic file names are good.\nIt assumes\n\nyour files are called type_concentration.txt for example: ev_0.txt 343_0.txt ev_1.txt 343_1.txt ev_2.5.txt 343_2.5.txt.\nthe .txt datafile are in a folder called track inside your working directory\nyou have installed the following packages: tidyverse, janitor\n\n\n🎬 Load the tidyverse\n\nlibrary(tidyverse)\n\n🎬 Put the file names into a vector we will iterate through\n\n# get a vector of the file names\nfiles <- list.files(path = \"track\", full.names = TRUE )\n\nWe can use map_df() from the purrr package which is one of the tidyverse gems loaded with tidyvserse. map_df() will iterate through files and read them into a dataframe with a specified import function. We are using read_table(). map_df() keeps track of the file by adding an index column called file to the resulting dataframe. Instead of this being a number (1 - 6 here) we can use set_names() to use the file names instead. The clean_names() function from the janitor package will clean up the column names (make them lower case, replace spaces with _ remove special characters etc)\n🎬 Import multiple csv files into one dataframe called tracking\n\n# import multiple data files into one dataframe called tracking\n# using map_df() from purrr package\n# clean the column names up using janitor::clean_names()\ntracking <- files |> \n set_names() |>\n map_dfr(read_table, .id = \"file\") |>\n janitor::clean_names()\n\nYou will get a warning Duplicated column names deduplicated: 'avgX' => 'avgX_1' [15] for each of the files because the csv files each have two columns called avgX. If you click on the tracking dataframe you see is contains the data from all the files.\nNow we can add columns for the type and the concentration by processing the values in the file. The values are like track/343_0.txt so we need to remove .txt and track/ and separate the remaining words into two columns.\n🎬 Process the file column to add columns for the type and the concentration\n\n# extract type and concentration from file name\n# and put them into additopnal separate columns\ntracking <- tracking |> \n mutate(file = str_remove(file, \".txt\")) |>\n mutate(file = str_remove(file, \"track/\")) |>\n extract(file, remove = \n FALSE,\n into = c(\"type\", \"conc\"), \n regex = \"([^_]{2,3})_(.+)\") \n\n[^_]{2,3} matches two or three characters that are not _ at the start of the string (^)\n.+ matches one or more characters. The extract() function puts the first match into the first column, type, and the second match into the second column, conc. The remove = FALSE argument means the original column is kept.\nYou now have a dataframe with all the tracking data which is relatively easy to summarise and plot using tools you know.\nThere is an example RStudio project containing this code here: tips. You can also download the project as a zip file from there but there is some code that will do that automatically for you. Since this is an RStudio Project, do not run the code from inside a project. You may want to navigate to a particular directory or edit the destdir:\n\nusethis::use_course(url = \"3mmaRand/tips\", destdir = \".\")\n\nYou can agree to deleting the zip. You should find RStudio restarts and you have a new project called tips-xxxxxx. The xxxxxx is a commit reference - you do not need to worry about that, it is just a way to tell you which version of the repo you downloaded. You can now run the code in the project.",
- "crumbs": [
- "Image Analysis",
- "Image Data Analysis for Group Project"
- ]
+ "text": "Use this session to ask any questions about Core 1 Organising reproducible data analyses and Core 2 File types, workflow tips and other tools in particular, or about R and RStudio in general. We will also try to answer any questions about the ’mics, Image and Structure strands.\n88H students might also review Stage 1 and 2 content to see if there are areas you might benefit from revisiting. You can access these through the past VLE sites but you might find it helpful to use the latest versions because there is no 2FA and the resources are searchable.\nStage 1\n\nData Analysis in R for Becoming a Bioscientist 1.Core concepts about scientific computing, types of variable, the role of variables in analysis and how to use RStudio to organise analysis and import, summarise and plot data.\nData Analysis in R for Becoming a Bioscientist 2. The logic of hypothesis testing, confidence intervals, what is meant by a statistical model, two-sample tests and one- and two-way analysis of variance (ANOVA).\n\nStage 2\n\nGet Introductory Statistical Tests as Linear models: A guide for R users\nA simple introduction to GLM for analysing Poisson and Binomial responses in R\n\n70M students might also review 52M content to see if there are areas you might benefit from revisiting. You can access these through the VLE site but you might find it helpful to use this link without 2FA.\n\n52M Data Analysis in R. Core concepts about scientific computing, types of variable, the role of variables in analysis and how to use RStudio to organise analysis and import, summarise and plot data, the logic of hypothesis testing, confidence intervals, what is meant by a statistical model, two-sample tests and one-way analysis of variance (ANOVA) and reproducible reports in Quarto.\n\nPages made with R (R Core Team 2024), Quarto (allaire2022?), knitr (knitr?), kableExtra (Zhu 2021)"
},
{
- "objectID": "images/images.html#worm-tracking",
- "href": "images/images.html#worm-tracking",
- "title": "Image Data Analysis for Group Project",
+ "objectID": "core/week-6-old/workshop.html#session-overview",
+ "href": "core/week-6-old/workshop.html#session-overview",
+ "title": "Workshop",
"section": "",
- "text": "The following ImageJ workflow uses the processing steps you used in workshop 3 with one change. That change is to save the results to file rather than having the results window pop up and saving from there. Or maybe two changes: it also tells you to use meaning systematic file names that will be easy to process when importing data. The RStudio workflow shows you how to import multiple files into one dataframe with columns indicating the treatment.\n\nSave files with systematic names: ev_0.avi 343_0.avi ev_1.avi 343_1.avi ev_2.5.avi 343_2.5.avi\nOpen ImageJ\nOpen video file eg ev_2.5.avi\n\nConvert to 8-bit: Image | Type | 8-bit\nCrop to petri dish: Select then Image | Crop\nCalculate average pixel intensity: Image | Stacks | Z Project\n\nProjection type: Average Intensity to create AVG_ev_2.5.avi\n\n\n\nSubtract average from image: Process | Image Calculator\n\nImage 1: ev_2.5.avi\n\nOperation: Subtract\nImage 2: AVG_ev_2.5.avi\n\nCreate new window: checked\nOK, Yes to Process all\n\n\nInvert: Edit | Invert\nAdjust threshold: Image | Adjust | Threshold\n\nMethod: Default\nThresholding: Default, B&W\nDark background: checked\nAuto or adjust a little but make sure the larvae do not disappear at later points in the video (use the slider)\nApply\n\n\nInvert: Edit | Invert\nTrack: Plugins | wrMTrck\n\nSet minSize: 10\nSet maxSize: 400\nSet maxVelocity: 10\nSet maxAreaChange: 200\nSet bendThreshold: 1\n\nImportant: check Save Results File This is different to what you did in the workshop. It will help because the results will be saved automatically rather than to saving from the Results window that other pops up. Consequently, you will be able to save the results files with systematic names relating to their treatments and then read them into R simultaneously. That will also allow you to add information from the name of the file (which has the treatment information) to the resulting dataframes\n\n\nwrMTrck window with the settings listed above shown\n\n\nClick OK. Save to a folder for all the tracking data files. I recommend deleting the “Results of..” part of the name\n\n\nCheck that the Summary window indicates 3 tracks and that the 3 larvae are what is tracked by using the slider on the Result image\nRepeat for all videos\n\nThis is the code you need to import multiple csv files into a single dataframe and add a column with the treatment information from the file name. This is why systematic file names are good.\nIt assumes\n\nyour files are called type_concentration.txt for example: ev_0.txt 343_0.txt ev_1.txt 343_1.txt ev_2.5.txt 343_2.5.txt.\nthe .txt datafile are in a folder called track inside your working directory\nyou have installed the following packages: tidyverse, janitor\n\n\n🎬 Load the tidyverse\n\nlibrary(tidyverse)\n\n🎬 Put the file names into a vector we will iterate through\n\n# get a vector of the file names\nfiles <- list.files(path = \"track\", full.names = TRUE )\n\nWe can use map_df() from the purrr package which is one of the tidyverse gems loaded with tidyvserse. map_df() will iterate through files and read them into a dataframe with a specified import function. We are using read_table(). map_df() keeps track of the file by adding an index column called file to the resulting dataframe. Instead of this being a number (1 - 6 here) we can use set_names() to use the file names instead. The clean_names() function from the janitor package will clean up the column names (make them lower case, replace spaces with _ remove special characters etc)\n🎬 Import multiple csv files into one dataframe called tracking\n\n# import multiple data files into one dataframe called tracking\n# using map_df() from purrr package\n# clean the column names up using janitor::clean_names()\ntracking <- files |> \n set_names() |>\n map_dfr(read_table, .id = \"file\") |>\n janitor::clean_names()\n\nYou will get a warning Duplicated column names deduplicated: 'avgX' => 'avgX_1' [15] for each of the files because the csv files each have two columns called avgX. If you click on the tracking dataframe you see is contains the data from all the files.\nNow we can add columns for the type and the concentration by processing the values in the file. The values are like track/343_0.txt so we need to remove .txt and track/ and separate the remaining words into two columns.\n🎬 Process the file column to add columns for the type and the concentration\n\n# extract type and concentration from file name\n# and put them into additopnal separate columns\ntracking <- tracking |> \n mutate(file = str_remove(file, \".txt\")) |>\n mutate(file = str_remove(file, \"track/\")) |>\n extract(file, remove = \n FALSE,\n into = c(\"type\", \"conc\"), \n regex = \"([^_]{2,3})_(.+)\") \n\n[^_]{2,3} matches two or three characters that are not _ at the start of the string (^)\n.+ matches one or more characters. The extract() function puts the first match into the first column, type, and the second match into the second column, conc. The remove = FALSE argument means the original column is kept.\nYou now have a dataframe with all the tracking data which is relatively easy to summarise and plot using tools you know.\nThere is an example RStudio project containing this code here: tips. You can also download the project as a zip file from there but there is some code that will do that automatically for you. Since this is an RStudio Project, do not run the code from inside a project. You may want to navigate to a particular directory or edit the destdir:\n\nusethis::use_course(url = \"3mmaRand/tips\", destdir = \".\")\n\nYou can agree to deleting the zip. You should find RStudio restarts and you have a new project called tips-xxxxxx. The xxxxxx is a commit reference - you do not need to worry about that, it is just a way to tell you which version of the repo you downloaded. You can now run the code in the project.",
- "crumbs": [
- "Image Analysis",
- "Image Data Analysis for Group Project"
- ]
+ "text": "Use this session to ask any questions about Core 1 Organising reproducible data analyses and Core 2 File types, workflow tips and other tools in particular, or about R and RStudio in general. We will also try to answer any questions about the ’mics, Image and Structure strands.\n88H students might also review Stage 1 and 2 content to see if there are areas you might benefit from revisiting. You can access these through the past VLE sites but you might find it helpful to use the latest versions because there is no 2FA and the resources are searchable.\nStage 1\n\nData Analysis in R for Becoming a Bioscientist 1.Core concepts about scientific computing, types of variable, the role of variables in analysis and how to use RStudio to organise analysis and import, summarise and plot data.\nData Analysis in R for Becoming a Bioscientist 2. The logic of hypothesis testing, confidence intervals, what is meant by a statistical model, two-sample tests and one- and two-way analysis of variance (ANOVA).\n\nStage 2\n\nGet Introductory Statistical Tests as Linear models: A guide for R users\nA simple introduction to GLM for analysing Poisson and Binomial responses in R\n\n70M students might also review 52M content to see if there are areas you might benefit from revisiting. You can access these through the VLE site but you might find it helpful to use this link without 2FA.\n\n52M Data Analysis in R. Core concepts about scientific computing, types of variable, the role of variables in analysis and how to use RStudio to organise analysis and import, summarise and plot data, the logic of hypothesis testing, confidence intervals, what is meant by a statistical model, two-sample tests and one-way analysis of variance (ANOVA) and reproducible reports in Quarto.\n\nPages made with R (R Core Team 2024), Quarto (allaire2022?), knitr (knitr?), kableExtra (Zhu 2021)"
+ },
+ {
+ "objectID": "core/week-6-old/study_after_workshop.html",
+ "href": "core/week-6-old/study_after_workshop.html",
+ "title": "Independent Study to consolidate this week",
+ "section": "",
+ "text": "There is no consolidation work other than to continue revising what you have learned over the course of your degree about data analysis."
}
]
\ No newline at end of file
diff --git a/site_libs/bootstrap/bootstrap.min.css b/site_libs/bootstrap/bootstrap.min.css
index 778557d..0081808 100644
--- a/site_libs/bootstrap/bootstrap.min.css
+++ b/site_libs/bootstrap/bootstrap.min.css
@@ -2,7 +2,7 @@
* Bootstrap v5.3.1 (https://getbootstrap.com/)
* Copyright 2011-2023 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
- */@import"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;700&display=swap";:root,[data-bs-theme=light]{--bs-blue: #2780e3;--bs-indigo: #6610f2;--bs-purple: #613d7c;--bs-pink: #e83e8c;--bs-red: #ff0039;--bs-orange: #f0ad4e;--bs-yellow: #ff7518;--bs-green: #3fb618;--bs-teal: #20c997;--bs-cyan: #9954bb;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #343a40;--bs-primary: #2780e3;--bs-secondary: #343a40;--bs-success: #3fb618;--bs-info: #9954bb;--bs-warning: #ff7518;--bs-danger: #ff0039;--bs-light: #f8f9fa;--bs-dark: #343a40;--bs-default-rgb: 52, 58, 64;--bs-primary-rgb: 39, 128, 227;--bs-secondary-rgb: 52, 58, 64;--bs-success-rgb: 63, 182, 24;--bs-info-rgb: 153, 84, 187;--bs-warning-rgb: 255, 117, 24;--bs-danger-rgb: 255, 0, 57;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 52, 58, 64;--bs-primary-text-emphasis: #10335b;--bs-secondary-text-emphasis: #15171a;--bs-success-text-emphasis: #19490a;--bs-info-text-emphasis: #3d224b;--bs-warning-text-emphasis: #662f0a;--bs-danger-text-emphasis: #660017;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #d4e6f9;--bs-secondary-bg-subtle: #d6d8d9;--bs-success-bg-subtle: #d9f0d1;--bs-info-bg-subtle: #ebddf1;--bs-warning-bg-subtle: #ffe3d1;--bs-danger-bg-subtle: #ffccd7;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #a9ccf4;--bs-secondary-border-subtle: #aeb0b3;--bs-success-border-subtle: #b2e2a3;--bs-info-border-subtle: #d6bbe4;--bs-warning-border-subtle: #ffc8a3;--bs-danger-border-subtle: #ff99b0;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #343a40;--bs-body-color-rgb: 52, 58, 64;--bs-body-bg: #fff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(52, 58, 64, 0.75);--bs-secondary-color-rgb: 52, 58, 64;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(52, 58, 64, 0.5);--bs-tertiary-color-rgb: 52, 58, 64;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #2761e3;--bs-link-color-rgb: 39, 97, 227;--bs-link-decoration: underline;--bs-link-hover-color: #1f4eb6;--bs-link-hover-color-rgb: 31, 78, 182;--bs-code-color: #7d12ba;--bs-highlight-bg: #ffe3d1;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.25rem;--bs-border-radius-sm: 0.2em;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(39, 128, 227, 0.25);--bs-form-valid-color: #3fb618;--bs-form-valid-border-color: #3fb618;--bs-form-invalid-color: #ff0039;--bs-form-invalid-border-color: #ff0039}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #7db3ee;--bs-secondary-text-emphasis: #85898c;--bs-success-text-emphasis: #8cd374;--bs-info-text-emphasis: #c298d6;--bs-warning-text-emphasis: #ffac74;--bs-danger-text-emphasis: #ff6688;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #081a2d;--bs-secondary-bg-subtle: #0a0c0d;--bs-success-bg-subtle: #0d2405;--bs-info-bg-subtle: #1f1125;--bs-warning-bg-subtle: #331705;--bs-danger-bg-subtle: #33000b;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #174d88;--bs-secondary-border-subtle: #1f2326;--bs-success-border-subtle: #266d0e;--bs-info-border-subtle: #5c3270;--bs-warning-border-subtle: #99460e;--bs-danger-border-subtle: #990022;--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #7db3ee;--bs-link-hover-color: #97c2f1;--bs-link-color-rgb: 125, 179, 238;--bs-link-hover-color-rgb: 151, 194, 241;--bs-code-color: white;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #8cd374;--bs-form-valid-border-color: #8cd374;--bs-form-invalid-color: #ff6688;--bs-form-invalid-border-color: #ff6688}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #e9ecef}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6)}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#343a40}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(52,58,64,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(52,58,64,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #343a40;--bs-table-bg: #fff;--bs-table-border-color: #dee2e6;--bs-table-accent-bg: transparent;--bs-table-striped-color: #343a40;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #343a40;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #343a40;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #b2bac1}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: #d4e6f9;--bs-table-border-color: #bfcfe0;--bs-table-striped-bg: #c9dbed;--bs-table-striped-color: #000;--bs-table-active-bg: #bfcfe0;--bs-table-active-color: #000;--bs-table-hover-bg: #c4d5e6;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: #d6d8d9;--bs-table-border-color: #c1c2c3;--bs-table-striped-bg: #cbcdce;--bs-table-striped-color: #000;--bs-table-active-bg: #c1c2c3;--bs-table-active-color: #000;--bs-table-hover-bg: #c6c8c9;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: #d9f0d1;--bs-table-border-color: #c3d8bc;--bs-table-striped-bg: #cee4c7;--bs-table-striped-color: #000;--bs-table-active-bg: #c3d8bc;--bs-table-active-color: #000;--bs-table-hover-bg: #c9dec1;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: #ebddf1;--bs-table-border-color: #d4c7d9;--bs-table-striped-bg: #dfd2e5;--bs-table-striped-color: #000;--bs-table-active-bg: #d4c7d9;--bs-table-active-color: #000;--bs-table-hover-bg: #d9ccdf;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: #ffe3d1;--bs-table-border-color: #e6ccbc;--bs-table-striped-bg: #f2d8c7;--bs-table-striped-color: #000;--bs-table-active-bg: #e6ccbc;--bs-table-active-color: #000;--bs-table-hover-bg: #ecd2c1;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: #ffccd7;--bs-table-border-color: #e6b8c2;--bs-table-striped-bg: #f2c2cc;--bs-table-striped-color: #000;--bs-table-active-bg: #e6b8c2;--bs-table-active-color: #000;--bs-table-hover-bg: #ecbdc7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: #dfe0e1;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #343a40;--bs-table-border-color: #484e53;--bs-table-striped-bg: #3e444a;--bs-table-striped-color: #fff;--bs-table-active-bg: #484e53;--bs-table-active-color: #fff;--bs-table-hover-bg: #43494e;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(52,58,64,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #dee2e6;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#343a40;background-color:#fff;border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(52,58,64,.75);opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#343a40;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e9ecef}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#343a40;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important}.form-control-color::-webkit-color-swatch{border:0 !important}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #dee2e6;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #343a40}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #fff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid #dee2e6;print-color-adjust:exact}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#2780e3;border-color:#2780e3}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#2780e3;border-color:#2780e3;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2393c0f1'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bed9f7}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0)}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#bed9f7}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(52,58,64,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(52,58,64,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#e9ecef}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid #dee2e6}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1)}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#3fb618}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#3fb618}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#3fb618;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#3fb618}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#3fb618}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#3fb618}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#3fb618}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#ff0039}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#ff0039}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ff0039;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#ff0039}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#ff0039}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#ff0039}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ff0039}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #343a40;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.25rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3136;--bs-btn-hover-border-color: #2a2e33;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a2e33;--bs-btn-active-border-color: #272c30;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #2780e3;--bs-btn-border-color: #2780e3;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #216dc1;--bs-btn-hover-border-color: #1f66b6;--bs-btn-focus-shadow-rgb: 71, 147, 231;--bs-btn-active-color: #fff;--bs-btn-active-bg: #1f66b6;--bs-btn-active-border-color: #1d60aa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2780e3;--bs-btn-disabled-border-color: #2780e3}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3136;--bs-btn-hover-border-color: #2a2e33;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a2e33;--bs-btn-active-border-color: #272c30;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #3fb618;--bs-btn-border-color: #3fb618;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #369b14;--bs-btn-hover-border-color: #329213;--bs-btn-focus-shadow-rgb: 92, 193, 59;--bs-btn-active-color: #fff;--bs-btn-active-bg: #329213;--bs-btn-active-border-color: #2f8912;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3fb618;--bs-btn-disabled-border-color: #3fb618}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #9954bb;--bs-btn-border-color: #9954bb;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #82479f;--bs-btn-hover-border-color: #7a4396;--bs-btn-focus-shadow-rgb: 168, 110, 197;--bs-btn-active-color: #fff;--bs-btn-active-bg: #7a4396;--bs-btn-active-border-color: #733f8c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #9954bb;--bs-btn-disabled-border-color: #9954bb}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #ff7518;--bs-btn-border-color: #ff7518;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #d96314;--bs-btn-hover-border-color: #cc5e13;--bs-btn-focus-shadow-rgb: 255, 138, 59;--bs-btn-active-color: #fff;--bs-btn-active-bg: #cc5e13;--bs-btn-active-border-color: #bf5812;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #ff7518;--bs-btn-disabled-border-color: #ff7518}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #ff0039;--bs-btn-border-color: #ff0039;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #d90030;--bs-btn-hover-border-color: #cc002e;--bs-btn-focus-shadow-rgb: 255, 38, 87;--bs-btn-active-color: #fff;--bs-btn-active-bg: #cc002e;--bs-btn-active-border-color: #bf002b;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #ff0039;--bs-btn-disabled-border-color: #ff0039}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #52585d;--bs-btn-hover-border-color: #484e53;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #5d6166;--bs-btn-active-border-color: #484e53;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-outline-default{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #2780e3;--bs-btn-border-color: #2780e3;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2780e3;--bs-btn-hover-border-color: #2780e3;--bs-btn-focus-shadow-rgb: 39, 128, 227;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2780e3;--bs-btn-active-border-color: #2780e3;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #2780e3;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2780e3;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #3fb618;--bs-btn-border-color: #3fb618;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3fb618;--bs-btn-hover-border-color: #3fb618;--bs-btn-focus-shadow-rgb: 63, 182, 24;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3fb618;--bs-btn-active-border-color: #3fb618;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #3fb618;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3fb618;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #9954bb;--bs-btn-border-color: #9954bb;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #9954bb;--bs-btn-hover-border-color: #9954bb;--bs-btn-focus-shadow-rgb: 153, 84, 187;--bs-btn-active-color: #fff;--bs-btn-active-bg: #9954bb;--bs-btn-active-border-color: #9954bb;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #9954bb;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #9954bb;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ff7518;--bs-btn-border-color: #ff7518;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #ff7518;--bs-btn-hover-border-color: #ff7518;--bs-btn-focus-shadow-rgb: 255, 117, 24;--bs-btn-active-color: #fff;--bs-btn-active-bg: #ff7518;--bs-btn-active-border-color: #ff7518;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ff7518;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ff7518;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #ff0039;--bs-btn-border-color: #ff0039;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #ff0039;--bs-btn-hover-border-color: #ff0039;--bs-btn-focus-shadow-rgb: 255, 0, 57;--bs-btn-active-color: #fff;--bs-btn-active-bg: #ff0039;--bs-btn-active-border-color: #ff0039;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ff0039;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ff0039;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #2761e3;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #1f4eb6;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #1f4eb6;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 71, 121, 231;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.2em}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #343a40;--bs-dropdown-bg: #fff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.25rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.25rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #343a40;--bs-dropdown-link-hover-color: #343a40;--bs-dropdown-link-hover-bg: #f8f9fa;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2780e3;--bs-dropdown-link-disabled-color: rgba(52, 58, 64, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2780e3;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #2761e3;--bs-nav-link-hover-color: #1f4eb6;--bs-nav-link-disabled-color: rgba(52, 58, 64, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: #dee2e6;--bs-nav-tabs-border-radius: 0.25rem;--bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #fff;--bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width))}.nav-pills{--bs-nav-pills-border-radius: 0.25rem;--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #2780e3}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 0.5rem;--bs-navbar-color: #545555;--bs-navbar-hover-color: rgba(31, 78, 182, 0.8);--bs-navbar-disabled-color: rgba(84, 85, 85, 0.75);--bs-navbar-active-color: #1f4eb6;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #545555;--bs-navbar-brand-hover-color: #1f4eb6;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(84, 85, 85, 0);--bs-navbar-toggler-border-radius: 0.25rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #545555;--bs-navbar-hover-color: rgba(31, 78, 182, 0.8);--bs-navbar-disabled-color: rgba(84, 85, 85, 0.75);--bs-navbar-active-color: #1f4eb6;--bs-navbar-brand-color: #545555;--bs-navbar-brand-hover-color: #1f4eb6;--bs-navbar-toggler-border-color: rgba(84, 85, 85, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.25rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.25rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(52, 58, 64, 0.25);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #fff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0}.card>.list-group:last-child{border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}}.accordion{--bs-accordion-color: #343a40;--bs-accordion-bg: #fff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: #dee2e6;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.25rem;--bs-accordion-inner-border-radius: calc(0.25rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #343a40;--bs-accordion-btn-bg: #fff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23343a40'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2310335b'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #93c0f1;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #10335b;--bs-accordion-active-bg: #d4e6f9}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:not(:first-of-type){border-top:0}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237db3ee'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237db3ee'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: rgba(52, 58, 64, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(52, 58, 64, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #2761e3;--bs-pagination-bg: #fff;--bs-pagination-border-width: 1px;--bs-pagination-border-color: #dee2e6;--bs-pagination-border-radius: 0.25rem;--bs-pagination-hover-color: #1f4eb6;--bs-pagination-hover-bg: #f8f9fa;--bs-pagination-hover-border-color: #dee2e6;--bs-pagination-focus-color: #1f4eb6;--bs-pagination-focus-bg: #e9ecef;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #2780e3;--bs-pagination-active-border-color: #2780e3;--bs-pagination-disabled-color: rgba(52, 58, 64, 0.75);--bs-pagination-disabled-bg: #e9ecef;--bs-pagination-disabled-border-color: #dee2e6;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(1px*-1)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.2em}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: 0.25rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 0 solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.25rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:.5rem}}.progress,.progress-stacked{--bs-progress-height: 0.5rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #e9ecef;--bs-progress-border-radius: 0.25rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #2780e3;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #343a40;--bs-list-group-bg: #fff;--bs-list-group-border-color: #dee2e6;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.25rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(52, 58, 64, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #f8f9fa;--bs-list-group-action-active-color: #343a40;--bs-list-group-action-active-bg: #e9ecef;--bs-list-group-disabled-color: rgba(52, 58, 64, 0.75);--bs-list-group-disabled-bg: #fff;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #2780e3;--bs-list-group-active-border-color: #2780e3;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.5;--bs-btn-close-hover-opacity: 0.75;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.25rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(52, 58, 64, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color)}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #fff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: #dee2e6;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: #dee2e6;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #fff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.25rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #fff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #e9ecef;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #343a40;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #343a40;--bs-offcanvas-bg: #fff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(31, 102, 182, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(31, 102, 182, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(50, 146, 19, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(50, 146, 19, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(122, 67, 150, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(122, 67, 150, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(204, 94, 19, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(204, 94, 19, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(204, 0, 46, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(204, 0, 46, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}.bg-blue{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2780e3;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #613d7c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #613d7c;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #ff0039;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #f0ad4e;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #f0ad4e;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ff7518;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #3fb618;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #9954bb;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #343a40}.bg-default{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2780e3}.bg-primary{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #343a40}.bg-secondary{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #3fb618}.bg-success{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #9954bb}.bg-info{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #ff7518}.bg-warning{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #ff0039}.bg-danger{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #343a40}.bg-dark{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4053e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4053e9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3e65ba;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3e65ba;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7466c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7466c0;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d4d9f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #7d4d9f;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #7792a7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #7792a7;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7d7c92;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #7d7c92;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #319692;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #319692;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #249dc5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #249dc5;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #556ed3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #556ed3;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4d3dec;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4d3dec;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6422c3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #6422c3;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #a30aa8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a30aa8;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9d4fb0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9d4fb0;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a3389b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a3389b;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #56529b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #56529b;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #7a2bdc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #7a2bdc;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4a58a5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4a58a5;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #632bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #632bab;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #973d82;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #973d82;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #a02561;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a02561;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9a6a6a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9a6a6a;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a05354;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a05354;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #536d54;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #536d54;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #477587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #477587;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #774695;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #774695;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9b58af;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #9b58af;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b23e86;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b23e86;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #f1256b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f1256b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #eb6a73;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #eb6a73;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f1545e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f1545e;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #a46e5e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a46e5e;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #c8479f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #c8479f;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9337d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a9337d;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c20683;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c20683;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c01854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c01854;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f6195a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f6195a;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f94541;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f94541;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ff2f2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #ff2f2c;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #b2492c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b2492c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6505f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6505f;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d6226d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d6226d;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a09b8a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a09b8a;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b96e90;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b96e90;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b78060;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b78060;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ed8167;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ed8167;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f66846;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f66846;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #f69738;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f69738;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a9b138;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a9b138;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #9db86b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9db86b;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #cd897a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #cd897a;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a97969;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a97969;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c24d6f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c24d6f;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c05f40;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c05f40;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f65f46;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f65f46;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ff4625;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #ff4625;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #f98b2e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f98b2e;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #b28f18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b28f18;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6974b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6974b;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d66859;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d66859;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #35a069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #35a069;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4f746f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4f746f;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d8640;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #4d8640;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #838646;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #838646;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #8c6d25;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #8c6d25;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #86b22e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #86b22e;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #8c9c18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #8c9c18;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #33be4b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #33be4b;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #638f59;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #638f59;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #23acb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #23acb5;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3a918c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3a918c;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #797971;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #797971;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #73be7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #73be7a;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #79a764;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #79a764;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #2cc164;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #2cc164;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #509aa5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #509aa5;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #6b66cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #6b66cb;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #8539d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #8539d1;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #834ba2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #834ba2;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #b94ba8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #b94ba8;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #c23287;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #c23287;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #bc788f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #bc788f;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #c2617a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #c2617a;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #757b7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #757b7a;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #6983ad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #6983ad;color:#fff}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2780e3;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #613d7c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #613d7c;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #ff0039;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #f0ad4e;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #f0ad4e;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ff7518;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #3fb618;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #9954bb;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #343a40}.bg-default{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2780e3}.bg-primary{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #343a40}.bg-secondary{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #3fb618}.bg-success{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #9954bb}.bg-info{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #ff7518}.bg-warning{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #ff0039}.bg-danger{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #343a40}.bg-dark{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4053e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4053e9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3e65ba;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3e65ba;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7466c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7466c0;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d4d9f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #7d4d9f;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #7792a7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #7792a7;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7d7c92;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #7d7c92;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #319692;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #319692;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #249dc5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #249dc5;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #556ed3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #556ed3;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4d3dec;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4d3dec;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6422c3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #6422c3;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #a30aa8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a30aa8;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9d4fb0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9d4fb0;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a3389b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a3389b;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #56529b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #56529b;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #7a2bdc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #7a2bdc;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4a58a5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4a58a5;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #632bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #632bab;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #973d82;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #973d82;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #a02561;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a02561;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9a6a6a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9a6a6a;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a05354;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a05354;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #536d54;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #536d54;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #477587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #477587;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #774695;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #774695;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9b58af;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #9b58af;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b23e86;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b23e86;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #f1256b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f1256b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #eb6a73;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #eb6a73;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f1545e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f1545e;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #a46e5e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a46e5e;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #c8479f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #c8479f;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9337d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a9337d;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c20683;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c20683;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c01854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c01854;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f6195a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f6195a;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f94541;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f94541;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ff2f2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #ff2f2c;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #b2492c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b2492c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6505f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6505f;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d6226d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d6226d;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a09b8a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a09b8a;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b96e90;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b96e90;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b78060;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b78060;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ed8167;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ed8167;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f66846;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f66846;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #f69738;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f69738;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a9b138;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a9b138;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #9db86b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9db86b;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #cd897a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #cd897a;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a97969;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a97969;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c24d6f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c24d6f;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c05f40;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c05f40;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f65f46;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f65f46;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ff4625;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #ff4625;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #f98b2e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f98b2e;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #b28f18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b28f18;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6974b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6974b;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d66859;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d66859;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #35a069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #35a069;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4f746f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4f746f;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d8640;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #4d8640;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #838646;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #838646;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #8c6d25;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #8c6d25;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #86b22e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #86b22e;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #8c9c18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #8c9c18;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #33be4b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #33be4b;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #638f59;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #638f59;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #23acb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #23acb5;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3a918c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3a918c;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #797971;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #797971;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #73be7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #73be7a;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #79a764;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #79a764;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #2cc164;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #2cc164;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #509aa5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #509aa5;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #6b66cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #6b66cb;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #8539d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #8539d1;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #834ba2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #834ba2;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #b94ba8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #b94ba8;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #c23287;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #c23287;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #bc788f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #bc788f;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #c2617a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #c2617a;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #757b7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #757b7a;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #6983ad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #6983ad;color:#fff}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #fff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}:root{--bslib-page-sidebar-title-bg: #f8f9fa;--bslib-page-sidebar-title-color: #000}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #dee2e6}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.25rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.quarto-container{min-height:calc(100vh - 132px)}body.hypothesis-enabled #quarto-header{margin-right:16px}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}footer.footer div.nav-footer p:first-child{margin-top:0}footer.footer div.nav-footer p:last-child{margin-bottom:0}#quarto-content>*{padding-top:14px}#quarto-content>#quarto-sidebar-glass{padding-top:0px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-brand-container{order:2}.navbar .navbar-toggler{order:1}.navbar .navbar-container>.navbar-nav{order:20}.navbar .navbar-container>.navbar-brand-container{margin-left:0 !important;margin-right:0 !important}.navbar .navbar-collapse{order:20}.navbar #quarto-search{order:4;margin-left:auto}.navbar .navbar-toggler{margin-right:.5em}.navbar-collapse .quarto-navbar-tools{margin-left:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools{order:3}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:#545555}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#1f4eb6}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em;line-height:1rem;margin-top:.4rem}.sidebar-section{padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between;cursor:pointer}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-item-text{width:100%}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-title-breadcrumbs{display:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-title-breadcrumbs .breadcrumb{margin-bottom:.5em;font-size:.9rem}.quarto-title-breadcrumbs .breadcrumb li:last-of-type a{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{color:#595959}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.no-decor{text-decoration:none}.quarto-secondary-nav-title{margin-top:.3em;color:#595959;padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(33,81,191,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:#8c8c8c}.breadcrumb-item{line-height:1.2rem}div.sidebar-item-container{color:#595959}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(33,81,191,.8)}div.sidebar-item-container.disabled{color:rgba(89,89,89,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:#2151bf}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#fff}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #dee2e6}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#fff;border-bottom:1px solid #dee2e6}.quarto-banner nav.quarto-secondary-nav{background-color:#f8f9fa;color:#545555;border-top:1px solid #dee2e6}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(min-width: 992px){#quarto-sidebar-glass{display:none}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:rgba(102,102,102,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#1f4eb6}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions a,.nav-footer .toc-actions a:hover{text-decoration:none}.nav-footer .toc-actions ul{display:flex;list-style:none}.nav-footer .toc-actions ul :first-child{margin-left:auto}.nav-footer .toc-actions ul :last-child{margin-right:auto}.nav-footer .toc-actions ul li{padding-right:1.5em}.nav-footer .toc-actions ul li i.bi{padding-right:.4em}.nav-footer .toc-actions ul li:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#fff}body.nav-fixed{padding-top:64px}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#757575}.nav-footer a{color:#757575}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}@media(min-width: 768px){.nav-footer-left{flex:1 1 0px;text-align:left}}@media(max-width: 575.98px){.nav-footer-left{margin-bottom:1em;flex:100%}}@media(min-width: 768px){.nav-footer-right{flex:1 1 0px;text-align:right}}@media(max-width: 575.98px){.nav-footer-right{margin-bottom:1em;flex:100%}}.nav-footer-center{text-align:center;min-height:3em}@media(min-width: 768px){.nav-footer-center{flex:1 1 0px}}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-bottom:1em;flex:100%}}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em;order:10}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#545555;border-radius:3px}@media(max-width: 991.98px){.quarto-reader-toggle{display:none}}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:#595959;border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#fff;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}#quarto-announcement{padding:.5em;display:flex;justify-content:space-between;margin-bottom:0;font-size:.9em}#quarto-announcement .quarto-announcement-content{margin-right:auto}#quarto-announcement .quarto-announcement-content p{margin-bottom:0}#quarto-announcement .quarto-announcement-icon{margin-right:.5em;font-size:1.2em;margin-top:-0.15em}#quarto-announcement .quarto-announcement-action{cursor:pointer}.aa-DetachedSearchButtonQuery{display:none}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#fff;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}.navbar.navbar-expand-sm #quarto-search,.navbar.navbar-expand-md #quarto-search{order:999}@media(min-width: 992px){.navbar .quarto-navbar-tools{order:900}}@media(min-width: 992px){.navbar .quarto-navbar-tools.tools-end{margin-left:auto !important}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#545555;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#545555;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;color:#343a40;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#343a40;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#343a40;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#343a40;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + calc(1px * 2))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#343a40;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #dee2e6 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#f2f2f2;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#4b95e8}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#343a40}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:#e5effc}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#fff;color:#343a40}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#fff;border-color:#dee2e6;color:#343a40}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:0em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs,#quarto-search-results .aa-Item .search-item .search-result-crumbs{white-space:nowrap;text-overflow:ellipsis;font-size:.8em;font-weight:300;margin-right:1em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap),#quarto-search-results .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap){max-width:30%;margin-left:auto;margin-top:.5em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap,#quarto-search-results .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap{flex-basis:100%;margin-top:0em;margin-bottom:.2em;margin-left:37px}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;flex-wrap:wrap;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:42px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #dee2e6}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#545555}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#595959}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(255,255,255,.65);width:90%;bottom:0;box-shadow:rgba(222,226,230,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#fff;border-bottom:1px solid #dee2e6;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#343a40;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(52,58,64,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-dashboard.nav-fixed.dashboard-sidebar #quarto-content.quarto-dashboard-content{padding:0em}.quarto-dashboard #quarto-content.quarto-dashboard-content{padding:1em}.quarto-dashboard #quarto-content.quarto-dashboard-content>*{padding-top:0}@media(min-width: 576px){.quarto-dashboard{height:100%}}.quarto-dashboard .card.valuebox.bslib-card.bg-primary{background-color:#5397e9 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-secondary{background-color:#343a40 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-success{background-color:#3aa716 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-info{background-color:rgba(153,84,187,.7019607843) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-warning{background-color:#fa6400 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-danger{background-color:rgba(255,0,57,.7019607843) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-light{background-color:#f8f9fa !important}.quarto-dashboard .card.valuebox.bslib-card.bg-dark{background-color:#343a40 !important}.quarto-dashboard.dashboard-fill{display:flex;flex-direction:column}.quarto-dashboard #quarto-appendix{display:none}.quarto-dashboard #quarto-header #quarto-dashboard-header{border-top:solid 1px #dae0e5;border-bottom:solid 1px #dae0e5}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav{padding-left:1em;padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav .navbar-brand-container{padding-left:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler{margin-right:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler-icon{height:1em;width:1em;background-image:url('data:image/svg+xml,')}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-brand-container{padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-title{font-size:1.1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-nav{font-size:.9em}.quarto-dashboard #quarto-dashboard-header .navbar{padding:0}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-container{padding-left:1em}.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-brand-container .nav-link,.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-nav .nav-link{padding:.7em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-color-scheme-toggle{order:9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-toggler{margin-left:.5em;order:10}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .nav-link{padding:.5em;height:100%;display:flex;align-items:center}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .active{background-color:#e0e5e9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{padding:.5em .5em .5em 0;display:flex;flex-direction:row;margin-right:2em;align-items:center}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{margin-right:auto}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{align-self:stretch}@media(min-width: 768px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:8}}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:1000;padding-bottom:.5em}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse .navbar-nav{align-self:stretch}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title{font-size:1.25em;line-height:1.1em;display:flex;flex-direction:row;flex-wrap:wrap;align-items:baseline}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title .navbar-title-text{margin-right:.4em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title a{text-decoration:none;color:inherit}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-subtitle,.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{font-size:.9rem;margin-right:.5em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{margin-left:auto}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-logo{max-height:48px;min-height:30px;object-fit:cover;margin-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-links{order:9;padding-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link-text{margin-left:.25em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link{padding-right:0em;padding-left:.7em;text-decoration:none;color:#545555}.quarto-dashboard .page-layout-custom .tab-content{padding:0;border:none}.quarto-dashboard-img-contain{height:100%;width:100%;object-fit:contain}@media(max-width: 575.98px){.quarto-dashboard .bslib-grid{grid-template-rows:minmax(1em, max-content) !important}.quarto-dashboard .sidebar-content{height:inherit}.quarto-dashboard .page-layout-custom{min-height:100vh}}.quarto-dashboard.dashboard-toolbar>.page-layout-custom,.quarto-dashboard.dashboard-sidebar>.page-layout-custom{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages{padding:0}.quarto-dashboard .callout{margin-bottom:0;margin-top:0}.quarto-dashboard .html-fill-container figure{overflow:hidden}.quarto-dashboard bslib-tooltip .rounded-pill{border:solid #6c757d 1px}.quarto-dashboard bslib-tooltip .rounded-pill .svg{fill:#343a40}.quarto-dashboard .tabset .dashboard-card-no-title .nav-tabs{margin-left:0;margin-right:auto}.quarto-dashboard .tabset .tab-content{border:none}.quarto-dashboard .tabset .card-header .nav-link[role=tab]{margin-top:-6px;padding-top:6px;padding-bottom:6px}.quarto-dashboard .card.valuebox,.quarto-dashboard .card.bslib-value-box{min-height:3rem}.quarto-dashboard .card.valuebox .card-body,.quarto-dashboard .card.bslib-value-box .card-body{padding:0}.quarto-dashboard .bslib-value-box .value-box-value{font-size:clamp(.1em,15cqw,5em)}.quarto-dashboard .bslib-value-box .value-box-showcase .bi{font-size:clamp(.1em,max(18cqw,5.2cqh),5em);text-align:center;height:1em}.quarto-dashboard .bslib-value-box .value-box-showcase .bi::before{vertical-align:1em}.quarto-dashboard .bslib-value-box .value-box-area{margin-top:auto;margin-bottom:auto}.quarto-dashboard .card figure.quarto-float{display:flex;flex-direction:column;align-items:center}.quarto-dashboard .dashboard-scrolling{padding:1em}.quarto-dashboard .full-height{height:100%}.quarto-dashboard .showcase-bottom .value-box-grid{display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;grid-template-areas:"top" "bottom"}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase i.bi{font-size:4rem}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-area{grid-area:top}.quarto-dashboard .tab-content{margin-bottom:0}.quarto-dashboard .bslib-card .bslib-navs-card-title{justify-content:stretch;align-items:end}.quarto-dashboard .card-header{display:flex;flex-wrap:wrap;justify-content:space-between}.quarto-dashboard .card-header .card-title{display:flex;flex-direction:column;justify-content:center;margin-bottom:0}.quarto-dashboard .tabset .card-toolbar{margin-bottom:1em}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{border:none;gap:var(--bslib-spacer, 1rem)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{padding:0}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.sidebar{border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.collapse-toggle{display:none}@media(max-width: 767.98px){.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{grid-template-columns:1fr;grid-template-rows:max-content 1fr}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{grid-column:1;grid-row:2}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout .sidebar{grid-column:1;grid-row:1}}.quarto-dashboard .sidebar-right .sidebar{padding-left:2.5em}.quarto-dashboard .sidebar-right .collapse-toggle{left:2px}.quarto-dashboard .quarto-dashboard .sidebar-right button.collapse-toggle:not(.transitioning){left:unset}.quarto-dashboard aside.sidebar{padding-left:1em;padding-right:1em;background-color:rgba(52,58,64,.25);color:#343a40}.quarto-dashboard .bslib-sidebar-layout>div.main{padding:.7em}.quarto-dashboard .bslib-sidebar-layout button.collapse-toggle{margin-top:.3em}.quarto-dashboard .bslib-sidebar-layout .collapse-toggle{top:0}.quarto-dashboard .bslib-sidebar-layout.sidebar-collapsed:not(.transitioning):not(.sidebar-right) .collapse-toggle{left:2px}.quarto-dashboard .sidebar>section>.h3:first-of-type{margin-top:0em}.quarto-dashboard .sidebar .h3,.quarto-dashboard .sidebar .h4,.quarto-dashboard .sidebar .h5,.quarto-dashboard .sidebar .h6{margin-top:.5em}.quarto-dashboard .sidebar form{flex-direction:column;align-items:start;margin-bottom:1em}.quarto-dashboard .sidebar form div[class*=oi-][class$=-input]{flex-direction:column}.quarto-dashboard .sidebar form[class*=oi-][class$=-toggle]{flex-direction:row-reverse;align-items:center;justify-content:start}.quarto-dashboard .sidebar form input[type=range]{margin-top:.5em;margin-right:.8em;margin-left:1em}.quarto-dashboard .sidebar label{width:fit-content}.quarto-dashboard .sidebar .card-body{margin-bottom:2em}.quarto-dashboard .sidebar .shiny-input-container{margin-bottom:1em}.quarto-dashboard .sidebar .shiny-options-group{margin-top:0}.quarto-dashboard .sidebar .control-label{margin-bottom:.3em}.quarto-dashboard .card .card-body .quarto-layout-row{align-items:stretch}.quarto-dashboard .toolbar{font-size:.9em;display:flex;flex-direction:row;border-top:solid 1px #bcbfc0;padding:1em;flex-wrap:wrap;background-color:rgba(52,58,64,.25)}.quarto-dashboard .toolbar .cell-output-display{display:flex}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar>*:last-child{margin-right:0}.quarto-dashboard .toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .toolbar .input-daterange{width:inherit}.quarto-dashboard .toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar form{width:fit-content}.quarto-dashboard .toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .toolbar form input[type=date]{width:fit-content}.quarto-dashboard .toolbar form input[type=color]{width:3em}.quarto-dashboard .toolbar form button{padding:.4em}.quarto-dashboard .toolbar form select{width:fit-content}.quarto-dashboard .toolbar>*{font-size:.9em;flex-grow:0}.quarto-dashboard .toolbar .shiny-input-container label{margin-bottom:1px}.quarto-dashboard .toolbar-bottom{margin-top:1em;margin-bottom:0 !important;order:2}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>.tab-content>.tab-pane>*:not(.bslib-sidebar-layout){padding:1em}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>*:not(.tab-content){padding:1em}.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page>.dashboard-toolbar-container>.toolbar-content,.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page:not(.dashboard-sidebar-container)>*:not(.dashboard-toolbar-container){padding:1em}.quarto-dashboard .toolbar-content{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages .tab-pane>.dashboard-toolbar-container .toolbar{border-radius:0;margin-bottom:0}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar{border-bottom:1px solid rgba(0,0,0,.175)}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar-bottom{margin-top:0}.quarto-dashboard .dashboard-toolbar-container:not(.toolbar-toplevel) .toolbar{margin-bottom:1em;border-top:none;border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .vega-embed.has-actions details{width:1.7em;height:2em;position:absolute !important;top:0;right:0}.quarto-dashboard .dashboard-toolbar-container{padding:0}.quarto-dashboard .card .card-header p:last-child,.quarto-dashboard .card .card-footer p:last-child{margin-bottom:0}.quarto-dashboard .card .card-body>.h4:first-child{margin-top:0}.quarto-dashboard .card .card-body{z-index:4}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_length,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_info,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate{text-align:initial}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_filter{text-align:right}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:initial}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding-top:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper table{flex-shrink:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons{margin-bottom:.5em;margin-left:auto;width:fit-content;float:right}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons.btn-group{background:#fff;border:none}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn-secondary{background-color:#fff;background-image:none;border:solid #dee2e6 1px;padding:.2em .7em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn span{font-size:.8em;color:#343a40}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{margin-left:.5em;margin-bottom:.5em;padding-top:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.875em}}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.8em}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter{margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter input[type=search]{padding:1px 5px 1px 5px;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length{flex-basis:1 1 50%;margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length select{padding:.4em 3em .4em .5em;font-size:.875em;margin-left:.2em;margin-right:.2em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{flex-shrink:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{margin-left:auto}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate ul.pagination .paginate_button .page-link{font-size:.8em}.quarto-dashboard .card .card-footer{font-size:.9em}.quarto-dashboard .card .card-toolbar{display:flex;flex-grow:1;flex-direction:row;width:100%;flex-wrap:wrap}.quarto-dashboard .card .card-toolbar>*{font-size:.8em;flex-grow:0}.quarto-dashboard .card .card-toolbar>.card-title{font-size:1em;flex-grow:1;align-self:flex-start;margin-top:.1em}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar form{width:fit-content}.quarto-dashboard .card .card-toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=date]{width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=color]{width:3em}.quarto-dashboard .card .card-toolbar form button{padding:.4em}.quarto-dashboard .card .card-toolbar form select{width:fit-content}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .card .card-toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .card .card-toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .card .card-toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange{width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .card .card-toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .card .card-toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .card .card-toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .card .card-toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card-body>table>thead{border-top:none}.quarto-dashboard .card-body>.table>:not(caption)>*>*{background-color:#fff}.tableFloatingHeaderOriginal{background-color:#fff;position:sticky !important;top:0 !important}.dashboard-data-table{margin-top:-1px}div.value-box-area span.observablehq--number{font-size:calc(clamp(.1em,15cqw,5em)*1.25);line-height:1.2;color:inherit;font-family:var(--bs-body-font-family)}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#fff;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:rgba(52,58,64,.25);flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none;word-break:keep-all}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post .body pre code{white-space:pre-wrap}div.quarto-post a{color:#343a40;text-decoration:none}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#2761e3}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#2761e3}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#2761e3}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#2761e3}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#2761e3}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #dee2e6;border-radius:.25rem;color:#343a40;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#343a40}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre-wrap}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}div.ansi-escaped-output{font-family:monospace;display:block}/*!
+ */@import"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;700&display=swap";:root,[data-bs-theme=light]{--bs-blue: #2780e3;--bs-indigo: #6610f2;--bs-purple: #613d7c;--bs-pink: #e83e8c;--bs-red: #ff0039;--bs-orange: #f0ad4e;--bs-yellow: #ff7518;--bs-green: #3fb618;--bs-teal: #20c997;--bs-cyan: #9954bb;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #343a40;--bs-primary: #2780e3;--bs-secondary: #343a40;--bs-success: #3fb618;--bs-info: #9954bb;--bs-warning: #ff7518;--bs-danger: #ff0039;--bs-light: #f8f9fa;--bs-dark: #343a40;--bs-default-rgb: 52, 58, 64;--bs-primary-rgb: 39, 128, 227;--bs-secondary-rgb: 52, 58, 64;--bs-success-rgb: 63, 182, 24;--bs-info-rgb: 153, 84, 187;--bs-warning-rgb: 255, 117, 24;--bs-danger-rgb: 255, 0, 57;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 52, 58, 64;--bs-primary-text-emphasis: #10335b;--bs-secondary-text-emphasis: #15171a;--bs-success-text-emphasis: #19490a;--bs-info-text-emphasis: #3d224b;--bs-warning-text-emphasis: #662f0a;--bs-danger-text-emphasis: #660017;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #d4e6f9;--bs-secondary-bg-subtle: #d6d8d9;--bs-success-bg-subtle: #d9f0d1;--bs-info-bg-subtle: #ebddf1;--bs-warning-bg-subtle: #ffe3d1;--bs-danger-bg-subtle: #ffccd7;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #a9ccf4;--bs-secondary-border-subtle: #aeb0b3;--bs-success-border-subtle: #b2e2a3;--bs-info-border-subtle: #d6bbe4;--bs-warning-border-subtle: #ffc8a3;--bs-danger-border-subtle: #ff99b0;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #343a40;--bs-body-color-rgb: 52, 58, 64;--bs-body-bg: #fff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(52, 58, 64, 0.75);--bs-secondary-color-rgb: 52, 58, 64;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(52, 58, 64, 0.5);--bs-tertiary-color-rgb: 52, 58, 64;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #2761e3;--bs-link-color-rgb: 39, 97, 227;--bs-link-decoration: underline;--bs-link-hover-color: #1f4eb6;--bs-link-hover-color-rgb: 31, 78, 182;--bs-code-color: #7d12ba;--bs-highlight-bg: #ffe3d1;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.25rem;--bs-border-radius-sm: 0.2em;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(39, 128, 227, 0.25);--bs-form-valid-color: #3fb618;--bs-form-valid-border-color: #3fb618;--bs-form-invalid-color: #ff0039;--bs-form-invalid-border-color: #ff0039}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #7db3ee;--bs-secondary-text-emphasis: #85898c;--bs-success-text-emphasis: #8cd374;--bs-info-text-emphasis: #c298d6;--bs-warning-text-emphasis: #ffac74;--bs-danger-text-emphasis: #ff6688;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #081a2d;--bs-secondary-bg-subtle: #0a0c0d;--bs-success-bg-subtle: #0d2405;--bs-info-bg-subtle: #1f1125;--bs-warning-bg-subtle: #331705;--bs-danger-bg-subtle: #33000b;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #174d88;--bs-secondary-border-subtle: #1f2326;--bs-success-border-subtle: #266d0e;--bs-info-border-subtle: #5c3270;--bs-warning-border-subtle: #99460e;--bs-danger-border-subtle: #990022;--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #7db3ee;--bs-link-hover-color: #97c2f1;--bs-link-color-rgb: 125, 179, 238;--bs-link-hover-color-rgb: 151, 194, 241;--bs-code-color: white;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #8cd374;--bs-form-valid-border-color: #8cd374;--bs-form-invalid-color: #ff6688;--bs-form-invalid-border-color: #ff6688}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #e9ecef}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6)}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#343a40}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(52,58,64,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(52,58,64,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #343a40;--bs-table-bg: #fff;--bs-table-border-color: #dee2e6;--bs-table-accent-bg: transparent;--bs-table-striped-color: #343a40;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #343a40;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #343a40;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #b2bac1}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: #d4e6f9;--bs-table-border-color: #bfcfe0;--bs-table-striped-bg: #c9dbed;--bs-table-striped-color: #000;--bs-table-active-bg: #bfcfe0;--bs-table-active-color: #000;--bs-table-hover-bg: #c4d5e6;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: #d6d8d9;--bs-table-border-color: #c1c2c3;--bs-table-striped-bg: #cbcdce;--bs-table-striped-color: #000;--bs-table-active-bg: #c1c2c3;--bs-table-active-color: #000;--bs-table-hover-bg: #c6c8c9;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: #d9f0d1;--bs-table-border-color: #c3d8bc;--bs-table-striped-bg: #cee4c7;--bs-table-striped-color: #000;--bs-table-active-bg: #c3d8bc;--bs-table-active-color: #000;--bs-table-hover-bg: #c9dec1;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: #ebddf1;--bs-table-border-color: #d4c7d9;--bs-table-striped-bg: #dfd2e5;--bs-table-striped-color: #000;--bs-table-active-bg: #d4c7d9;--bs-table-active-color: #000;--bs-table-hover-bg: #d9ccdf;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: #ffe3d1;--bs-table-border-color: #e6ccbc;--bs-table-striped-bg: #f2d8c7;--bs-table-striped-color: #000;--bs-table-active-bg: #e6ccbc;--bs-table-active-color: #000;--bs-table-hover-bg: #ecd2c1;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: #ffccd7;--bs-table-border-color: #e6b8c2;--bs-table-striped-bg: #f2c2cc;--bs-table-striped-color: #000;--bs-table-active-bg: #e6b8c2;--bs-table-active-color: #000;--bs-table-hover-bg: #ecbdc7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: #dfe0e1;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #343a40;--bs-table-border-color: #484e53;--bs-table-striped-bg: #3e444a;--bs-table-striped-color: #fff;--bs-table-active-bg: #484e53;--bs-table-active-color: #fff;--bs-table-hover-bg: #43494e;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(52,58,64,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #dee2e6;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#343a40;background-color:#fff;border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(52,58,64,.75);opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#343a40;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e9ecef}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#343a40;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important}.form-control-color::-webkit-color-swatch{border:0 !important}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #dee2e6;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #343a40}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #fff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid #dee2e6;print-color-adjust:exact}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#2780e3;border-color:#2780e3}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#2780e3;border-color:#2780e3;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2393c0f1'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bed9f7}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0)}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#bed9f7}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(52,58,64,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(52,58,64,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#e9ecef}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid #dee2e6}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1)}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#3fb618}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#3fb618}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#3fb618;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#3fb618}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#3fb618}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#3fb618}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#3fb618}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#ff0039}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#ff0039}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ff0039;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#ff0039}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#ff0039}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#ff0039}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ff0039}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #343a40;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.25rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3136;--bs-btn-hover-border-color: #2a2e33;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a2e33;--bs-btn-active-border-color: #272c30;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #2780e3;--bs-btn-border-color: #2780e3;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #216dc1;--bs-btn-hover-border-color: #1f66b6;--bs-btn-focus-shadow-rgb: 71, 147, 231;--bs-btn-active-color: #fff;--bs-btn-active-bg: #1f66b6;--bs-btn-active-border-color: #1d60aa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2780e3;--bs-btn-disabled-border-color: #2780e3}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3136;--bs-btn-hover-border-color: #2a2e33;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a2e33;--bs-btn-active-border-color: #272c30;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #3fb618;--bs-btn-border-color: #3fb618;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #369b14;--bs-btn-hover-border-color: #329213;--bs-btn-focus-shadow-rgb: 92, 193, 59;--bs-btn-active-color: #fff;--bs-btn-active-bg: #329213;--bs-btn-active-border-color: #2f8912;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3fb618;--bs-btn-disabled-border-color: #3fb618}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #9954bb;--bs-btn-border-color: #9954bb;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #82479f;--bs-btn-hover-border-color: #7a4396;--bs-btn-focus-shadow-rgb: 168, 110, 197;--bs-btn-active-color: #fff;--bs-btn-active-bg: #7a4396;--bs-btn-active-border-color: #733f8c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #9954bb;--bs-btn-disabled-border-color: #9954bb}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #ff7518;--bs-btn-border-color: #ff7518;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #d96314;--bs-btn-hover-border-color: #cc5e13;--bs-btn-focus-shadow-rgb: 255, 138, 59;--bs-btn-active-color: #fff;--bs-btn-active-bg: #cc5e13;--bs-btn-active-border-color: #bf5812;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #ff7518;--bs-btn-disabled-border-color: #ff7518}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #ff0039;--bs-btn-border-color: #ff0039;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #d90030;--bs-btn-hover-border-color: #cc002e;--bs-btn-focus-shadow-rgb: 255, 38, 87;--bs-btn-active-color: #fff;--bs-btn-active-bg: #cc002e;--bs-btn-active-border-color: #bf002b;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #ff0039;--bs-btn-disabled-border-color: #ff0039}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #52585d;--bs-btn-hover-border-color: #484e53;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #5d6166;--bs-btn-active-border-color: #484e53;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-outline-default{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #2780e3;--bs-btn-border-color: #2780e3;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2780e3;--bs-btn-hover-border-color: #2780e3;--bs-btn-focus-shadow-rgb: 39, 128, 227;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2780e3;--bs-btn-active-border-color: #2780e3;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #2780e3;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2780e3;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #3fb618;--bs-btn-border-color: #3fb618;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3fb618;--bs-btn-hover-border-color: #3fb618;--bs-btn-focus-shadow-rgb: 63, 182, 24;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3fb618;--bs-btn-active-border-color: #3fb618;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #3fb618;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3fb618;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #9954bb;--bs-btn-border-color: #9954bb;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #9954bb;--bs-btn-hover-border-color: #9954bb;--bs-btn-focus-shadow-rgb: 153, 84, 187;--bs-btn-active-color: #fff;--bs-btn-active-bg: #9954bb;--bs-btn-active-border-color: #9954bb;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #9954bb;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #9954bb;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ff7518;--bs-btn-border-color: #ff7518;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #ff7518;--bs-btn-hover-border-color: #ff7518;--bs-btn-focus-shadow-rgb: 255, 117, 24;--bs-btn-active-color: #fff;--bs-btn-active-bg: #ff7518;--bs-btn-active-border-color: #ff7518;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ff7518;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ff7518;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #ff0039;--bs-btn-border-color: #ff0039;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #ff0039;--bs-btn-hover-border-color: #ff0039;--bs-btn-focus-shadow-rgb: 255, 0, 57;--bs-btn-active-color: #fff;--bs-btn-active-bg: #ff0039;--bs-btn-active-border-color: #ff0039;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ff0039;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ff0039;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #2761e3;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #1f4eb6;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #1f4eb6;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 71, 121, 231;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.2em}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #343a40;--bs-dropdown-bg: #fff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.25rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.25rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #343a40;--bs-dropdown-link-hover-color: #343a40;--bs-dropdown-link-hover-bg: #f8f9fa;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2780e3;--bs-dropdown-link-disabled-color: rgba(52, 58, 64, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2780e3;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #2761e3;--bs-nav-link-hover-color: #1f4eb6;--bs-nav-link-disabled-color: rgba(52, 58, 64, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: #dee2e6;--bs-nav-tabs-border-radius: 0.25rem;--bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #fff;--bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width))}.nav-pills{--bs-nav-pills-border-radius: 0.25rem;--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #2780e3}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 0.5rem;--bs-navbar-color: #545555;--bs-navbar-hover-color: rgba(31, 78, 182, 0.8);--bs-navbar-disabled-color: rgba(84, 85, 85, 0.75);--bs-navbar-active-color: #1f4eb6;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #545555;--bs-navbar-brand-hover-color: #1f4eb6;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(84, 85, 85, 0);--bs-navbar-toggler-border-radius: 0.25rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #545555;--bs-navbar-hover-color: rgba(31, 78, 182, 0.8);--bs-navbar-disabled-color: rgba(84, 85, 85, 0.75);--bs-navbar-active-color: #1f4eb6;--bs-navbar-brand-color: #545555;--bs-navbar-brand-hover-color: #1f4eb6;--bs-navbar-toggler-border-color: rgba(84, 85, 85, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.25rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.25rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(52, 58, 64, 0.25);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #fff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0}.card>.list-group:last-child{border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}}.accordion{--bs-accordion-color: #343a40;--bs-accordion-bg: #fff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: #dee2e6;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.25rem;--bs-accordion-inner-border-radius: calc(0.25rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #343a40;--bs-accordion-btn-bg: #fff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23343a40'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2310335b'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #93c0f1;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #10335b;--bs-accordion-active-bg: #d4e6f9}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:not(:first-of-type){border-top:0}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237db3ee'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237db3ee'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: rgba(52, 58, 64, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(52, 58, 64, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #2761e3;--bs-pagination-bg: #fff;--bs-pagination-border-width: 1px;--bs-pagination-border-color: #dee2e6;--bs-pagination-border-radius: 0.25rem;--bs-pagination-hover-color: #1f4eb6;--bs-pagination-hover-bg: #f8f9fa;--bs-pagination-hover-border-color: #dee2e6;--bs-pagination-focus-color: #1f4eb6;--bs-pagination-focus-bg: #e9ecef;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #2780e3;--bs-pagination-active-border-color: #2780e3;--bs-pagination-disabled-color: rgba(52, 58, 64, 0.75);--bs-pagination-disabled-bg: #e9ecef;--bs-pagination-disabled-border-color: #dee2e6;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(1px*-1)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.2em}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: 0.25rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 0 solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.25rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:.5rem}}.progress,.progress-stacked{--bs-progress-height: 0.5rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #e9ecef;--bs-progress-border-radius: 0.25rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #2780e3;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #343a40;--bs-list-group-bg: #fff;--bs-list-group-border-color: #dee2e6;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.25rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(52, 58, 64, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #f8f9fa;--bs-list-group-action-active-color: #343a40;--bs-list-group-action-active-bg: #e9ecef;--bs-list-group-disabled-color: rgba(52, 58, 64, 0.75);--bs-list-group-disabled-bg: #fff;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #2780e3;--bs-list-group-active-border-color: #2780e3;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.5;--bs-btn-close-hover-opacity: 0.75;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.25rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(52, 58, 64, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color)}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #fff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: #dee2e6;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: #dee2e6;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #fff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.25rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #fff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #e9ecef;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #343a40;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #343a40;--bs-offcanvas-bg: #fff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(31, 102, 182, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(31, 102, 182, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(50, 146, 19, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(50, 146, 19, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(122, 67, 150, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(122, 67, 150, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(204, 94, 19, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(204, 94, 19, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(204, 0, 46, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(204, 0, 46, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2780e3;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #613d7c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #613d7c;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #ff0039;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #f0ad4e;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #f0ad4e;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ff7518;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #3fb618;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #9954bb;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #343a40}.bg-default{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2780e3}.bg-primary{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #343a40}.bg-secondary{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #3fb618}.bg-success{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #9954bb}.bg-info{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #ff7518}.bg-warning{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #ff0039}.bg-danger{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #343a40}.bg-dark{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4053e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4053e9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3e65ba;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3e65ba;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7466c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7466c0;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d4d9f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #7d4d9f;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #7792a7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #7792a7;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7d7c92;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #7d7c92;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #319692;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #319692;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #249dc5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #249dc5;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #556ed3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #556ed3;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4d3dec;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4d3dec;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6422c3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #6422c3;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #a30aa8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a30aa8;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9d4fb0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9d4fb0;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a3389b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a3389b;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #56529b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #56529b;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #7a2bdc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #7a2bdc;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4a58a5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4a58a5;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #632bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #632bab;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #973d82;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #973d82;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #a02561;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a02561;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9a6a6a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9a6a6a;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a05354;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a05354;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #536d54;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #536d54;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #477587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #477587;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #774695;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #774695;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9b58af;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #9b58af;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b23e86;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b23e86;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #f1256b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f1256b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #eb6a73;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #eb6a73;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f1545e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f1545e;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #a46e5e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a46e5e;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #c8479f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #c8479f;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9337d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a9337d;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c20683;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c20683;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c01854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c01854;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f6195a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f6195a;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f94541;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f94541;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ff2f2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #ff2f2c;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #b2492c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b2492c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6505f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6505f;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d6226d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d6226d;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a09b8a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a09b8a;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b96e90;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b96e90;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b78060;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b78060;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ed8167;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ed8167;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f66846;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f66846;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #f69738;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f69738;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a9b138;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a9b138;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #9db86b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9db86b;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #cd897a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #cd897a;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a97969;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a97969;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c24d6f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c24d6f;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c05f40;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c05f40;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f65f46;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f65f46;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ff4625;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #ff4625;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #f98b2e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f98b2e;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #b28f18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b28f18;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6974b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6974b;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d66859;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d66859;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #35a069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #35a069;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4f746f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4f746f;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d8640;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #4d8640;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #838646;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #838646;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #8c6d25;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #8c6d25;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #86b22e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #86b22e;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #8c9c18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #8c9c18;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #33be4b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #33be4b;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #638f59;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #638f59;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #23acb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #23acb5;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3a918c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3a918c;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #797971;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #797971;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #73be7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #73be7a;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #79a764;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #79a764;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #2cc164;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #2cc164;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #509aa5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #509aa5;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #6b66cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #6b66cb;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #8539d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #8539d1;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #834ba2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #834ba2;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #b94ba8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #b94ba8;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #c23287;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #c23287;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #bc788f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #bc788f;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #c2617a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #c2617a;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #757b7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #757b7a;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #6983ad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #6983ad;color:#fff}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.bg-blue{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2780e3;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #613d7c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #613d7c;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #ff0039;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #f0ad4e;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #f0ad4e;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ff7518;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #3fb618;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #9954bb;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #343a40}.bg-default{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2780e3}.bg-primary{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #343a40}.bg-secondary{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #3fb618}.bg-success{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #9954bb}.bg-info{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #ff7518}.bg-warning{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #ff0039}.bg-danger{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #343a40}.bg-dark{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4053e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4053e9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3e65ba;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3e65ba;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7466c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7466c0;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d4d9f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #7d4d9f;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #7792a7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #7792a7;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7d7c92;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #7d7c92;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #319692;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #319692;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #249dc5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #249dc5;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #556ed3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #556ed3;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4d3dec;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4d3dec;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6422c3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #6422c3;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #a30aa8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a30aa8;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9d4fb0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9d4fb0;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a3389b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a3389b;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #56529b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #56529b;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #7a2bdc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #7a2bdc;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4a58a5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4a58a5;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #632bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #632bab;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #973d82;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #973d82;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #a02561;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a02561;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9a6a6a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9a6a6a;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a05354;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a05354;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #536d54;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #536d54;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #477587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #477587;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #774695;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #774695;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9b58af;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #9b58af;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b23e86;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b23e86;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #f1256b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f1256b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #eb6a73;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #eb6a73;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f1545e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f1545e;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #a46e5e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a46e5e;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #c8479f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #c8479f;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9337d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a9337d;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c20683;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c20683;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c01854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c01854;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f6195a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f6195a;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f94541;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f94541;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ff2f2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #ff2f2c;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #b2492c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b2492c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6505f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6505f;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d6226d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d6226d;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a09b8a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a09b8a;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b96e90;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b96e90;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b78060;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b78060;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ed8167;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ed8167;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f66846;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f66846;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #f69738;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f69738;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a9b138;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a9b138;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #9db86b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9db86b;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #cd897a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #cd897a;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a97969;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a97969;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c24d6f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c24d6f;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c05f40;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c05f40;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f65f46;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f65f46;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ff4625;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #ff4625;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #f98b2e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f98b2e;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #b28f18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b28f18;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6974b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6974b;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d66859;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d66859;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #35a069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #35a069;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4f746f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4f746f;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d8640;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #4d8640;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #838646;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #838646;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #8c6d25;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #8c6d25;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #86b22e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #86b22e;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #8c9c18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #8c9c18;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #33be4b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #33be4b;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #638f59;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #638f59;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #23acb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #23acb5;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3a918c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3a918c;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #797971;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #797971;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #73be7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #73be7a;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #79a764;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #79a764;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #2cc164;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #2cc164;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #509aa5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #509aa5;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #6b66cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #6b66cb;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #8539d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #8539d1;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #834ba2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #834ba2;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #b94ba8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #b94ba8;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #c23287;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #c23287;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #bc788f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #bc788f;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #c2617a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #c2617a;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #757b7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #757b7a;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #6983ad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #6983ad;color:#fff}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.25rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}:root{--bslib-page-sidebar-title-bg: #f8f9fa;--bslib-page-sidebar-title-color: #000}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #dee2e6}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #fff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.quarto-container{min-height:calc(100vh - 132px)}body.hypothesis-enabled #quarto-header{margin-right:16px}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}footer.footer div.nav-footer p:first-child{margin-top:0}footer.footer div.nav-footer p:last-child{margin-bottom:0}#quarto-content>*{padding-top:14px}#quarto-content>#quarto-sidebar-glass{padding-top:0px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-brand-container{order:2}.navbar .navbar-toggler{order:1}.navbar .navbar-container>.navbar-nav{order:20}.navbar .navbar-container>.navbar-brand-container{margin-left:0 !important;margin-right:0 !important}.navbar .navbar-collapse{order:20}.navbar #quarto-search{order:4;margin-left:auto}.navbar .navbar-toggler{margin-right:.5em}.navbar-collapse .quarto-navbar-tools{margin-left:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools{order:3}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:#545555}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#1f4eb6}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em;line-height:1rem;margin-top:.4rem}.sidebar-section{padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between;cursor:pointer}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-item-text{width:100%}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-title-breadcrumbs{display:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-title-breadcrumbs .breadcrumb{margin-bottom:.5em;font-size:.9rem}.quarto-title-breadcrumbs .breadcrumb li:last-of-type a{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{color:#595959}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.no-decor{text-decoration:none}.quarto-secondary-nav-title{margin-top:.3em;color:#595959;padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(33,81,191,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:#8c8c8c}.breadcrumb-item{line-height:1.2rem}div.sidebar-item-container{color:#595959}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(33,81,191,.8)}div.sidebar-item-container.disabled{color:rgba(89,89,89,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:#2151bf}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#fff}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #dee2e6}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#fff;border-bottom:1px solid #dee2e6}.quarto-banner nav.quarto-secondary-nav{background-color:#f8f9fa;color:#545555;border-top:1px solid #dee2e6}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(min-width: 992px){#quarto-sidebar-glass{display:none}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:rgba(102,102,102,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#1f4eb6}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions a,.nav-footer .toc-actions a:hover{text-decoration:none}.nav-footer .toc-actions ul{display:flex;list-style:none}.nav-footer .toc-actions ul :first-child{margin-left:auto}.nav-footer .toc-actions ul :last-child{margin-right:auto}.nav-footer .toc-actions ul li{padding-right:1.5em}.nav-footer .toc-actions ul li i.bi{padding-right:.4em}.nav-footer .toc-actions ul li:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#fff}body.nav-fixed{padding-top:64px}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#757575}.nav-footer a{color:#757575}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}@media(min-width: 768px){.nav-footer-left{flex:1 1 0px;text-align:left}}@media(max-width: 575.98px){.nav-footer-left{margin-bottom:1em;flex:100%}}@media(min-width: 768px){.nav-footer-right{flex:1 1 0px;text-align:right}}@media(max-width: 575.98px){.nav-footer-right{margin-bottom:1em;flex:100%}}.nav-footer-center{text-align:center;min-height:3em}@media(min-width: 768px){.nav-footer-center{flex:1 1 0px}}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-bottom:1em;flex:100%}}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em;order:10}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#545555;border-radius:3px}@media(max-width: 991.98px){.quarto-reader-toggle{display:none}}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:#595959;border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#fff;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}#quarto-announcement{padding:.5em;display:flex;justify-content:space-between;margin-bottom:0;font-size:.9em}#quarto-announcement .quarto-announcement-content{margin-right:auto}#quarto-announcement .quarto-announcement-content p{margin-bottom:0}#quarto-announcement .quarto-announcement-icon{margin-right:.5em;font-size:1.2em;margin-top:-0.15em}#quarto-announcement .quarto-announcement-action{cursor:pointer}.aa-DetachedSearchButtonQuery{display:none}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#fff;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}.navbar.navbar-expand-sm #quarto-search,.navbar.navbar-expand-md #quarto-search{order:999}@media(min-width: 992px){.navbar .quarto-navbar-tools{order:900}}@media(min-width: 992px){.navbar .quarto-navbar-tools.tools-end{margin-left:auto !important}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#545555;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#545555;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;color:#343a40;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#343a40;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#343a40;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#343a40;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + calc(1px * 2))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#343a40;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #dee2e6 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#f2f2f2;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#4b95e8}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#343a40}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:#e5effc}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#fff;color:#343a40}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#fff;border-color:#dee2e6;color:#343a40}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:0em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs,#quarto-search-results .aa-Item .search-item .search-result-crumbs{white-space:nowrap;text-overflow:ellipsis;font-size:.8em;font-weight:300;margin-right:1em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap),#quarto-search-results .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap){max-width:30%;margin-left:auto;margin-top:.5em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap,#quarto-search-results .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap{flex-basis:100%;margin-top:0em;margin-bottom:.2em;margin-left:37px}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;flex-wrap:wrap;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:42px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #dee2e6}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#545555}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#595959}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(255,255,255,.65);width:90%;bottom:0;box-shadow:rgba(222,226,230,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#fff;border-bottom:1px solid #dee2e6;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#343a40;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(52,58,64,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-dashboard.nav-fixed.dashboard-sidebar #quarto-content.quarto-dashboard-content{padding:0em}.quarto-dashboard #quarto-content.quarto-dashboard-content{padding:1em}.quarto-dashboard #quarto-content.quarto-dashboard-content>*{padding-top:0}@media(min-width: 576px){.quarto-dashboard{height:100%}}.quarto-dashboard .card.valuebox.bslib-card.bg-primary{background-color:#5397e9 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-secondary{background-color:#343a40 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-success{background-color:#3aa716 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-info{background-color:rgba(153,84,187,.7019607843) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-warning{background-color:#fa6400 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-danger{background-color:rgba(255,0,57,.7019607843) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-light{background-color:#f8f9fa !important}.quarto-dashboard .card.valuebox.bslib-card.bg-dark{background-color:#343a40 !important}.quarto-dashboard.dashboard-fill{display:flex;flex-direction:column}.quarto-dashboard #quarto-appendix{display:none}.quarto-dashboard #quarto-header #quarto-dashboard-header{border-top:solid 1px #dae0e5;border-bottom:solid 1px #dae0e5}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav{padding-left:1em;padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav .navbar-brand-container{padding-left:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler{margin-right:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler-icon{height:1em;width:1em;background-image:url('data:image/svg+xml,')}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-brand-container{padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-title{font-size:1.1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-nav{font-size:.9em}.quarto-dashboard #quarto-dashboard-header .navbar{padding:0}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-container{padding-left:1em}.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-brand-container .nav-link,.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-nav .nav-link{padding:.7em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-color-scheme-toggle{order:9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-toggler{margin-left:.5em;order:10}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .nav-link{padding:.5em;height:100%;display:flex;align-items:center}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .active{background-color:#e0e5e9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{padding:.5em .5em .5em 0;display:flex;flex-direction:row;margin-right:2em;align-items:center}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{margin-right:auto}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{align-self:stretch}@media(min-width: 768px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:8}}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:1000;padding-bottom:.5em}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse .navbar-nav{align-self:stretch}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title{font-size:1.25em;line-height:1.1em;display:flex;flex-direction:row;flex-wrap:wrap;align-items:baseline}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title .navbar-title-text{margin-right:.4em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title a{text-decoration:none;color:inherit}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-subtitle,.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{font-size:.9rem;margin-right:.5em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{margin-left:auto}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-logo{max-height:48px;min-height:30px;object-fit:cover;margin-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-links{order:9;padding-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link-text{margin-left:.25em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link{padding-right:0em;padding-left:.7em;text-decoration:none;color:#545555}.quarto-dashboard .page-layout-custom .tab-content{padding:0;border:none}.quarto-dashboard-img-contain{height:100%;width:100%;object-fit:contain}@media(max-width: 575.98px){.quarto-dashboard .bslib-grid{grid-template-rows:minmax(1em, max-content) !important}.quarto-dashboard .sidebar-content{height:inherit}.quarto-dashboard .page-layout-custom{min-height:100vh}}.quarto-dashboard.dashboard-toolbar>.page-layout-custom,.quarto-dashboard.dashboard-sidebar>.page-layout-custom{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages{padding:0}.quarto-dashboard .callout{margin-bottom:0;margin-top:0}.quarto-dashboard .html-fill-container figure{overflow:hidden}.quarto-dashboard bslib-tooltip .rounded-pill{border:solid #6c757d 1px}.quarto-dashboard bslib-tooltip .rounded-pill .svg{fill:#343a40}.quarto-dashboard .tabset .dashboard-card-no-title .nav-tabs{margin-left:0;margin-right:auto}.quarto-dashboard .tabset .tab-content{border:none}.quarto-dashboard .tabset .card-header .nav-link[role=tab]{margin-top:-6px;padding-top:6px;padding-bottom:6px}.quarto-dashboard .card.valuebox,.quarto-dashboard .card.bslib-value-box{min-height:3rem}.quarto-dashboard .card.valuebox .card-body,.quarto-dashboard .card.bslib-value-box .card-body{padding:0}.quarto-dashboard .bslib-value-box .value-box-value{font-size:clamp(.1em,15cqw,5em)}.quarto-dashboard .bslib-value-box .value-box-showcase .bi{font-size:clamp(.1em,max(18cqw,5.2cqh),5em);text-align:center;height:1em}.quarto-dashboard .bslib-value-box .value-box-showcase .bi::before{vertical-align:1em}.quarto-dashboard .bslib-value-box .value-box-area{margin-top:auto;margin-bottom:auto}.quarto-dashboard .card figure.quarto-float{display:flex;flex-direction:column;align-items:center}.quarto-dashboard .dashboard-scrolling{padding:1em}.quarto-dashboard .full-height{height:100%}.quarto-dashboard .showcase-bottom .value-box-grid{display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;grid-template-areas:"top" "bottom"}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase i.bi{font-size:4rem}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-area{grid-area:top}.quarto-dashboard .tab-content{margin-bottom:0}.quarto-dashboard .bslib-card .bslib-navs-card-title{justify-content:stretch;align-items:end}.quarto-dashboard .card-header{display:flex;flex-wrap:wrap;justify-content:space-between}.quarto-dashboard .card-header .card-title{display:flex;flex-direction:column;justify-content:center;margin-bottom:0}.quarto-dashboard .tabset .card-toolbar{margin-bottom:1em}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{border:none;gap:var(--bslib-spacer, 1rem)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{padding:0}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.sidebar{border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.collapse-toggle{display:none}@media(max-width: 767.98px){.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{grid-template-columns:1fr;grid-template-rows:max-content 1fr}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{grid-column:1;grid-row:2}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout .sidebar{grid-column:1;grid-row:1}}.quarto-dashboard .sidebar-right .sidebar{padding-left:2.5em}.quarto-dashboard .sidebar-right .collapse-toggle{left:2px}.quarto-dashboard .quarto-dashboard .sidebar-right button.collapse-toggle:not(.transitioning){left:unset}.quarto-dashboard aside.sidebar{padding-left:1em;padding-right:1em;background-color:rgba(52,58,64,.25);color:#343a40}.quarto-dashboard .bslib-sidebar-layout>div.main{padding:.7em}.quarto-dashboard .bslib-sidebar-layout button.collapse-toggle{margin-top:.3em}.quarto-dashboard .bslib-sidebar-layout .collapse-toggle{top:0}.quarto-dashboard .bslib-sidebar-layout.sidebar-collapsed:not(.transitioning):not(.sidebar-right) .collapse-toggle{left:2px}.quarto-dashboard .sidebar>section>.h3:first-of-type{margin-top:0em}.quarto-dashboard .sidebar .h3,.quarto-dashboard .sidebar .h4,.quarto-dashboard .sidebar .h5,.quarto-dashboard .sidebar .h6{margin-top:.5em}.quarto-dashboard .sidebar form{flex-direction:column;align-items:start;margin-bottom:1em}.quarto-dashboard .sidebar form div[class*=oi-][class$=-input]{flex-direction:column}.quarto-dashboard .sidebar form[class*=oi-][class$=-toggle]{flex-direction:row-reverse;align-items:center;justify-content:start}.quarto-dashboard .sidebar form input[type=range]{margin-top:.5em;margin-right:.8em;margin-left:1em}.quarto-dashboard .sidebar label{width:fit-content}.quarto-dashboard .sidebar .card-body{margin-bottom:2em}.quarto-dashboard .sidebar .shiny-input-container{margin-bottom:1em}.quarto-dashboard .sidebar .shiny-options-group{margin-top:0}.quarto-dashboard .sidebar .control-label{margin-bottom:.3em}.quarto-dashboard .card .card-body .quarto-layout-row{align-items:stretch}.quarto-dashboard .toolbar{font-size:.9em;display:flex;flex-direction:row;border-top:solid 1px #bcbfc0;padding:1em;flex-wrap:wrap;background-color:rgba(52,58,64,.25)}.quarto-dashboard .toolbar .cell-output-display{display:flex}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar>*:last-child{margin-right:0}.quarto-dashboard .toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .toolbar .input-daterange{width:inherit}.quarto-dashboard .toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar form{width:fit-content}.quarto-dashboard .toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .toolbar form input[type=date]{width:fit-content}.quarto-dashboard .toolbar form input[type=color]{width:3em}.quarto-dashboard .toolbar form button{padding:.4em}.quarto-dashboard .toolbar form select{width:fit-content}.quarto-dashboard .toolbar>*{font-size:.9em;flex-grow:0}.quarto-dashboard .toolbar .shiny-input-container label{margin-bottom:1px}.quarto-dashboard .toolbar-bottom{margin-top:1em;margin-bottom:0 !important;order:2}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>.tab-content>.tab-pane>*:not(.bslib-sidebar-layout){padding:1em}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>*:not(.tab-content){padding:1em}.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page>.dashboard-toolbar-container>.toolbar-content,.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page:not(.dashboard-sidebar-container)>*:not(.dashboard-toolbar-container){padding:1em}.quarto-dashboard .toolbar-content{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages .tab-pane>.dashboard-toolbar-container .toolbar{border-radius:0;margin-bottom:0}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar{border-bottom:1px solid rgba(0,0,0,.175)}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar-bottom{margin-top:0}.quarto-dashboard .dashboard-toolbar-container:not(.toolbar-toplevel) .toolbar{margin-bottom:1em;border-top:none;border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .vega-embed.has-actions details{width:1.7em;height:2em;position:absolute !important;top:0;right:0}.quarto-dashboard .dashboard-toolbar-container{padding:0}.quarto-dashboard .card .card-header p:last-child,.quarto-dashboard .card .card-footer p:last-child{margin-bottom:0}.quarto-dashboard .card .card-body>.h4:first-child{margin-top:0}.quarto-dashboard .card .card-body{z-index:4}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_length,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_info,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate{text-align:initial}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_filter{text-align:right}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:initial}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding-top:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper table{flex-shrink:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons{margin-bottom:.5em;margin-left:auto;width:fit-content;float:right}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons.btn-group{background:#fff;border:none}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn-secondary{background-color:#fff;background-image:none;border:solid #dee2e6 1px;padding:.2em .7em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn span{font-size:.8em;color:#343a40}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{margin-left:.5em;margin-bottom:.5em;padding-top:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.875em}}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.8em}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter{margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter input[type=search]{padding:1px 5px 1px 5px;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length{flex-basis:1 1 50%;margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length select{padding:.4em 3em .4em .5em;font-size:.875em;margin-left:.2em;margin-right:.2em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{flex-shrink:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{margin-left:auto}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate ul.pagination .paginate_button .page-link{font-size:.8em}.quarto-dashboard .card .card-footer{font-size:.9em}.quarto-dashboard .card .card-toolbar{display:flex;flex-grow:1;flex-direction:row;width:100%;flex-wrap:wrap}.quarto-dashboard .card .card-toolbar>*{font-size:.8em;flex-grow:0}.quarto-dashboard .card .card-toolbar>.card-title{font-size:1em;flex-grow:1;align-self:flex-start;margin-top:.1em}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar form{width:fit-content}.quarto-dashboard .card .card-toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=date]{width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=color]{width:3em}.quarto-dashboard .card .card-toolbar form button{padding:.4em}.quarto-dashboard .card .card-toolbar form select{width:fit-content}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .card .card-toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .card .card-toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .card .card-toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange{width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .card .card-toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .card .card-toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .card .card-toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .card .card-toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card-body>table>thead{border-top:none}.quarto-dashboard .card-body>.table>:not(caption)>*>*{background-color:#fff}.tableFloatingHeaderOriginal{background-color:#fff;position:sticky !important;top:0 !important}.dashboard-data-table{margin-top:-1px}div.value-box-area span.observablehq--number{font-size:calc(clamp(.1em,15cqw,5em)*1.25);line-height:1.2;color:inherit;font-family:var(--bs-body-font-family)}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#fff;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:rgba(52,58,64,.25);flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none;word-break:keep-all}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post .body pre code{white-space:pre-wrap}div.quarto-post a{color:#343a40;text-decoration:none}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#2761e3}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#2761e3}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#2761e3}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#2761e3}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#2761e3}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #dee2e6;border-radius:.25rem;color:#343a40;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#343a40}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre-wrap}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}div.ansi-escaped-output{font-family:monospace;display:block}/*!
*
* ansi colors from IPython notebook's
*
diff --git a/site_libs/crosstalk-1.2.1/css/crosstalk.min.css b/site_libs/crosstalk-1.2.1/css/crosstalk.min.css
deleted file mode 100644
index 6b45382..0000000
--- a/site_libs/crosstalk-1.2.1/css/crosstalk.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.container-fluid.crosstalk-bscols{margin-left:-30px;margin-right:-30px;white-space:normal}body>.container-fluid.crosstalk-bscols{margin-left:auto;margin-right:auto}.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column{display:inline-block;padding-right:12px;vertical-align:top}@media only screen and (max-width: 480px){.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column{display:block;padding-right:inherit}}.crosstalk-input{margin-bottom:15px}.crosstalk-input .control-label{margin-bottom:0;vertical-align:middle}.crosstalk-input input[type="checkbox"]{margin:4px 0 0;margin-top:1px;line-height:normal}.crosstalk-input .checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.crosstalk-input .checkbox>label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.crosstalk-input .checkbox input[type="checkbox"],.crosstalk-input .checkbox-inline input[type="checkbox"]{position:absolute;margin-top:2px;margin-left:-20px}.crosstalk-input .checkbox+.checkbox{margin-top:-5px}.crosstalk-input .checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.crosstalk-input .checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}
diff --git a/site_libs/crosstalk-1.2.1/js/crosstalk.js b/site_libs/crosstalk-1.2.1/js/crosstalk.js
deleted file mode 100644
index fd9eb53..0000000
--- a/site_libs/crosstalk-1.2.1/js/crosstalk.js
+++ /dev/null
@@ -1,1474 +0,0 @@
-(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o b) {
- return 1;
- }
-}
-
-/**
- * @private
- */
-
-var FilterSet = function () {
- function FilterSet() {
- _classCallCheck(this, FilterSet);
-
- this.reset();
- }
-
- _createClass(FilterSet, [{
- key: "reset",
- value: function reset() {
- // Key: handle ID, Value: array of selected keys, or null
- this._handles = {};
- // Key: key string, Value: count of handles that include it
- this._keys = {};
- this._value = null;
- this._activeHandles = 0;
- }
- }, {
- key: "update",
- value: function update(handleId, keys) {
- if (keys !== null) {
- keys = keys.slice(0); // clone before sorting
- keys.sort(naturalComparator);
- }
-
- var _diffSortedLists = (0, _util.diffSortedLists)(this._handles[handleId], keys),
- added = _diffSortedLists.added,
- removed = _diffSortedLists.removed;
-
- this._handles[handleId] = keys;
-
- for (var i = 0; i < added.length; i++) {
- this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;
- }
- for (var _i = 0; _i < removed.length; _i++) {
- this._keys[removed[_i]]--;
- }
-
- this._updateValue(keys);
- }
-
- /**
- * @param {string[]} keys Sorted array of strings that indicate
- * a superset of possible keys.
- * @private
- */
-
- }, {
- key: "_updateValue",
- value: function _updateValue() {
- var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._allKeys;
-
- var handleCount = Object.keys(this._handles).length;
- if (handleCount === 0) {
- this._value = null;
- } else {
- this._value = [];
- for (var i = 0; i < keys.length; i++) {
- var count = this._keys[keys[i]];
- if (count === handleCount) {
- this._value.push(keys[i]);
- }
- }
- }
- }
- }, {
- key: "clear",
- value: function clear(handleId) {
- if (typeof this._handles[handleId] === "undefined") {
- return;
- }
-
- var keys = this._handles[handleId];
- if (!keys) {
- keys = [];
- }
-
- for (var i = 0; i < keys.length; i++) {
- this._keys[keys[i]]--;
- }
- delete this._handles[handleId];
-
- this._updateValue();
- }
- }, {
- key: "value",
- get: function get() {
- return this._value;
- }
- }, {
- key: "_allKeys",
- get: function get() {
- var allKeys = Object.keys(this._keys);
- allKeys.sort(naturalComparator);
- return allKeys;
- }
- }]);
-
- return FilterSet;
-}();
-
-exports.default = FilterSet;
-
-},{"./util":11}],4:[function(require,module,exports){
-(function (global){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
-
-exports.default = group;
-
-var _var2 = require("./var");
-
-var _var3 = _interopRequireDefault(_var2);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-// Use a global so that multiple copies of crosstalk.js can be loaded and still
-// have groups behave as singletons across all copies.
-global.__crosstalk_groups = global.__crosstalk_groups || {};
-var groups = global.__crosstalk_groups;
-
-function group(groupName) {
- if (groupName && typeof groupName === "string") {
- if (!groups.hasOwnProperty(groupName)) {
- groups[groupName] = new Group(groupName);
- }
- return groups[groupName];
- } else if ((typeof groupName === "undefined" ? "undefined" : _typeof(groupName)) === "object" && groupName._vars && groupName.var) {
- // Appears to already be a group object
- return groupName;
- } else if (Array.isArray(groupName) && groupName.length == 1 && typeof groupName[0] === "string") {
- return group(groupName[0]);
- } else {
- throw new Error("Invalid groupName argument");
- }
-}
-
-var Group = function () {
- function Group(name) {
- _classCallCheck(this, Group);
-
- this.name = name;
- this._vars = {};
- }
-
- _createClass(Group, [{
- key: "var",
- value: function _var(name) {
- if (!name || typeof name !== "string") {
- throw new Error("Invalid var name");
- }
-
- if (!this._vars.hasOwnProperty(name)) this._vars[name] = new _var3.default(this, name);
- return this._vars[name];
- }
- }, {
- key: "has",
- value: function has(name) {
- if (!name || typeof name !== "string") {
- throw new Error("Invalid var name");
- }
-
- return this._vars.hasOwnProperty(name);
- }
- }]);
-
- return Group;
-}();
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{"./var":12}],5:[function(require,module,exports){
-(function (global){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _group = require("./group");
-
-var _group2 = _interopRequireDefault(_group);
-
-var _selection = require("./selection");
-
-var _filter = require("./filter");
-
-var _input = require("./input");
-
-require("./input_selectize");
-
-require("./input_checkboxgroup");
-
-require("./input_slider");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var defaultGroup = (0, _group2.default)("default");
-
-function var_(name) {
- return defaultGroup.var(name);
-}
-
-function has(name) {
- return defaultGroup.has(name);
-}
-
-if (global.Shiny) {
- global.Shiny.addCustomMessageHandler("update-client-value", function (message) {
- if (typeof message.group === "string") {
- (0, _group2.default)(message.group).var(message.name).set(message.value);
- } else {
- var_(message.name).set(message.value);
- }
- });
-}
-
-var crosstalk = {
- group: _group2.default,
- var: var_,
- has: has,
- SelectionHandle: _selection.SelectionHandle,
- FilterHandle: _filter.FilterHandle,
- bind: _input.bind
-};
-
-/**
- * @namespace crosstalk
- */
-exports.default = crosstalk;
-
-global.crosstalk = crosstalk;
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{"./filter":2,"./group":4,"./input":6,"./input_checkboxgroup":7,"./input_selectize":8,"./input_slider":9,"./selection":10}],6:[function(require,module,exports){
-(function (global){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.register = register;
-exports.bind = bind;
-var $ = global.jQuery;
-
-var bindings = {};
-
-function register(reg) {
- bindings[reg.className] = reg;
- if (global.document && global.document.readyState !== "complete") {
- $(function () {
- bind();
- });
- } else if (global.document) {
- setTimeout(bind, 100);
- }
-}
-
-function bind() {
- Object.keys(bindings).forEach(function (className) {
- var binding = bindings[className];
- $("." + binding.className).not(".crosstalk-input-bound").each(function (i, el) {
- bindInstance(binding, el);
- });
- });
-}
-
-// Escape jQuery identifier
-function $escape(val) {
- return val.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1");
-}
-
-function bindEl(el) {
- var $el = $(el);
- Object.keys(bindings).forEach(function (className) {
- if ($el.hasClass(className) && !$el.hasClass("crosstalk-input-bound")) {
- var binding = bindings[className];
- bindInstance(binding, el);
- }
- });
-}
-
-function bindInstance(binding, el) {
- var jsonEl = $(el).find("script[type='application/json'][data-for='" + $escape(el.id) + "']");
- var data = JSON.parse(jsonEl[0].innerText);
-
- var instance = binding.factory(el, data);
- $(el).data("crosstalk-instance", instance);
- $(el).addClass("crosstalk-input-bound");
-}
-
-if (global.Shiny) {
- var inputBinding = new global.Shiny.InputBinding();
- var _$ = global.jQuery;
- _$.extend(inputBinding, {
- find: function find(scope) {
- return _$(scope).find(".crosstalk-input");
- },
- initialize: function initialize(el) {
- if (!_$(el).hasClass("crosstalk-input-bound")) {
- bindEl(el);
- }
- },
- getId: function getId(el) {
- return el.id;
- },
- getValue: function getValue(el) {},
- setValue: function setValue(el, value) {},
- receiveMessage: function receiveMessage(el, data) {},
- subscribe: function subscribe(el, callback) {
- _$(el).data("crosstalk-instance").resume();
- },
- unsubscribe: function unsubscribe(el) {
- _$(el).data("crosstalk-instance").suspend();
- }
- });
- global.Shiny.inputBindings.register(inputBinding, "crosstalk.inputBinding");
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{}],7:[function(require,module,exports){
-(function (global){
-"use strict";
-
-var _input = require("./input");
-
-var input = _interopRequireWildcard(_input);
-
-var _filter = require("./filter");
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-var $ = global.jQuery;
-
-input.register({
- className: "crosstalk-input-checkboxgroup",
-
- factory: function factory(el, data) {
- /*
- * map: {"groupA": ["keyA", "keyB", ...], ...}
- * group: "ct-groupname"
- */
- var ctHandle = new _filter.FilterHandle(data.group);
-
- var lastKnownKeys = void 0;
- var $el = $(el);
- $el.on("change", "input[type='checkbox']", function () {
- var checked = $el.find("input[type='checkbox']:checked");
- if (checked.length === 0) {
- lastKnownKeys = null;
- ctHandle.clear();
- } else {
- var keys = {};
- checked.each(function () {
- data.map[this.value].forEach(function (key) {
- keys[key] = true;
- });
- });
- var keyArray = Object.keys(keys);
- keyArray.sort();
- lastKnownKeys = keyArray;
- ctHandle.set(keyArray);
- }
- });
-
- return {
- suspend: function suspend() {
- ctHandle.clear();
- },
- resume: function resume() {
- if (lastKnownKeys) ctHandle.set(lastKnownKeys);
- }
- };
- }
-});
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{"./filter":2,"./input":6}],8:[function(require,module,exports){
-(function (global){
-"use strict";
-
-var _input = require("./input");
-
-var input = _interopRequireWildcard(_input);
-
-var _util = require("./util");
-
-var util = _interopRequireWildcard(_util);
-
-var _filter = require("./filter");
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-var $ = global.jQuery;
-
-input.register({
- className: "crosstalk-input-select",
-
- factory: function factory(el, data) {
- /*
- * items: {value: [...], label: [...]}
- * map: {"groupA": ["keyA", "keyB", ...], ...}
- * group: "ct-groupname"
- */
-
- var first = [{ value: "", label: "(All)" }];
- var items = util.dataframeToD3(data.items);
- var opts = {
- options: first.concat(items),
- valueField: "value",
- labelField: "label",
- searchField: "label"
- };
-
- var select = $(el).find("select")[0];
-
- var selectize = $(select).selectize(opts)[0].selectize;
-
- var ctHandle = new _filter.FilterHandle(data.group);
-
- var lastKnownKeys = void 0;
- selectize.on("change", function () {
- if (selectize.items.length === 0) {
- lastKnownKeys = null;
- ctHandle.clear();
- } else {
- var keys = {};
- selectize.items.forEach(function (group) {
- data.map[group].forEach(function (key) {
- keys[key] = true;
- });
- });
- var keyArray = Object.keys(keys);
- keyArray.sort();
- lastKnownKeys = keyArray;
- ctHandle.set(keyArray);
- }
- });
-
- return {
- suspend: function suspend() {
- ctHandle.clear();
- },
- resume: function resume() {
- if (lastKnownKeys) ctHandle.set(lastKnownKeys);
- }
- };
- }
-});
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{"./filter":2,"./input":6,"./util":11}],9:[function(require,module,exports){
-(function (global){
-"use strict";
-
-var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
-
-var _input = require("./input");
-
-var input = _interopRequireWildcard(_input);
-
-var _filter = require("./filter");
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-var $ = global.jQuery;
-var strftime = global.strftime;
-
-input.register({
- className: "crosstalk-input-slider",
-
- factory: function factory(el, data) {
- /*
- * map: {"groupA": ["keyA", "keyB", ...], ...}
- * group: "ct-groupname"
- */
- var ctHandle = new _filter.FilterHandle(data.group);
-
- var opts = {};
- var $el = $(el).find("input");
- var dataType = $el.data("data-type");
- var timeFormat = $el.data("time-format");
- var round = $el.data("round");
- var timeFormatter = void 0;
-
- // Set up formatting functions
- if (dataType === "date") {
- timeFormatter = strftime.utc();
- opts.prettify = function (num) {
- return timeFormatter(timeFormat, new Date(num));
- };
- } else if (dataType === "datetime") {
- var timezone = $el.data("timezone");
- if (timezone) timeFormatter = strftime.timezone(timezone);else timeFormatter = strftime;
-
- opts.prettify = function (num) {
- return timeFormatter(timeFormat, new Date(num));
- };
- } else if (dataType === "number") {
- if (typeof round !== "undefined") opts.prettify = function (num) {
- var factor = Math.pow(10, round);
- return Math.round(num * factor) / factor;
- };
- }
-
- $el.ionRangeSlider(opts);
-
- function getValue() {
- var result = $el.data("ionRangeSlider").result;
-
- // Function for converting numeric value from slider to appropriate type.
- var convert = void 0;
- var dataType = $el.data("data-type");
- if (dataType === "date") {
- convert = function convert(val) {
- return formatDateUTC(new Date(+val));
- };
- } else if (dataType === "datetime") {
- convert = function convert(val) {
- // Convert ms to s
- return +val / 1000;
- };
- } else {
- convert = function convert(val) {
- return +val;
- };
- }
-
- if ($el.data("ionRangeSlider").options.type === "double") {
- return [convert(result.from), convert(result.to)];
- } else {
- return convert(result.from);
- }
- }
-
- var lastKnownKeys = null;
-
- $el.on("change.crosstalkSliderInput", function (event) {
- if (!$el.data("updating") && !$el.data("animating")) {
- var _getValue = getValue(),
- _getValue2 = _slicedToArray(_getValue, 2),
- from = _getValue2[0],
- to = _getValue2[1];
-
- var keys = [];
- for (var i = 0; i < data.values.length; i++) {
- var val = data.values[i];
- if (val >= from && val <= to) {
- keys.push(data.keys[i]);
- }
- }
- keys.sort();
- ctHandle.set(keys);
- lastKnownKeys = keys;
- }
- });
-
- // let $el = $(el);
- // $el.on("change", "input[type="checkbox"]", function() {
- // let checked = $el.find("input[type="checkbox"]:checked");
- // if (checked.length === 0) {
- // ctHandle.clear();
- // } else {
- // let keys = {};
- // checked.each(function() {
- // data.map[this.value].forEach(function(key) {
- // keys[key] = true;
- // });
- // });
- // let keyArray = Object.keys(keys);
- // keyArray.sort();
- // ctHandle.set(keyArray);
- // }
- // });
-
- return {
- suspend: function suspend() {
- ctHandle.clear();
- },
- resume: function resume() {
- if (lastKnownKeys) ctHandle.set(lastKnownKeys);
- }
- };
- }
-});
-
-// Convert a number to a string with leading zeros
-function padZeros(n, digits) {
- var str = n.toString();
- while (str.length < digits) {
- str = "0" + str;
- }return str;
-}
-
-// Given a Date object, return a string in yyyy-mm-dd format, using the
-// UTC date. This may be a day off from the date in the local time zone.
-function formatDateUTC(date) {
- if (date instanceof Date) {
- return date.getUTCFullYear() + "-" + padZeros(date.getUTCMonth() + 1, 2) + "-" + padZeros(date.getUTCDate(), 2);
- } else {
- return null;
- }
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{"./filter":2,"./input":6}],10:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.SelectionHandle = undefined;
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-var _events = require("./events");
-
-var _events2 = _interopRequireDefault(_events);
-
-var _group = require("./group");
-
-var _group2 = _interopRequireDefault(_group);
-
-var _util = require("./util");
-
-var util = _interopRequireWildcard(_util);
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * Use this class to read and write (and listen for changes to) the selection
- * for a Crosstalk group. This is intended to be used for linked brushing.
- *
- * If two (or more) `SelectionHandle` instances in the same webpage share the
- * same group name, they will share the same state. Setting the selection using
- * one `SelectionHandle` instance will result in the `value` property instantly
- * changing across the others, and `"change"` event listeners on all instances
- * (including the one that initiated the sending) will fire.
- *
- * @param {string} [group] - The name of the Crosstalk group, or if none,
- * null or undefined (or any other falsy value). This can be changed later
- * via the [SelectionHandle#setGroup](#setGroup) method.
- * @param {Object} [extraInfo] - An object whose properties will be copied to
- * the event object whenever an event is emitted.
- */
-var SelectionHandle = exports.SelectionHandle = function () {
- function SelectionHandle() {
- var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
- var extraInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
-
- _classCallCheck(this, SelectionHandle);
-
- this._eventRelay = new _events2.default();
- this._emitter = new util.SubscriptionTracker(this._eventRelay);
-
- // Name of the group we're currently tracking, if any. Can change over time.
- this._group = null;
- // The Var we're currently tracking, if any. Can change over time.
- this._var = null;
- // The event handler subscription we currently have on var.on("change").
- this._varOnChangeSub = null;
-
- this._extraInfo = util.extend({ sender: this }, extraInfo);
-
- this.setGroup(group);
- }
-
- /**
- * Changes the Crosstalk group membership of this SelectionHandle. The group
- * being switched away from (if any) will not have its selection value
- * modified as a result of calling `setGroup`, even if this handle was the
- * most recent handle to set the selection of the group.
- *
- * The group being switched to (if any) will also not have its selection value
- * modified as a result of calling `setGroup`. If you want to set the
- * selection value of the new group, call `set` explicitly.
- *
- * @param {string} group - The name of the Crosstalk group, or null (or
- * undefined) to clear the group.
- */
-
-
- _createClass(SelectionHandle, [{
- key: "setGroup",
- value: function setGroup(group) {
- var _this = this;
-
- // If group is unchanged, do nothing
- if (this._group === group) return;
- // Treat null, undefined, and other falsy values the same
- if (!this._group && !group) return;
-
- if (this._var) {
- this._var.off("change", this._varOnChangeSub);
- this._var = null;
- this._varOnChangeSub = null;
- }
-
- this._group = group;
-
- if (group) {
- this._var = (0, _group2.default)(group).var("selection");
- var sub = this._var.on("change", function (e) {
- _this._eventRelay.trigger("change", e, _this);
- });
- this._varOnChangeSub = sub;
- }
- }
-
- /**
- * Retrieves the current selection for the group represented by this
- * `SelectionHandle`.
- *
- * - If no selection is active, then this value will be falsy.
- * - If a selection is active, but no data points are selected, then this
- * value will be an empty array.
- * - If a selection is active, and data points are selected, then the keys
- * of the selected data points will be present in the array.
- */
-
- }, {
- key: "_mergeExtraInfo",
-
-
- /**
- * Combines the given `extraInfo` (if any) with the handle's default
- * `_extraInfo` (if any).
- * @private
- */
- value: function _mergeExtraInfo(extraInfo) {
- // Important incidental effect: shallow clone is returned
- return util.extend({}, this._extraInfo ? this._extraInfo : null, extraInfo ? extraInfo : null);
- }
-
- /**
- * Overwrites the current selection for the group, and raises the `"change"`
- * event among all of the group's '`SelectionHandle` instances (including
- * this one).
- *
- * @fires SelectionHandle#change
- * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see
- * {@link SelectionHandle#value}).
- * @param {Object} [extraInfo] - Extra properties to be included on the event
- * object that's passed to listeners (in addition to any options that were
- * passed into the `SelectionHandle` constructor).
- */
-
- }, {
- key: "set",
- value: function set(selectedKeys, extraInfo) {
- if (this._var) this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));
- }
-
- /**
- * Overwrites the current selection for the group, and raises the `"change"`
- * event among all of the group's '`SelectionHandle` instances (including
- * this one).
- *
- * @fires SelectionHandle#change
- * @param {Object} [extraInfo] - Extra properties to be included on the event
- * object that's passed to listeners (in addition to any that were passed
- * into the `SelectionHandle` constructor).
- */
-
- }, {
- key: "clear",
- value: function clear(extraInfo) {
- if (this._var) this.set(void 0, this._mergeExtraInfo(extraInfo));
- }
-
- /**
- * Subscribes to events on this `SelectionHandle`.
- *
- * @param {string} eventType - Indicates the type of events to listen to.
- * Currently, only `"change"` is supported.
- * @param {SelectionHandle~listener} listener - The callback function that
- * will be invoked when the event occurs.
- * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel
- * this subscription.
- */
-
- }, {
- key: "on",
- value: function on(eventType, listener) {
- return this._emitter.on(eventType, listener);
- }
-
- /**
- * Cancels event subscriptions created by {@link SelectionHandle#on}.
- *
- * @param {string} eventType - The type of event to unsubscribe.
- * @param {string|SelectionHandle~listener} listener - Either the callback
- * function previously passed into {@link SelectionHandle#on}, or the
- * string that was returned from {@link SelectionHandle#on}.
- */
-
- }, {
- key: "off",
- value: function off(eventType, listener) {
- return this._emitter.off(eventType, listener);
- }
-
- /**
- * Shuts down the `SelectionHandle` object.
- *
- * Removes all event listeners that were added through this handle.
- */
-
- }, {
- key: "close",
- value: function close() {
- this._emitter.removeAllListeners();
- this.setGroup(null);
- }
- }, {
- key: "value",
- get: function get() {
- return this._var ? this._var.get() : null;
- }
- }]);
-
- return SelectionHandle;
-}();
-
-/**
- * @callback SelectionHandle~listener
- * @param {Object} event - An object containing details of the event. For
- * `"change"` events, this includes the properties `value` (the new
- * value of the selection, or `undefined` if no selection is active),
- * `oldValue` (the previous value of the selection), and `sender` (the
- * `SelectionHandle` instance that made the change).
- */
-
-/**
- * @event SelectionHandle#change
- * @type {object}
- * @property {object} value - The new value of the selection, or `undefined`
- * if no selection is active.
- * @property {object} oldValue - The previous value of the selection.
- * @property {SelectionHandle} sender - The `SelectionHandle` instance that
- * changed the value.
- */
-
-},{"./events":1,"./group":4,"./util":11}],11:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
-
-exports.extend = extend;
-exports.checkSorted = checkSorted;
-exports.diffSortedLists = diffSortedLists;
-exports.dataframeToD3 = dataframeToD3;
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function extend(target) {
- for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- sources[_key - 1] = arguments[_key];
- }
-
- for (var i = 0; i < sources.length; i++) {
- var src = sources[i];
- if (typeof src === "undefined" || src === null) continue;
-
- for (var key in src) {
- if (src.hasOwnProperty(key)) {
- target[key] = src[key];
- }
- }
- }
- return target;
-}
-
-function checkSorted(list) {
- for (var i = 1; i < list.length; i++) {
- if (list[i] <= list[i - 1]) {
- throw new Error("List is not sorted or contains duplicate");
- }
- }
-}
-
-function diffSortedLists(a, b) {
- var i_a = 0;
- var i_b = 0;
-
- if (!a) a = [];
- if (!b) b = [];
-
- var a_only = [];
- var b_only = [];
-
- checkSorted(a);
- checkSorted(b);
-
- while (i_a < a.length && i_b < b.length) {
- if (a[i_a] === b[i_b]) {
- i_a++;
- i_b++;
- } else if (a[i_a] < b[i_b]) {
- a_only.push(a[i_a++]);
- } else {
- b_only.push(b[i_b++]);
- }
- }
-
- if (i_a < a.length) a_only = a_only.concat(a.slice(i_a));
- if (i_b < b.length) b_only = b_only.concat(b.slice(i_b));
- return {
- removed: a_only,
- added: b_only
- };
-}
-
-// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }
-// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]
-function dataframeToD3(df) {
- var names = [];
- var length = void 0;
- for (var name in df) {
- if (df.hasOwnProperty(name)) names.push(name);
- if (_typeof(df[name]) !== "object" || typeof df[name].length === "undefined") {
- throw new Error("All fields must be arrays");
- } else if (typeof length !== "undefined" && length !== df[name].length) {
- throw new Error("All fields must be arrays of the same length");
- }
- length = df[name].length;
- }
- var results = [];
- var item = void 0;
- for (var row = 0; row < length; row++) {
- item = {};
- for (var col = 0; col < names.length; col++) {
- item[names[col]] = df[names[col]][row];
- }
- results.push(item);
- }
- return results;
-}
-
-/**
- * Keeps track of all event listener additions/removals and lets all active
- * listeners be removed with a single operation.
- *
- * @private
- */
-
-var SubscriptionTracker = exports.SubscriptionTracker = function () {
- function SubscriptionTracker(emitter) {
- _classCallCheck(this, SubscriptionTracker);
-
- this._emitter = emitter;
- this._subs = {};
- }
-
- _createClass(SubscriptionTracker, [{
- key: "on",
- value: function on(eventType, listener) {
- var sub = this._emitter.on(eventType, listener);
- this._subs[sub] = eventType;
- return sub;
- }
- }, {
- key: "off",
- value: function off(eventType, listener) {
- var sub = this._emitter.off(eventType, listener);
- if (sub) {
- delete this._subs[sub];
- }
- return sub;
- }
- }, {
- key: "removeAllListeners",
- value: function removeAllListeners() {
- var _this = this;
-
- var current_subs = this._subs;
- this._subs = {};
- Object.keys(current_subs).forEach(function (sub) {
- _this._emitter.off(current_subs[sub], sub);
- });
- }
- }]);
-
- return SubscriptionTracker;
-}();
-
-},{}],12:[function(require,module,exports){
-(function (global){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-var _events = require("./events");
-
-var _events2 = _interopRequireDefault(_events);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-var Var = function () {
- function Var(group, name, /*optional*/value) {
- _classCallCheck(this, Var);
-
- this._group = group;
- this._name = name;
- this._value = value;
- this._events = new _events2.default();
- }
-
- _createClass(Var, [{
- key: "get",
- value: function get() {
- return this._value;
- }
- }, {
- key: "set",
- value: function set(value, /*optional*/event) {
- if (this._value === value) {
- // Do nothing; the value hasn't changed
- return;
- }
- var oldValue = this._value;
- this._value = value;
- // Alert JavaScript listeners that the value has changed
- var evt = {};
- if (event && (typeof event === "undefined" ? "undefined" : _typeof(event)) === "object") {
- for (var k in event) {
- if (event.hasOwnProperty(k)) evt[k] = event[k];
- }
- }
- evt.oldValue = oldValue;
- evt.value = value;
- this._events.trigger("change", evt, this);
-
- // TODO: Make this extensible, to let arbitrary back-ends know that
- // something has changed
- if (global.Shiny && global.Shiny.onInputChange) {
- global.Shiny.onInputChange(".clientValue-" + (this._group.name !== null ? this._group.name + "-" : "") + this._name, typeof value === "undefined" ? null : value);
- }
- }
- }, {
- key: "on",
- value: function on(eventType, listener) {
- return this._events.on(eventType, listener);
- }
- }, {
- key: "off",
- value: function off(eventType, listener) {
- return this._events.off(eventType, listener);
- }
- }]);
-
- return Var;
-}();
-
-exports.default = Var;
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{"./events":1}]},{},[5])
-//# sourceMappingURL=crosstalk.js.map
diff --git a/site_libs/crosstalk-1.2.1/js/crosstalk.js.map b/site_libs/crosstalk-1.2.1/js/crosstalk.js.map
deleted file mode 100644
index cff94f0..0000000
--- a/site_libs/crosstalk-1.2.1/js/crosstalk.js.map
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "version": 3,
- "sources": [
- "node_modules/browser-pack/_prelude.js",
- "javascript/src/events.js",
- "javascript/src/filter.js",
- "javascript/src/filterset.js",
- "javascript/src/group.js",
- "javascript/src/index.js",
- "javascript/src/input.js",
- "javascript/src/input_checkboxgroup.js",
- "javascript/src/input_selectize.js",
- "javascript/src/input_slider.js",
- "javascript/src/selection.js",
- "javascript/src/util.js",
- "javascript/src/var.js"
- ],
- "names": [],
- "mappings": "AAAA;;;;;;;;;;;ICAqB,M;AACnB,oBAAc;AAAA;;AACZ,SAAK,MAAL,GAAc,EAAd;AACA,SAAK,IAAL,GAAY,CAAZ;AACD;;;;uBAEE,S,EAAW,Q,EAAU;AACtB,UAAI,OAAO,KAAK,MAAL,CAAY,SAAZ,CAAX;AACA,UAAI,CAAC,IAAL,EAAW;AACT,eAAO,KAAK,MAAL,CAAY,SAAZ,IAAyB,EAAhC;AACD;AACD,UAAI,MAAM,QAAS,KAAK,IAAL,EAAnB;AACA,WAAK,GAAL,IAAY,QAAZ;AACA,aAAO,GAAP;AACD;;AAED;;;;wBACI,S,EAAW,Q,EAAU;AACvB,UAAI,OAAO,KAAK,MAAL,CAAY,SAAZ,CAAX;AACA,UAAI,OAAO,QAAP,KAAqB,UAAzB,EAAqC;AACnC,aAAK,IAAI,GAAT,IAAgB,IAAhB,EAAsB;AACpB,cAAI,KAAK,cAAL,CAAoB,GAApB,CAAJ,EAA8B;AAC5B,gBAAI,KAAK,GAAL,MAAc,QAAlB,EAA4B;AAC1B,qBAAO,KAAK,GAAL,CAAP;AACA,qBAAO,GAAP;AACD;AACF;AACF;AACD,eAAO,KAAP;AACD,OAVD,MAUO,IAAI,OAAO,QAAP,KAAqB,QAAzB,EAAmC;AACxC,YAAI,QAAQ,KAAK,QAAL,CAAZ,EAA4B;AAC1B,iBAAO,KAAK,QAAL,CAAP;AACA,iBAAO,QAAP;AACD;AACD,eAAO,KAAP;AACD,OANM,MAMA;AACL,cAAM,IAAI,KAAJ,CAAU,8BAAV,CAAN;AACD;AACF;;;4BAEO,S,EAAW,G,EAAK,O,EAAS;AAC/B,UAAI,OAAO,KAAK,MAAL,CAAY,SAAZ,CAAX;AACA,WAAK,IAAI,GAAT,IAAgB,IAAhB,EAAsB;AACpB,YAAI,KAAK,cAAL,CAAoB,GAApB,CAAJ,EAA8B;AAC5B,eAAK,GAAL,EAAU,IAAV,CAAe,OAAf,EAAwB,GAAxB;AACD;AACF;AACF;;;;;;kBA/CkB,M;;;;;;;;;;;;ACArB;;;;AACA;;;;AACA;;;;AACA;;IAAY,I;;;;;;;;AAEZ,SAAS,YAAT,CAAsB,KAAtB,EAA6B;AAC3B,MAAI,QAAQ,MAAM,GAAN,CAAU,WAAV,CAAZ;AACA,MAAI,SAAS,MAAM,GAAN,EAAb;AACA,MAAI,CAAC,MAAL,EAAa;AACX,aAAS,yBAAT;AACA,UAAM,GAAN,CAAU,MAAV;AACD;AACD,SAAO,MAAP;AACD;;AAED,IAAI,KAAK,CAAT;AACA,SAAS,MAAT,GAAkB;AAChB,SAAO,IAAP;AACD;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;IAwBa,Y,WAAA,Y;AACX,wBAAY,KAAZ,EAAmB,SAAnB,EAA8B;AAAA;;AAC5B,SAAK,WAAL,GAAmB,sBAAnB;AACA,SAAK,QAAL,GAAgB,IAAI,KAAK,mBAAT,CAA6B,KAAK,WAAlC,CAAhB;;AAEA;AACA,SAAK,MAAL,GAAc,IAAd;AACA;AACA,SAAK,UAAL,GAAkB,IAAlB;AACA;AACA,SAAK,UAAL,GAAkB,IAAlB;AACA;AACA,SAAK,eAAL,GAAuB,IAAvB;;AAEA,SAAK,UAAL,GAAkB,KAAK,MAAL,CAAY,EAAE,QAAQ,IAAV,EAAZ,EAA8B,SAA9B,CAAlB;;AAEA,SAAK,GAAL,GAAW,WAAW,QAAtB;;AAEA,SAAK,QAAL,CAAc,KAAd;AACD;;AAED;;;;;;;;;;;;;;6BAUS,K,EAAO;AAAA;;AACd;AACA,UAAI,KAAK,MAAL,KAAgB,KAApB,EACE;AACF;AACA,UAAI,CAAC,KAAK,MAAN,IAAgB,CAAC,KAArB,EACE;;AAEF,UAAI,KAAK,UAAT,EAAqB;AACnB,aAAK,UAAL,CAAgB,GAAhB,CAAoB,QAApB,EAA8B,KAAK,eAAnC;AACA,aAAK,KAAL;AACA,aAAK,eAAL,GAAuB,IAAvB;AACA,aAAK,UAAL,GAAkB,IAAlB;AACA,aAAK,UAAL,GAAkB,IAAlB;AACD;;AAED,WAAK,MAAL,GAAc,KAAd;;AAEA,UAAI,KAAJ,EAAW;AACT,gBAAQ,qBAAI,KAAJ,CAAR;AACA,aAAK,UAAL,GAAkB,aAAa,KAAb,CAAlB;AACA,aAAK,UAAL,GAAkB,qBAAI,KAAJ,EAAW,GAAX,CAAe,QAAf,CAAlB;AACA,YAAI,MAAM,KAAK,UAAL,CAAgB,EAAhB,CAAmB,QAAnB,EAA6B,UAAC,CAAD,EAAO;AAC5C,gBAAK,WAAL,CAAiB,OAAjB,CAAyB,QAAzB,EAAmC,CAAnC;AACD,SAFS,CAAV;AAGA,aAAK,eAAL,GAAuB,GAAvB;AACD;AACF;;AAED;;;;;;;;oCAKgB,S,EAAW;AACzB,aAAO,KAAK,MAAL,CAAY,EAAZ,EACL,KAAK,UAAL,GAAkB,KAAK,UAAvB,GAAoC,IAD/B,EAEL,YAAY,SAAZ,GAAwB,IAFnB,CAAP;AAGD;;AAED;;;;;;;4BAIQ;AACN,WAAK,QAAL,CAAc,kBAAd;AACA,WAAK,KAAL;AACA,WAAK,QAAL,CAAc,IAAd;AACD;;AAED;;;;;;;;;;;;0BASM,S,EAAW;AACf,UAAI,CAAC,KAAK,UAAV,EACE;AACF,WAAK,UAAL,CAAgB,KAAhB,CAAsB,KAAK,GAA3B;AACA,WAAK,SAAL,CAAe,SAAf;AACD;;AAED;;;;;;;;;;;;;;;;;;;;wBAiBI,I,EAAM,S,EAAW;AACnB,UAAI,CAAC,KAAK,UAAV,EACE;AACF,WAAK,UAAL,CAAgB,MAAhB,CAAuB,KAAK,GAA5B,EAAiC,IAAjC;AACA,WAAK,SAAL,CAAe,SAAf;AACD;;AAED;;;;;;;;;;AASA;;;;;;;;;;uBAUG,S,EAAW,Q,EAAU;AACtB,aAAO,KAAK,QAAL,CAAc,EAAd,CAAiB,SAAjB,EAA4B,QAA5B,CAAP;AACD;;AAED;;;;;;;;;;;wBAQI,S,EAAW,Q,EAAU;AACvB,aAAO,KAAK,QAAL,CAAc,GAAd,CAAkB,SAAlB,EAA6B,QAA7B,CAAP;AACD;;;8BAES,S,EAAW;AACnB,UAAI,CAAC,KAAK,UAAV,EACE;AACF,WAAK,UAAL,CAAgB,GAAhB,CAAoB,KAAK,UAAL,CAAgB,KAApC,EAA2C,KAAK,eAAL,CAAqB,SAArB,CAA3C;AACD;;AAED;;;;;;;;;;;wBApCmB;AACjB,aAAO,KAAK,UAAL,GAAkB,KAAK,UAAL,CAAgB,KAAlC,GAA0C,IAAjD;AACD;;;;;;AA6CH;;;;;;;;;;;;;;;;;;;ACzNA;;;;AAEA,SAAS,iBAAT,CAA2B,CAA3B,EAA8B,CAA9B,EAAiC;AAC/B,MAAI,MAAM,CAAV,EAAa;AACX,WAAO,CAAP;AACD,GAFD,MAEO,IAAI,IAAI,CAAR,EAAW;AAChB,WAAO,CAAC,CAAR;AACD,GAFM,MAEA,IAAI,IAAI,CAAR,EAAW;AAChB,WAAO,CAAP;AACD;AACF;;AAED;;;;IAGqB,S;AACnB,uBAAc;AAAA;;AACZ,SAAK,KAAL;AACD;;;;4BAEO;AACN;AACA,WAAK,QAAL,GAAgB,EAAhB;AACA;AACA,WAAK,KAAL,GAAa,EAAb;AACA,WAAK,MAAL,GAAc,IAAd;AACA,WAAK,cAAL,GAAsB,CAAtB;AACD;;;2BAMM,Q,EAAU,I,EAAM;AACrB,UAAI,SAAS,IAAb,EAAmB;AACjB,eAAO,KAAK,KAAL,CAAW,CAAX,CAAP,CADiB,CACK;AACtB,aAAK,IAAL,CAAU,iBAAV;AACD;;AAJoB,6BAME,2BAAgB,KAAK,QAAL,CAAc,QAAd,CAAhB,EAAyC,IAAzC,CANF;AAAA,UAMhB,KANgB,oBAMhB,KANgB;AAAA,UAMT,OANS,oBAMT,OANS;;AAOrB,WAAK,QAAL,CAAc,QAAd,IAA0B,IAA1B;;AAEA,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,MAAM,MAA1B,EAAkC,GAAlC,EAAuC;AACrC,aAAK,KAAL,CAAW,MAAM,CAAN,CAAX,IAAuB,CAAC,KAAK,KAAL,CAAW,MAAM,CAAN,CAAX,KAAwB,CAAzB,IAA8B,CAArD;AACD;AACD,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,QAAQ,MAA5B,EAAoC,IAApC,EAAyC;AACvC,aAAK,KAAL,CAAW,QAAQ,EAAR,CAAX;AACD;;AAED,WAAK,YAAL,CAAkB,IAAlB;AACD;;AAED;;;;;;;;mCAKmC;AAAA,UAAtB,IAAsB,uEAAf,KAAK,QAAU;;AACjC,UAAI,cAAc,OAAO,IAAP,CAAY,KAAK,QAAjB,EAA2B,MAA7C;AACA,UAAI,gBAAgB,CAApB,EAAuB;AACrB,aAAK,MAAL,GAAc,IAAd;AACD,OAFD,MAEO;AACL,aAAK,MAAL,GAAc,EAAd;AACA,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,cAAI,QAAQ,KAAK,KAAL,CAAW,KAAK,CAAL,CAAX,CAAZ;AACA,cAAI,UAAU,WAAd,EAA2B;AACzB,iBAAK,MAAL,CAAY,IAAZ,CAAiB,KAAK,CAAL,CAAjB;AACD;AACF;AACF;AACF;;;0BAEK,Q,EAAU;AACd,UAAI,OAAO,KAAK,QAAL,CAAc,QAAd,CAAP,KAAoC,WAAxC,EAAqD;AACnD;AACD;;AAED,UAAI,OAAO,KAAK,QAAL,CAAc,QAAd,CAAX;AACA,UAAI,CAAC,IAAL,EAAW;AACT,eAAO,EAAP;AACD;;AAED,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,aAAK,KAAL,CAAW,KAAK,CAAL,CAAX;AACD;AACD,aAAO,KAAK,QAAL,CAAc,QAAd,CAAP;;AAEA,WAAK,YAAL;AACD;;;wBA3DW;AACV,aAAO,KAAK,MAAZ;AACD;;;wBA2Dc;AACb,UAAI,UAAU,OAAO,IAAP,CAAY,KAAK,KAAjB,CAAd;AACA,cAAQ,IAAR,CAAa,iBAAb;AACA,aAAO,OAAP;AACD;;;;;;kBA/EkB,S;;;;;;;;;;;;;;kBCRG,K;;AAPxB;;;;;;;;AAEA;AACA;AACA,OAAO,kBAAP,GAA4B,OAAO,kBAAP,IAA6B,EAAzD;AACA,IAAI,SAAS,OAAO,kBAApB;;AAEe,SAAS,KAAT,CAAe,SAAf,EAA0B;AACvC,MAAI,aAAa,OAAO,SAAP,KAAsB,QAAvC,EAAiD;AAC/C,QAAI,CAAC,OAAO,cAAP,CAAsB,SAAtB,CAAL,EAAuC;AACrC,aAAO,SAAP,IAAoB,IAAI,KAAJ,CAAU,SAAV,CAApB;AACD;AACD,WAAO,OAAO,SAAP,CAAP;AACD,GALD,MAKO,IAAI,QAAO,SAAP,yCAAO,SAAP,OAAsB,QAAtB,IAAkC,UAAU,KAA5C,IAAqD,UAAU,GAAnE,EAAwE;AAC7E;AACA,WAAO,SAAP;AACD,GAHM,MAGA,IAAI,MAAM,OAAN,CAAc,SAAd,KACP,UAAU,MAAV,IAAoB,CADb,IAEP,OAAO,UAAU,CAAV,CAAP,KAAyB,QAFtB,EAEgC;AACrC,WAAO,MAAM,UAAU,CAAV,CAAN,CAAP;AACD,GAJM,MAIA;AACL,UAAM,IAAI,KAAJ,CAAU,4BAAV,CAAN;AACD;AACF;;IAEK,K;AACJ,iBAAY,IAAZ,EAAkB;AAAA;;AAChB,SAAK,IAAL,GAAY,IAAZ;AACA,SAAK,KAAL,GAAa,EAAb;AACD;;;;yBAEG,I,EAAM;AACR,UAAI,CAAC,IAAD,IAAS,OAAO,IAAP,KAAiB,QAA9B,EAAwC;AACtC,cAAM,IAAI,KAAJ,CAAU,kBAAV,CAAN;AACD;;AAED,UAAI,CAAC,KAAK,KAAL,CAAW,cAAX,CAA0B,IAA1B,CAAL,EACE,KAAK,KAAL,CAAW,IAAX,IAAmB,kBAAQ,IAAR,EAAc,IAAd,CAAnB;AACF,aAAO,KAAK,KAAL,CAAW,IAAX,CAAP;AACD;;;wBAEG,I,EAAM;AACR,UAAI,CAAC,IAAD,IAAS,OAAO,IAAP,KAAiB,QAA9B,EAAwC;AACtC,cAAM,IAAI,KAAJ,CAAU,kBAAV,CAAN;AACD;;AAED,aAAO,KAAK,KAAL,CAAW,cAAX,CAA0B,IAA1B,CAAP;AACD;;;;;;;;;;;;;;;;AC/CH;;;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AAEA,IAAM,eAAe,qBAAM,SAAN,CAArB;;AAEA,SAAS,IAAT,CAAc,IAAd,EAAoB;AAClB,SAAO,aAAa,GAAb,CAAiB,IAAjB,CAAP;AACD;;AAED,SAAS,GAAT,CAAa,IAAb,EAAmB;AACjB,SAAO,aAAa,GAAb,CAAiB,IAAjB,CAAP;AACD;;AAED,IAAI,OAAO,KAAX,EAAkB;AAChB,SAAO,KAAP,CAAa,uBAAb,CAAqC,qBAArC,EAA4D,UAAS,OAAT,EAAkB;AAC5E,QAAI,OAAO,QAAQ,KAAf,KAA0B,QAA9B,EAAwC;AACtC,2BAAM,QAAQ,KAAd,EAAqB,GAArB,CAAyB,QAAQ,IAAjC,EAAuC,GAAvC,CAA2C,QAAQ,KAAnD;AACD,KAFD,MAEO;AACL,WAAK,QAAQ,IAAb,EAAmB,GAAnB,CAAuB,QAAQ,KAA/B;AACD;AACF,GAND;AAOD;;AAED,IAAM,YAAY;AAChB,wBADgB;AAEhB,OAAK,IAFW;AAGhB,OAAK,GAHW;AAIhB,6CAJgB;AAKhB,oCALgB;AAMhB;AANgB,CAAlB;;AASA;;;kBAGe,S;;AACf,OAAO,SAAP,GAAmB,SAAnB;;;;;;;;;;;QCrCgB,Q,GAAA,Q;QAWA,I,GAAA,I;AAfhB,IAAI,IAAI,OAAO,MAAf;;AAEA,IAAI,WAAW,EAAf;;AAEO,SAAS,QAAT,CAAkB,GAAlB,EAAuB;AAC5B,WAAS,IAAI,SAAb,IAA0B,GAA1B;AACA,MAAI,OAAO,QAAP,IAAmB,OAAO,QAAP,CAAgB,UAAhB,KAA+B,UAAtD,EAAkE;AAChE,MAAE,YAAM;AACN;AACD,KAFD;AAGD,GAJD,MAIO,IAAI,OAAO,QAAX,EAAqB;AAC1B,eAAW,IAAX,EAAiB,GAAjB;AACD;AACF;;AAEM,SAAS,IAAT,GAAgB;AACrB,SAAO,IAAP,CAAY,QAAZ,EAAsB,OAAtB,CAA8B,UAAS,SAAT,EAAoB;AAChD,QAAI,UAAU,SAAS,SAAT,CAAd;AACA,MAAE,MAAM,QAAQ,SAAhB,EAA2B,GAA3B,CAA+B,wBAA/B,EAAyD,IAAzD,CAA8D,UAAS,CAAT,EAAY,EAAZ,EAAgB;AAC5E,mBAAa,OAAb,EAAsB,EAAtB;AACD,KAFD;AAGD,GALD;AAMD;;AAED;AACA,SAAS,OAAT,CAAiB,GAAjB,EAAsB;AACpB,SAAO,IAAI,OAAJ,CAAY,uCAAZ,EAAqD,MAArD,CAAP;AACD;;AAED,SAAS,MAAT,CAAgB,EAAhB,EAAoB;AAClB,MAAI,MAAM,EAAE,EAAF,CAAV;AACA,SAAO,IAAP,CAAY,QAAZ,EAAsB,OAAtB,CAA8B,UAAS,SAAT,EAAoB;AAChD,QAAI,IAAI,QAAJ,CAAa,SAAb,KAA2B,CAAC,IAAI,QAAJ,CAAa,uBAAb,CAAhC,EAAuE;AACrE,UAAI,UAAU,SAAS,SAAT,CAAd;AACA,mBAAa,OAAb,EAAsB,EAAtB;AACD;AACF,GALD;AAMD;;AAED,SAAS,YAAT,CAAsB,OAAtB,EAA+B,EAA/B,EAAmC;AACjC,MAAI,SAAS,EAAE,EAAF,EAAM,IAAN,CAAW,+CAA+C,QAAQ,GAAG,EAAX,CAA/C,GAAgE,IAA3E,CAAb;AACA,MAAI,OAAO,KAAK,KAAL,CAAW,OAAO,CAAP,EAAU,SAArB,CAAX;;AAEA,MAAI,WAAW,QAAQ,OAAR,CAAgB,EAAhB,EAAoB,IAApB,CAAf;AACA,IAAE,EAAF,EAAM,IAAN,CAAW,oBAAX,EAAiC,QAAjC;AACA,IAAE,EAAF,EAAM,QAAN,CAAe,uBAAf;AACD;;AAED,IAAI,OAAO,KAAX,EAAkB;AAChB,MAAI,eAAe,IAAI,OAAO,KAAP,CAAa,YAAjB,EAAnB;AACA,MAAI,KAAI,OAAO,MAAf;AACA,KAAE,MAAF,CAAS,YAAT,EAAuB;AACrB,UAAM,cAAS,KAAT,EAAgB;AACpB,aAAO,GAAE,KAAF,EAAS,IAAT,CAAc,kBAAd,CAAP;AACD,KAHoB;AAIrB,gBAAY,oBAAS,EAAT,EAAa;AACvB,UAAI,CAAC,GAAE,EAAF,EAAM,QAAN,CAAe,uBAAf,CAAL,EAA8C;AAC5C,eAAO,EAAP;AACD;AACF,KARoB;AASrB,WAAO,eAAS,EAAT,EAAa;AAClB,aAAO,GAAG,EAAV;AACD,KAXoB;AAYrB,cAAU,kBAAS,EAAT,EAAa,CAEtB,CAdoB;AAerB,cAAU,kBAAS,EAAT,EAAa,KAAb,EAAoB,CAE7B,CAjBoB;AAkBrB,oBAAgB,wBAAS,EAAT,EAAa,IAAb,EAAmB,CAElC,CApBoB;AAqBrB,eAAW,mBAAS,EAAT,EAAa,QAAb,EAAuB;AAChC,SAAE,EAAF,EAAM,IAAN,CAAW,oBAAX,EAAiC,MAAjC;AACD,KAvBoB;AAwBrB,iBAAa,qBAAS,EAAT,EAAa;AACxB,SAAE,EAAF,EAAM,IAAN,CAAW,oBAAX,EAAiC,OAAjC;AACD;AA1BoB,GAAvB;AA4BA,SAAO,KAAP,CAAa,aAAb,CAA2B,QAA3B,CAAoC,YAApC,EAAkD,wBAAlD;AACD;;;;;;;;AChFD;;IAAY,K;;AACZ;;;;AAEA,IAAI,IAAI,OAAO,MAAf;;AAEA,MAAM,QAAN,CAAe;AACb,aAAW,+BADE;;AAGb,WAAS,iBAAS,EAAT,EAAa,IAAb,EAAmB;AAC1B;;;;AAIA,QAAI,WAAW,yBAAiB,KAAK,KAAtB,CAAf;;AAEA,QAAI,sBAAJ;AACA,QAAI,MAAM,EAAE,EAAF,CAAV;AACA,QAAI,EAAJ,CAAO,QAAP,EAAiB,wBAAjB,EAA2C,YAAW;AACpD,UAAI,UAAU,IAAI,IAAJ,CAAS,gCAAT,CAAd;AACA,UAAI,QAAQ,MAAR,KAAmB,CAAvB,EAA0B;AACxB,wBAAgB,IAAhB;AACA,iBAAS,KAAT;AACD,OAHD,MAGO;AACL,YAAI,OAAO,EAAX;AACA,gBAAQ,IAAR,CAAa,YAAW;AACtB,eAAK,GAAL,CAAS,KAAK,KAAd,EAAqB,OAArB,CAA6B,UAAS,GAAT,EAAc;AACzC,iBAAK,GAAL,IAAY,IAAZ;AACD,WAFD;AAGD,SAJD;AAKA,YAAI,WAAW,OAAO,IAAP,CAAY,IAAZ,CAAf;AACA,iBAAS,IAAT;AACA,wBAAgB,QAAhB;AACA,iBAAS,GAAT,CAAa,QAAb;AACD;AACF,KAjBD;;AAmBA,WAAO;AACL,eAAS,mBAAW;AAClB,iBAAS,KAAT;AACD,OAHI;AAIL,cAAQ,kBAAW;AACjB,YAAI,aAAJ,EACE,SAAS,GAAT,CAAa,aAAb;AACH;AAPI,KAAP;AASD;AAxCY,CAAf;;;;;;;;ACLA;;IAAY,K;;AACZ;;IAAY,I;;AACZ;;;;AAEA,IAAI,IAAI,OAAO,MAAf;;AAEA,MAAM,QAAN,CAAe;AACb,aAAW,wBADE;;AAGb,WAAS,iBAAS,EAAT,EAAa,IAAb,EAAmB;AAC1B;;;;;;AAMA,QAAI,QAAQ,CAAC,EAAC,OAAO,EAAR,EAAY,OAAO,OAAnB,EAAD,CAAZ;AACA,QAAI,QAAQ,KAAK,aAAL,CAAmB,KAAK,KAAxB,CAAZ;AACA,QAAI,OAAO;AACT,eAAS,MAAM,MAAN,CAAa,KAAb,CADA;AAET,kBAAY,OAFH;AAGT,kBAAY,OAHH;AAIT,mBAAa;AAJJ,KAAX;;AAOA,QAAI,SAAS,EAAE,EAAF,EAAM,IAAN,CAAW,QAAX,EAAqB,CAArB,CAAb;;AAEA,QAAI,YAAY,EAAE,MAAF,EAAU,SAAV,CAAoB,IAApB,EAA0B,CAA1B,EAA6B,SAA7C;;AAEA,QAAI,WAAW,yBAAiB,KAAK,KAAtB,CAAf;;AAEA,QAAI,sBAAJ;AACA,cAAU,EAAV,CAAa,QAAb,EAAuB,YAAW;AAChC,UAAI,UAAU,KAAV,CAAgB,MAAhB,KAA2B,CAA/B,EAAkC;AAChC,wBAAgB,IAAhB;AACA,iBAAS,KAAT;AACD,OAHD,MAGO;AACL,YAAI,OAAO,EAAX;AACA,kBAAU,KAAV,CAAgB,OAAhB,CAAwB,UAAS,KAAT,EAAgB;AACtC,eAAK,GAAL,CAAS,KAAT,EAAgB,OAAhB,CAAwB,UAAS,GAAT,EAAc;AACpC,iBAAK,GAAL,IAAY,IAAZ;AACD,WAFD;AAGD,SAJD;AAKA,YAAI,WAAW,OAAO,IAAP,CAAY,IAAZ,CAAf;AACA,iBAAS,IAAT;AACA,wBAAgB,QAAhB;AACA,iBAAS,GAAT,CAAa,QAAb;AACD;AACF,KAhBD;;AAkBA,WAAO;AACL,eAAS,mBAAW;AAClB,iBAAS,KAAT;AACD,OAHI;AAIL,cAAQ,kBAAW;AACjB,YAAI,aAAJ,EACE,SAAS,GAAT,CAAa,aAAb;AACH;AAPI,KAAP;AASD;AArDY,CAAf;;;;;;;;;;ACNA;;IAAY,K;;AACZ;;;;AAEA,IAAI,IAAI,OAAO,MAAf;AACA,IAAI,WAAW,OAAO,QAAtB;;AAEA,MAAM,QAAN,CAAe;AACb,aAAW,wBADE;;AAGb,WAAS,iBAAS,EAAT,EAAa,IAAb,EAAmB;AAC1B;;;;AAIA,QAAI,WAAW,yBAAiB,KAAK,KAAtB,CAAf;;AAEA,QAAI,OAAO,EAAX;AACA,QAAI,MAAM,EAAE,EAAF,EAAM,IAAN,CAAW,OAAX,CAAV;AACA,QAAI,WAAW,IAAI,IAAJ,CAAS,WAAT,CAAf;AACA,QAAI,aAAa,IAAI,IAAJ,CAAS,aAAT,CAAjB;AACA,QAAI,QAAQ,IAAI,IAAJ,CAAS,OAAT,CAAZ;AACA,QAAI,sBAAJ;;AAEA;AACA,QAAI,aAAa,MAAjB,EAAyB;AACvB,sBAAgB,SAAS,GAAT,EAAhB;AACA,WAAK,QAAL,GAAgB,UAAS,GAAT,EAAc;AAC5B,eAAO,cAAc,UAAd,EAA0B,IAAI,IAAJ,CAAS,GAAT,CAA1B,CAAP;AACD,OAFD;AAID,KAND,MAMO,IAAI,aAAa,UAAjB,EAA6B;AAClC,UAAI,WAAW,IAAI,IAAJ,CAAS,UAAT,CAAf;AACA,UAAI,QAAJ,EACE,gBAAgB,SAAS,QAAT,CAAkB,QAAlB,CAAhB,CADF,KAGE,gBAAgB,QAAhB;;AAEF,WAAK,QAAL,GAAgB,UAAS,GAAT,EAAc;AAC5B,eAAO,cAAc,UAAd,EAA0B,IAAI,IAAJ,CAAS,GAAT,CAA1B,CAAP;AACD,OAFD;AAGD,KAVM,MAUA,IAAI,aAAa,QAAjB,EAA2B;AAChC,UAAI,OAAO,KAAP,KAAiB,WAArB,EACE,KAAK,QAAL,GAAgB,UAAS,GAAT,EAAc;AAC5B,YAAI,SAAS,KAAK,GAAL,CAAS,EAAT,EAAa,KAAb,CAAb;AACA,eAAO,KAAK,KAAL,CAAW,MAAM,MAAjB,IAA2B,MAAlC;AACD,OAHD;AAIH;;AAED,QAAI,cAAJ,CAAmB,IAAnB;;AAEA,aAAS,QAAT,GAAoB;AAClB,UAAI,SAAS,IAAI,IAAJ,CAAS,gBAAT,EAA2B,MAAxC;;AAEA;AACA,UAAI,gBAAJ;AACA,UAAI,WAAW,IAAI,IAAJ,CAAS,WAAT,CAAf;AACA,UAAI,aAAa,MAAjB,EAAyB;AACvB,kBAAU,iBAAS,GAAT,EAAc;AACtB,iBAAO,cAAc,IAAI,IAAJ,CAAS,CAAC,GAAV,CAAd,CAAP;AACD,SAFD;AAGD,OAJD,MAIO,IAAI,aAAa,UAAjB,EAA6B;AAClC,kBAAU,iBAAS,GAAT,EAAc;AACtB;AACA,iBAAO,CAAC,GAAD,GAAO,IAAd;AACD,SAHD;AAID,OALM,MAKA;AACL,kBAAU,iBAAS,GAAT,EAAc;AAAE,iBAAO,CAAC,GAAR;AAAc,SAAxC;AACD;;AAED,UAAI,IAAI,IAAJ,CAAS,gBAAT,EAA2B,OAA3B,CAAmC,IAAnC,KAA4C,QAAhD,EAA0D;AACxD,eAAO,CAAC,QAAQ,OAAO,IAAf,CAAD,EAAuB,QAAQ,OAAO,EAAf,CAAvB,CAAP;AACD,OAFD,MAEO;AACL,eAAO,QAAQ,OAAO,IAAf,CAAP;AACD;AACF;;AAED,QAAI,gBAAgB,IAApB;;AAEA,QAAI,EAAJ,CAAO,6BAAP,EAAsC,UAAS,KAAT,EAAgB;AACpD,UAAI,CAAC,IAAI,IAAJ,CAAS,UAAT,CAAD,IAAyB,CAAC,IAAI,IAAJ,CAAS,WAAT,CAA9B,EAAqD;AAAA,wBAClC,UADkC;AAAA;AAAA,YAC9C,IAD8C;AAAA,YACxC,EADwC;;AAEnD,YAAI,OAAO,EAAX;AACA,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAL,CAAY,MAAhC,EAAwC,GAAxC,EAA6C;AAC3C,cAAI,MAAM,KAAK,MAAL,CAAY,CAAZ,CAAV;AACA,cAAI,OAAO,IAAP,IAAe,OAAO,EAA1B,EAA8B;AAC5B,iBAAK,IAAL,CAAU,KAAK,IAAL,CAAU,CAAV,CAAV;AACD;AACF;AACD,aAAK,IAAL;AACA,iBAAS,GAAT,CAAa,IAAb;AACA,wBAAgB,IAAhB;AACD;AACF,KAdD;;AAiBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAO;AACL,eAAS,mBAAW;AAClB,iBAAS,KAAT;AACD,OAHI;AAIL,cAAQ,kBAAW;AACjB,YAAI,aAAJ,EACE,SAAS,GAAT,CAAa,aAAb;AACH;AAPI,KAAP;AASD;AApHY,CAAf;;AAwHA;AACA,SAAS,QAAT,CAAkB,CAAlB,EAAqB,MAArB,EAA6B;AAC3B,MAAI,MAAM,EAAE,QAAF,EAAV;AACA,SAAO,IAAI,MAAJ,GAAa,MAApB;AACE,UAAM,MAAM,GAAZ;AADF,GAEA,OAAO,GAAP;AACD;;AAED;AACA;AACA,SAAS,aAAT,CAAuB,IAAvB,EAA6B;AAC3B,MAAI,gBAAgB,IAApB,EAA0B;AACxB,WAAO,KAAK,cAAL,KAAwB,GAAxB,GACA,SAAS,KAAK,WAAL,KAAmB,CAA5B,EAA+B,CAA/B,CADA,GACoC,GADpC,GAEA,SAAS,KAAK,UAAL,EAAT,EAA4B,CAA5B,CAFP;AAID,GALD,MAKO;AACL,WAAO,IAAP;AACD;AACF;;;;;;;;;;;;;;ACjJD;;;;AACA;;;;AACA;;IAAY,I;;;;;;;;AAEZ;;;;;;;;;;;;;;;;IAgBa,e,WAAA,e;AAEX,6BAA4C;AAAA,QAAhC,KAAgC,uEAAxB,IAAwB;AAAA,QAAlB,SAAkB,uEAAN,IAAM;;AAAA;;AAC1C,SAAK,WAAL,GAAmB,sBAAnB;AACA,SAAK,QAAL,GAAgB,IAAI,KAAK,mBAAT,CAA6B,KAAK,WAAlC,CAAhB;;AAEA;AACA,SAAK,MAAL,GAAc,IAAd;AACA;AACA,SAAK,IAAL,GAAY,IAAZ;AACA;AACA,SAAK,eAAL,GAAuB,IAAvB;;AAEA,SAAK,UAAL,GAAkB,KAAK,MAAL,CAAY,EAAE,QAAQ,IAAV,EAAZ,EAA8B,SAA9B,CAAlB;;AAEA,SAAK,QAAL,CAAc,KAAd;AACD;;AAED;;;;;;;;;;;;;;;;;6BAaS,K,EAAO;AAAA;;AACd;AACA,UAAI,KAAK,MAAL,KAAgB,KAApB,EACE;AACF;AACA,UAAI,CAAC,KAAK,MAAN,IAAgB,CAAC,KAArB,EACE;;AAEF,UAAI,KAAK,IAAT,EAAe;AACb,aAAK,IAAL,CAAU,GAAV,CAAc,QAAd,EAAwB,KAAK,eAA7B;AACA,aAAK,IAAL,GAAY,IAAZ;AACA,aAAK,eAAL,GAAuB,IAAvB;AACD;;AAED,WAAK,MAAL,GAAc,KAAd;;AAEA,UAAI,KAAJ,EAAW;AACT,aAAK,IAAL,GAAY,qBAAI,KAAJ,EAAW,GAAX,CAAe,WAAf,CAAZ;AACA,YAAI,MAAM,KAAK,IAAL,CAAU,EAAV,CAAa,QAAb,EAAuB,UAAC,CAAD,EAAO;AACtC,gBAAK,WAAL,CAAiB,OAAjB,CAAyB,QAAzB,EAAmC,CAAnC;AACD,SAFS,CAAV;AAGA,aAAK,eAAL,GAAuB,GAAvB;AACD;AACF;;AAED;;;;;;;;;;;;;;;AAcA;;;;;oCAKgB,S,EAAW;AACzB;AACA,aAAO,KAAK,MAAL,CAAY,EAAZ,EACL,KAAK,UAAL,GAAkB,KAAK,UAAvB,GAAoC,IAD/B,EAEL,YAAY,SAAZ,GAAwB,IAFnB,CAAP;AAGD;;AAED;;;;;;;;;;;;;;;wBAYI,Y,EAAc,S,EAAW;AAC3B,UAAI,KAAK,IAAT,EACE,KAAK,IAAL,CAAU,GAAV,CAAc,YAAd,EAA4B,KAAK,eAAL,CAAqB,SAArB,CAA5B;AACH;;AAED;;;;;;;;;;;;;0BAUM,S,EAAW;AACf,UAAI,KAAK,IAAT,EACE,KAAK,GAAL,CAAS,KAAK,CAAd,EAAiB,KAAK,eAAL,CAAqB,SAArB,CAAjB;AACH;;AAED;;;;;;;;;;;;;uBAUG,S,EAAW,Q,EAAU;AACtB,aAAO,KAAK,QAAL,CAAc,EAAd,CAAiB,SAAjB,EAA4B,QAA5B,CAAP;AACD;;AAED;;;;;;;;;;;wBAQI,S,EAAW,Q,EAAU;AACvB,aAAO,KAAK,QAAL,CAAc,GAAd,CAAkB,SAAlB,EAA6B,QAA7B,CAAP;AACD;;AAED;;;;;;;;4BAKQ;AACN,WAAK,QAAL,CAAc,kBAAd;AACA,WAAK,QAAL,CAAc,IAAd;AACD;;;wBAlFW;AACV,aAAO,KAAK,IAAL,GAAY,KAAK,IAAL,CAAU,GAAV,EAAZ,GAA8B,IAArC;AACD;;;;;;AAmFH;;;;;;;;;AASA;;;;;;;;;;;;;;;;;;;;;QCpLgB,M,GAAA,M;QAeA,W,GAAA,W;QAQA,e,GAAA,e;QAoCA,a,GAAA,a;;;;AA3DT,SAAS,MAAT,CAAgB,MAAhB,EAAoC;AAAA,oCAAT,OAAS;AAAT,WAAS;AAAA;;AACzC,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAA5B,EAAoC,GAApC,EAAyC;AACvC,QAAI,MAAM,QAAQ,CAAR,CAAV;AACA,QAAI,OAAO,GAAP,KAAgB,WAAhB,IAA+B,QAAQ,IAA3C,EACE;;AAEF,SAAK,IAAI,GAAT,IAAgB,GAAhB,EAAqB;AACnB,UAAI,IAAI,cAAJ,CAAmB,GAAnB,CAAJ,EAA6B;AAC3B,eAAO,GAAP,IAAc,IAAI,GAAJ,CAAd;AACD;AACF;AACF;AACD,SAAO,MAAP;AACD;;AAEM,SAAS,WAAT,CAAqB,IAArB,EAA2B;AAChC,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAI,KAAK,CAAL,KAAW,KAAK,IAAE,CAAP,CAAf,EAA0B;AACxB,YAAM,IAAI,KAAJ,CAAU,0CAAV,CAAN;AACD;AACF;AACF;;AAEM,SAAS,eAAT,CAAyB,CAAzB,EAA4B,CAA5B,EAA+B;AACpC,MAAI,MAAM,CAAV;AACA,MAAI,MAAM,CAAV;;AAEA,MAAI,CAAC,CAAL,EAAQ,IAAI,EAAJ;AACR,MAAI,CAAC,CAAL,EAAQ,IAAI,EAAJ;;AAER,MAAI,SAAS,EAAb;AACA,MAAI,SAAS,EAAb;;AAEA,cAAY,CAAZ;AACA,cAAY,CAAZ;;AAEA,SAAO,MAAM,EAAE,MAAR,IAAkB,MAAM,EAAE,MAAjC,EAAyC;AACvC,QAAI,EAAE,GAAF,MAAW,EAAE,GAAF,CAAf,EAAuB;AACrB;AACA;AACD,KAHD,MAGO,IAAI,EAAE,GAAF,IAAS,EAAE,GAAF,CAAb,EAAqB;AAC1B,aAAO,IAAP,CAAY,EAAE,KAAF,CAAZ;AACD,KAFM,MAEA;AACL,aAAO,IAAP,CAAY,EAAE,KAAF,CAAZ;AACD;AACF;;AAED,MAAI,MAAM,EAAE,MAAZ,EACE,SAAS,OAAO,MAAP,CAAc,EAAE,KAAF,CAAQ,GAAR,CAAd,CAAT;AACF,MAAI,MAAM,EAAE,MAAZ,EACE,SAAS,OAAO,MAAP,CAAc,EAAE,KAAF,CAAQ,GAAR,CAAd,CAAT;AACF,SAAO;AACL,aAAS,MADJ;AAEL,WAAO;AAFF,GAAP;AAID;;AAED;AACA;AACO,SAAS,aAAT,CAAuB,EAAvB,EAA2B;AAChC,MAAI,QAAQ,EAAZ;AACA,MAAI,eAAJ;AACA,OAAK,IAAI,IAAT,IAAiB,EAAjB,EAAqB;AACnB,QAAI,GAAG,cAAH,CAAkB,IAAlB,CAAJ,EACE,MAAM,IAAN,CAAW,IAAX;AACF,QAAI,QAAO,GAAG,IAAH,CAAP,MAAqB,QAArB,IAAiC,OAAO,GAAG,IAAH,EAAS,MAAhB,KAA4B,WAAjE,EAA8E;AAC5E,YAAM,IAAI,KAAJ,CAAU,2BAAV,CAAN;AACD,KAFD,MAEO,IAAI,OAAO,MAAP,KAAmB,WAAnB,IAAkC,WAAW,GAAG,IAAH,EAAS,MAA1D,EAAkE;AACvE,YAAM,IAAI,KAAJ,CAAU,8CAAV,CAAN;AACD;AACD,aAAS,GAAG,IAAH,EAAS,MAAlB;AACD;AACD,MAAI,UAAU,EAAd;AACA,MAAI,aAAJ;AACA,OAAK,IAAI,MAAM,CAAf,EAAkB,MAAM,MAAxB,EAAgC,KAAhC,EAAuC;AACrC,WAAO,EAAP;AACA,SAAK,IAAI,MAAM,CAAf,EAAkB,MAAM,MAAM,MAA9B,EAAsC,KAAtC,EAA6C;AAC3C,WAAK,MAAM,GAAN,CAAL,IAAmB,GAAG,MAAM,GAAN,CAAH,EAAe,GAAf,CAAnB;AACD;AACD,YAAQ,IAAR,CAAa,IAAb;AACD;AACD,SAAO,OAAP;AACD;;AAED;;;;;;;IAMa,mB,WAAA,mB;AACX,+BAAY,OAAZ,EAAqB;AAAA;;AACnB,SAAK,QAAL,GAAgB,OAAhB;AACA,SAAK,KAAL,GAAa,EAAb;AACD;;;;uBAEE,S,EAAW,Q,EAAU;AACtB,UAAI,MAAM,KAAK,QAAL,CAAc,EAAd,CAAiB,SAAjB,EAA4B,QAA5B,CAAV;AACA,WAAK,KAAL,CAAW,GAAX,IAAkB,SAAlB;AACA,aAAO,GAAP;AACD;;;wBAEG,S,EAAW,Q,EAAU;AACvB,UAAI,MAAM,KAAK,QAAL,CAAc,GAAd,CAAkB,SAAlB,EAA6B,QAA7B,CAAV;AACA,UAAI,GAAJ,EAAS;AACP,eAAO,KAAK,KAAL,CAAW,GAAX,CAAP;AACD;AACD,aAAO,GAAP;AACD;;;yCAEoB;AAAA;;AACnB,UAAI,eAAe,KAAK,KAAxB;AACA,WAAK,KAAL,GAAa,EAAb;AACA,aAAO,IAAP,CAAY,YAAZ,EAA0B,OAA1B,CAAkC,UAAC,GAAD,EAAS;AACzC,cAAK,QAAL,CAAc,GAAd,CAAkB,aAAa,GAAb,CAAlB,EAAqC,GAArC;AACD,OAFD;AAGD;;;;;;;;;;;;;;;;;;ACpHH;;;;;;;;IAEqB,G;AACnB,eAAY,KAAZ,EAAmB,IAAnB,EAAyB,YAAa,KAAtC,EAA6C;AAAA;;AAC3C,SAAK,MAAL,GAAc,KAAd;AACA,SAAK,KAAL,GAAa,IAAb;AACA,SAAK,MAAL,GAAc,KAAd;AACA,SAAK,OAAL,GAAe,sBAAf;AACD;;;;0BAEK;AACJ,aAAO,KAAK,MAAZ;AACD;;;wBAEG,K,EAAO,YAAa,K,EAAO;AAC7B,UAAI,KAAK,MAAL,KAAgB,KAApB,EAA2B;AACzB;AACA;AACD;AACD,UAAI,WAAW,KAAK,MAApB;AACA,WAAK,MAAL,GAAc,KAAd;AACA;AACA,UAAI,MAAM,EAAV;AACA,UAAI,SAAS,QAAO,KAAP,yCAAO,KAAP,OAAkB,QAA/B,EAAyC;AACvC,aAAK,IAAI,CAAT,IAAc,KAAd,EAAqB;AACnB,cAAI,MAAM,cAAN,CAAqB,CAArB,CAAJ,EACE,IAAI,CAAJ,IAAS,MAAM,CAAN,CAAT;AACH;AACF;AACD,UAAI,QAAJ,GAAe,QAAf;AACA,UAAI,KAAJ,GAAY,KAAZ;AACA,WAAK,OAAL,CAAa,OAAb,CAAqB,QAArB,EAA+B,GAA/B,EAAoC,IAApC;;AAEA;AACA;AACA,UAAI,OAAO,KAAP,IAAgB,OAAO,KAAP,CAAa,aAAjC,EAAgD;AAC9C,eAAO,KAAP,CAAa,aAAb,CACE,mBACG,KAAK,MAAL,CAAY,IAAZ,KAAqB,IAArB,GAA4B,KAAK,MAAL,CAAY,IAAZ,GAAmB,GAA/C,GAAqD,EADxD,IAEE,KAAK,KAHT,EAIE,OAAO,KAAP,KAAkB,WAAlB,GAAgC,IAAhC,GAAuC,KAJzC;AAMD;AACF;;;uBAEE,S,EAAW,Q,EAAU;AACtB,aAAO,KAAK,OAAL,CAAa,EAAb,CAAgB,SAAhB,EAA2B,QAA3B,CAAP;AACD;;;wBAEG,S,EAAW,Q,EAAU;AACvB,aAAO,KAAK,OAAL,CAAa,GAAb,CAAiB,SAAjB,EAA4B,QAA5B,CAAP;AACD;;;;;;kBAjDkB,G",
- "file": "generated.js",
- "sourceRoot": "",
- "sourcesContent": [
- "(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n",
- "import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n",
- "import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n",
- "import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n",
- "let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n",
- "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n",
- "import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n",
- "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n",
- "import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n",
- "export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n",
- "import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n"
- ]
-}
\ No newline at end of file
diff --git a/site_libs/crosstalk-1.2.1/js/crosstalk.min.js b/site_libs/crosstalk-1.2.1/js/crosstalk.min.js
deleted file mode 100644
index b7ec0ac..0000000
--- a/site_libs/crosstalk-1.2.1/js/crosstalk.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-!function o(u,a,l){function s(n,e){if(!a[n]){if(!u[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(f)return f(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var i=a[n]={exports:{}};u[n][0].call(i.exports,function(e){var t=u[n][1][e];return s(t||e)},i,i.exports,o,u,a,l)}return a[n].exports}for(var f="function"==typeof require&&require,e=0;e?@[\\\]^`{|}~])/g,"\\$1")+"']"),r=JSON.parse(n[0].innerText),i=e.factory(t,r);o(t).data("crosstalk-instance",i),o(t).addClass("crosstalk-input-bound")}if(t.Shiny){var e=new t.Shiny.InputBinding,u=t.jQuery;u.extend(e,{find:function(e){return u(e).find(".crosstalk-input")},initialize:function(e){var t,n;u(e).hasClass("crosstalk-input-bound")||(n=o(t=e),Object.keys(r).forEach(function(e){n.hasClass(e)&&!n.hasClass("crosstalk-input-bound")&&i(r[e],t)}))},getId:function(e){return e.id},getValue:function(e){},setValue:function(e,t){},receiveMessage:function(e,t){},subscribe:function(e,t){u(e).data("crosstalk-instance").resume()},unsubscribe:function(e){u(e).data("crosstalk-instance").suspend()}}),t.Shiny.inputBindings.register(e,"crosstalk.inputBinding")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],7:[function(r,e,t){(function(e){"use strict";var t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(r("./input")),n=r("./filter");var a=e.jQuery;t.register({className:"crosstalk-input-checkboxgroup",factory:function(e,r){var i=new n.FilterHandle(r.group),o=void 0,u=a(e);return u.on("change","input[type='checkbox']",function(){var e=u.find("input[type='checkbox']:checked");if(0===e.length)o=null,i.clear();else{var t={};e.each(function(){r.map[this.value].forEach(function(e){t[e]=!0})});var n=Object.keys(t);n.sort(),o=n,i.set(n)}}),{suspend:function(){i.clear()},resume:function(){o&&i.set(o)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6}],8:[function(r,e,t){(function(e){"use strict";var t=n(r("./input")),l=n(r("./util")),s=r("./filter");function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}var f=e.jQuery;t.register({className:"crosstalk-input-select",factory:function(e,n){var t=l.dataframeToD3(n.items),r={options:[{value:"",label:"(All)"}].concat(t),valueField:"value",labelField:"label",searchField:"label"},i=f(e).find("select")[0],o=f(i).selectize(r)[0].selectize,u=new s.FilterHandle(n.group),a=void 0;return o.on("change",function(){if(0===o.items.length)a=null,u.clear();else{var t={};o.items.forEach(function(e){n.map[e].forEach(function(e){t[e]=!0})});var e=Object.keys(t);e.sort(),a=e,u.set(e)}}),{suspend:function(){u.clear()},resume:function(){a&&u.set(a)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6,"./util":11}],9:[function(n,e,t){(function(e){"use strict";var d=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var u,a=e[Symbol.iterator]();!(r=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{!r&&a.return&&a.return()}finally{if(i)throw o}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")},t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(n("./input")),a=n("./filter");var v=e.jQuery,p=e.strftime;function y(e,t){for(var n=e.toString();n.length {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n","import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n","import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n","import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n","let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n","import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n","export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n","import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n"]}
\ No newline at end of file
diff --git a/site_libs/crosstalk-1.2.1/scss/crosstalk.scss b/site_libs/crosstalk-1.2.1/scss/crosstalk.scss
deleted file mode 100644
index 3566561..0000000
--- a/site_libs/crosstalk-1.2.1/scss/crosstalk.scss
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Adjust margins outwards, so column contents line up with the edges of the
- parent of container-fluid. */
-.container-fluid.crosstalk-bscols {
- margin-left: -30px;
- margin-right: -30px;
- white-space: normal;
-}
-
-/* But don't adjust the margins outwards if we're directly under the body,
- i.e. we were the top-level of something at the console. */
-body > .container-fluid.crosstalk-bscols {
- margin-left: auto;
- margin-right: auto;
-}
-
-.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column {
- display: inline-block;
- padding-right: 12px;
- vertical-align: top;
-}
-
-@media only screen and (max-width:480px) {
- .crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column {
- display: block;
- padding-right: inherit;
- }
-}
-
-/* Relevant BS3 styles to make filter_checkbox() look reasonable without Bootstrap */
-.crosstalk-input {
- margin-bottom: 15px; /* a la .form-group */
- .control-label {
- margin-bottom: 0;
- vertical-align: middle;
- }
- input[type="checkbox"] {
- margin: 4px 0 0;
- margin-top: 1px;
- line-height: normal;
- }
- .checkbox {
- position: relative;
- display: block;
- margin-top: 10px;
- margin-bottom: 10px;
- }
- .checkbox > label{
- padding-left: 20px;
- margin-bottom: 0;
- font-weight: 400;
- cursor: pointer;
- }
- .checkbox input[type="checkbox"],
- .checkbox-inline input[type="checkbox"] {
- position: absolute;
- margin-top: 2px;
- margin-left: -20px;
- }
- .checkbox + .checkbox {
- margin-top: -5px;
- }
- .checkbox-inline {
- position: relative;
- display: inline-block;
- padding-left: 20px;
- margin-bottom: 0;
- font-weight: 400;
- vertical-align: middle;
- cursor: pointer;
- }
- .checkbox-inline + .checkbox-inline {
- margin-top: 0;
- margin-left: 10px;
- }
-}
diff --git a/site_libs/htmltools-fill-0.5.8.1/fill.css b/site_libs/htmltools-fill-0.5.8.1/fill.css
deleted file mode 100644
index 841ea9d..0000000
--- a/site_libs/htmltools-fill-0.5.8.1/fill.css
+++ /dev/null
@@ -1,21 +0,0 @@
-@layer htmltools {
- .html-fill-container {
- display: flex;
- flex-direction: column;
- /* Prevent the container from expanding vertically or horizontally beyond its
- parent's constraints. */
- min-height: 0;
- min-width: 0;
- }
- .html-fill-container > .html-fill-item {
- /* Fill items can grow and shrink freely within
- available vertical space in fillable container */
- flex: 1 1 auto;
- min-height: 0;
- min-width: 0;
- }
- .html-fill-container > :not(.html-fill-item) {
- /* Prevent shrinking or growing of non-fill items */
- flex: 0 0 auto;
- }
-}
diff --git a/site_libs/htmlwidgets-1.6.4/htmlwidgets.js b/site_libs/htmlwidgets-1.6.4/htmlwidgets.js
deleted file mode 100644
index 1067d02..0000000
--- a/site_libs/htmlwidgets-1.6.4/htmlwidgets.js
+++ /dev/null
@@ -1,901 +0,0 @@
-(function() {
- // If window.HTMLWidgets is already defined, then use it; otherwise create a
- // new object. This allows preceding code to set options that affect the
- // initialization process (though none currently exist).
- window.HTMLWidgets = window.HTMLWidgets || {};
-
- // See if we're running in a viewer pane. If not, we're in a web browser.
- var viewerMode = window.HTMLWidgets.viewerMode =
- /\bviewer_pane=1\b/.test(window.location);
-
- // See if we're running in Shiny mode. If not, it's a static document.
- // Note that static widgets can appear in both Shiny and static modes, but
- // obviously, Shiny widgets can only appear in Shiny apps/documents.
- var shinyMode = window.HTMLWidgets.shinyMode =
- typeof(window.Shiny) !== "undefined" && !!window.Shiny.outputBindings;
-
- // We can't count on jQuery being available, so we implement our own
- // version if necessary.
- function querySelectorAll(scope, selector) {
- if (typeof(jQuery) !== "undefined" && scope instanceof jQuery) {
- return scope.find(selector);
- }
- if (scope.querySelectorAll) {
- return scope.querySelectorAll(selector);
- }
- }
-
- function asArray(value) {
- if (value === null)
- return [];
- if ($.isArray(value))
- return value;
- return [value];
- }
-
- // Implement jQuery's extend
- function extend(target /*, ... */) {
- if (arguments.length == 1) {
- return target;
- }
- for (var i = 1; i < arguments.length; i++) {
- var source = arguments[i];
- for (var prop in source) {
- if (source.hasOwnProperty(prop)) {
- target[prop] = source[prop];
- }
- }
- }
- return target;
- }
-
- // IE8 doesn't support Array.forEach.
- function forEach(values, callback, thisArg) {
- if (values.forEach) {
- values.forEach(callback, thisArg);
- } else {
- for (var i = 0; i < values.length; i++) {
- callback.call(thisArg, values[i], i, values);
- }
- }
- }
-
- // Replaces the specified method with the return value of funcSource.
- //
- // Note that funcSource should not BE the new method, it should be a function
- // that RETURNS the new method. funcSource receives a single argument that is
- // the overridden method, it can be called from the new method. The overridden
- // method can be called like a regular function, it has the target permanently
- // bound to it so "this" will work correctly.
- function overrideMethod(target, methodName, funcSource) {
- var superFunc = target[methodName] || function() {};
- var superFuncBound = function() {
- return superFunc.apply(target, arguments);
- };
- target[methodName] = funcSource(superFuncBound);
- }
-
- // Add a method to delegator that, when invoked, calls
- // delegatee.methodName. If there is no such method on
- // the delegatee, but there was one on delegator before
- // delegateMethod was called, then the original version
- // is invoked instead.
- // For example:
- //
- // var a = {
- // method1: function() { console.log('a1'); }
- // method2: function() { console.log('a2'); }
- // };
- // var b = {
- // method1: function() { console.log('b1'); }
- // };
- // delegateMethod(a, b, "method1");
- // delegateMethod(a, b, "method2");
- // a.method1();
- // a.method2();
- //
- // The output would be "b1", "a2".
- function delegateMethod(delegator, delegatee, methodName) {
- var inherited = delegator[methodName];
- delegator[methodName] = function() {
- var target = delegatee;
- var method = delegatee[methodName];
-
- // The method doesn't exist on the delegatee. Instead,
- // call the method on the delegator, if it exists.
- if (!method) {
- target = delegator;
- method = inherited;
- }
-
- if (method) {
- return method.apply(target, arguments);
- }
- };
- }
-
- // Implement a vague facsimilie of jQuery's data method
- function elementData(el, name, value) {
- if (arguments.length == 2) {
- return el["htmlwidget_data_" + name];
- } else if (arguments.length == 3) {
- el["htmlwidget_data_" + name] = value;
- return el;
- } else {
- throw new Error("Wrong number of arguments for elementData: " +
- arguments.length);
- }
- }
-
- // http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
- function escapeRegExp(str) {
- return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
- }
-
- function hasClass(el, className) {
- var re = new RegExp("\\b" + escapeRegExp(className) + "\\b");
- return re.test(el.className);
- }
-
- // elements - array (or array-like object) of HTML elements
- // className - class name to test for
- // include - if true, only return elements with given className;
- // if false, only return elements *without* given className
- function filterByClass(elements, className, include) {
- var results = [];
- for (var i = 0; i < elements.length; i++) {
- if (hasClass(elements[i], className) == include)
- results.push(elements[i]);
- }
- return results;
- }
-
- function on(obj, eventName, func) {
- if (obj.addEventListener) {
- obj.addEventListener(eventName, func, false);
- } else if (obj.attachEvent) {
- obj.attachEvent(eventName, func);
- }
- }
-
- function off(obj, eventName, func) {
- if (obj.removeEventListener)
- obj.removeEventListener(eventName, func, false);
- else if (obj.detachEvent) {
- obj.detachEvent(eventName, func);
- }
- }
-
- // Translate array of values to top/right/bottom/left, as usual with
- // the "padding" CSS property
- // https://developer.mozilla.org/en-US/docs/Web/CSS/padding
- function unpackPadding(value) {
- if (typeof(value) === "number")
- value = [value];
- if (value.length === 1) {
- return {top: value[0], right: value[0], bottom: value[0], left: value[0]};
- }
- if (value.length === 2) {
- return {top: value[0], right: value[1], bottom: value[0], left: value[1]};
- }
- if (value.length === 3) {
- return {top: value[0], right: value[1], bottom: value[2], left: value[1]};
- }
- if (value.length === 4) {
- return {top: value[0], right: value[1], bottom: value[2], left: value[3]};
- }
- }
-
- // Convert an unpacked padding object to a CSS value
- function paddingToCss(paddingObj) {
- return paddingObj.top + "px " + paddingObj.right + "px " + paddingObj.bottom + "px " + paddingObj.left + "px";
- }
-
- // Makes a number suitable for CSS
- function px(x) {
- if (typeof(x) === "number")
- return x + "px";
- else
- return x;
- }
-
- // Retrieves runtime widget sizing information for an element.
- // The return value is either null, or an object with fill, padding,
- // defaultWidth, defaultHeight fields.
- function sizingPolicy(el) {
- var sizingEl = document.querySelector("script[data-for='" + el.id + "'][type='application/htmlwidget-sizing']");
- if (!sizingEl)
- return null;
- var sp = JSON.parse(sizingEl.textContent || sizingEl.text || "{}");
- if (viewerMode) {
- return sp.viewer;
- } else {
- return sp.browser;
- }
- }
-
- // @param tasks Array of strings (or falsy value, in which case no-op).
- // Each element must be a valid JavaScript expression that yields a
- // function. Or, can be an array of objects with "code" and "data"
- // properties; in this case, the "code" property should be a string
- // of JS that's an expr that yields a function, and "data" should be
- // an object that will be added as an additional argument when that
- // function is called.
- // @param target The object that will be "this" for each function
- // execution.
- // @param args Array of arguments to be passed to the functions. (The
- // same arguments will be passed to all functions.)
- function evalAndRun(tasks, target, args) {
- if (tasks) {
- forEach(tasks, function(task) {
- var theseArgs = args;
- if (typeof(task) === "object") {
- theseArgs = theseArgs.concat([task.data]);
- task = task.code;
- }
- var taskFunc = tryEval(task);
- if (typeof(taskFunc) !== "function") {
- throw new Error("Task must be a function! Source:\n" + task);
- }
- taskFunc.apply(target, theseArgs);
- });
- }
- }
-
- // Attempt eval() both with and without enclosing in parentheses.
- // Note that enclosing coerces a function declaration into
- // an expression that eval() can parse
- // (otherwise, a SyntaxError is thrown)
- function tryEval(code) {
- var result = null;
- try {
- result = eval("(" + code + ")");
- } catch(error) {
- if (!(error instanceof SyntaxError)) {
- throw error;
- }
- try {
- result = eval(code);
- } catch(e) {
- if (e instanceof SyntaxError) {
- throw error;
- } else {
- throw e;
- }
- }
- }
- return result;
- }
-
- function initSizing(el) {
- var sizing = sizingPolicy(el);
- if (!sizing)
- return;
-
- var cel = document.getElementById("htmlwidget_container");
- if (!cel)
- return;
-
- if (typeof(sizing.padding) !== "undefined") {
- document.body.style.margin = "0";
- document.body.style.padding = paddingToCss(unpackPadding(sizing.padding));
- }
-
- if (sizing.fill) {
- document.body.style.overflow = "hidden";
- document.body.style.width = "100%";
- document.body.style.height = "100%";
- document.documentElement.style.width = "100%";
- document.documentElement.style.height = "100%";
- cel.style.position = "absolute";
- var pad = unpackPadding(sizing.padding);
- cel.style.top = pad.top + "px";
- cel.style.right = pad.right + "px";
- cel.style.bottom = pad.bottom + "px";
- cel.style.left = pad.left + "px";
- el.style.width = "100%";
- el.style.height = "100%";
-
- return {
- getWidth: function() { return cel.getBoundingClientRect().width; },
- getHeight: function() { return cel.getBoundingClientRect().height; }
- };
-
- } else {
- el.style.width = px(sizing.width);
- el.style.height = px(sizing.height);
-
- return {
- getWidth: function() { return cel.getBoundingClientRect().width; },
- getHeight: function() { return cel.getBoundingClientRect().height; }
- };
- }
- }
-
- // Default implementations for methods
- var defaults = {
- find: function(scope) {
- return querySelectorAll(scope, "." + this.name);
- },
- renderError: function(el, err) {
- var $el = $(el);
-
- this.clearError(el);
-
- // Add all these error classes, as Shiny does
- var errClass = "shiny-output-error";
- if (err.type !== null) {
- // use the classes of the error condition as CSS class names
- errClass = errClass + " " + $.map(asArray(err.type), function(type) {
- return errClass + "-" + type;
- }).join(" ");
- }
- errClass = errClass + " htmlwidgets-error";
-
- // Is el inline or block? If inline or inline-block, just display:none it
- // and add an inline error.
- var display = $el.css("display");
- $el.data("restore-display-mode", display);
-
- if (display === "inline" || display === "inline-block") {
- $el.hide();
- if (err.message !== "") {
- var errorSpan = $("").addClass(errClass);
- errorSpan.text(err.message);
- $el.after(errorSpan);
- }
- } else if (display === "block") {
- // If block, add an error just after the el, set visibility:none on the
- // el, and position the error to be on top of the el.
- // Mark it with a unique ID and CSS class so we can remove it later.
- $el.css("visibility", "hidden");
- if (err.message !== "") {
- var errorDiv = $("
").addClass(errClass).css("position", "absolute")
- .css("top", el.offsetTop)
- .css("left", el.offsetLeft)
- // setting width can push out the page size, forcing otherwise
- // unnecessary scrollbars to appear and making it impossible for
- // the element to shrink; so use max-width instead
- .css("maxWidth", el.offsetWidth)
- .css("height", el.offsetHeight);
- errorDiv.text(err.message);
- $el.after(errorDiv);
-
- // Really dumb way to keep the size/position of the error in sync with
- // the parent element as the window is resized or whatever.
- var intId = setInterval(function() {
- if (!errorDiv[0].parentElement) {
- clearInterval(intId);
- return;
- }
- errorDiv
- .css("top", el.offsetTop)
- .css("left", el.offsetLeft)
- .css("maxWidth", el.offsetWidth)
- .css("height", el.offsetHeight);
- }, 500);
- }
- }
- },
- clearError: function(el) {
- var $el = $(el);
- var display = $el.data("restore-display-mode");
- $el.data("restore-display-mode", null);
-
- if (display === "inline" || display === "inline-block") {
- if (display)
- $el.css("display", display);
- $(el.nextSibling).filter(".htmlwidgets-error").remove();
- } else if (display === "block"){
- $el.css("visibility", "inherit");
- $(el.nextSibling).filter(".htmlwidgets-error").remove();
- }
- },
- sizing: {}
- };
-
- // Called by widget bindings to register a new type of widget. The definition
- // object can contain the following properties:
- // - name (required) - A string indicating the binding name, which will be
- // used by default as the CSS classname to look for.
- // - initialize (optional) - A function(el) that will be called once per
- // widget element; if a value is returned, it will be passed as the third
- // value to renderValue.
- // - renderValue (required) - A function(el, data, initValue) that will be
- // called with data. Static contexts will cause this to be called once per
- // element; Shiny apps will cause this to be called multiple times per
- // element, as the data changes.
- window.HTMLWidgets.widget = function(definition) {
- if (!definition.name) {
- throw new Error("Widget must have a name");
- }
- if (!definition.type) {
- throw new Error("Widget must have a type");
- }
- // Currently we only support output widgets
- if (definition.type !== "output") {
- throw new Error("Unrecognized widget type '" + definition.type + "'");
- }
- // TODO: Verify that .name is a valid CSS classname
-
- // Support new-style instance-bound definitions. Old-style class-bound
- // definitions have one widget "object" per widget per type/class of
- // widget; the renderValue and resize methods on such widget objects
- // take el and instance arguments, because the widget object can't
- // store them. New-style instance-bound definitions have one widget
- // object per widget instance; the definition that's passed in doesn't
- // provide renderValue or resize methods at all, just the single method
- // factory(el, width, height)
- // which returns an object that has renderValue(x) and resize(w, h).
- // This enables a far more natural programming style for the widget
- // author, who can store per-instance state using either OO-style
- // instance fields or functional-style closure variables (I guess this
- // is in contrast to what can only be called C-style pseudo-OO which is
- // what we required before).
- if (definition.factory) {
- definition = createLegacyDefinitionAdapter(definition);
- }
-
- if (!definition.renderValue) {
- throw new Error("Widget must have a renderValue function");
- }
-
- // For static rendering (non-Shiny), use a simple widget registration
- // scheme. We also use this scheme for Shiny apps/documents that also
- // contain static widgets.
- window.HTMLWidgets.widgets = window.HTMLWidgets.widgets || [];
- // Merge defaults into the definition; don't mutate the original definition.
- var staticBinding = extend({}, defaults, definition);
- overrideMethod(staticBinding, "find", function(superfunc) {
- return function(scope) {
- var results = superfunc(scope);
- // Filter out Shiny outputs, we only want the static kind
- return filterByClass(results, "html-widget-output", false);
- };
- });
- window.HTMLWidgets.widgets.push(staticBinding);
-
- if (shinyMode) {
- // Shiny is running. Register the definition with an output binding.
- // The definition itself will not be the output binding, instead
- // we will make an output binding object that delegates to the
- // definition. This is because we foolishly used the same method
- // name (renderValue) for htmlwidgets definition and Shiny bindings
- // but they actually have quite different semantics (the Shiny
- // bindings receive data that includes lots of metadata that it
- // strips off before calling htmlwidgets renderValue). We can't
- // just ignore the difference because in some widgets it's helpful
- // to call this.renderValue() from inside of resize(), and if
- // we're not delegating, then that call will go to the Shiny
- // version instead of the htmlwidgets version.
-
- // Merge defaults with definition, without mutating either.
- var bindingDef = extend({}, defaults, definition);
-
- // This object will be our actual Shiny binding.
- var shinyBinding = new Shiny.OutputBinding();
-
- // With a few exceptions, we'll want to simply use the bindingDef's
- // version of methods if they are available, otherwise fall back to
- // Shiny's defaults. NOTE: If Shiny's output bindings gain additional
- // methods in the future, and we want them to be overrideable by
- // HTMLWidget binding definitions, then we'll need to add them to this
- // list.
- delegateMethod(shinyBinding, bindingDef, "getId");
- delegateMethod(shinyBinding, bindingDef, "onValueChange");
- delegateMethod(shinyBinding, bindingDef, "onValueError");
- delegateMethod(shinyBinding, bindingDef, "renderError");
- delegateMethod(shinyBinding, bindingDef, "clearError");
- delegateMethod(shinyBinding, bindingDef, "showProgress");
-
- // The find, renderValue, and resize are handled differently, because we
- // want to actually decorate the behavior of the bindingDef methods.
-
- shinyBinding.find = function(scope) {
- var results = bindingDef.find(scope);
-
- // Only return elements that are Shiny outputs, not static ones
- var dynamicResults = results.filter(".html-widget-output");
-
- // It's possible that whatever caused Shiny to think there might be
- // new dynamic outputs, also caused there to be new static outputs.
- // Since there might be lots of different htmlwidgets bindings, we
- // schedule execution for later--no need to staticRender multiple
- // times.
- if (results.length !== dynamicResults.length)
- scheduleStaticRender();
-
- return dynamicResults;
- };
-
- // Wrap renderValue to handle initialization, which unfortunately isn't
- // supported natively by Shiny at the time of this writing.
-
- shinyBinding.renderValue = function(el, data) {
- Shiny.renderDependencies(data.deps);
- // Resolve strings marked as javascript literals to objects
- if (!(data.evals instanceof Array)) data.evals = [data.evals];
- for (var i = 0; data.evals && i < data.evals.length; i++) {
- window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]);
- }
- if (!bindingDef.renderOnNullValue) {
- if (data.x === null) {
- el.style.visibility = "hidden";
- return;
- } else {
- el.style.visibility = "inherit";
- }
- }
- if (!elementData(el, "initialized")) {
- initSizing(el);
-
- elementData(el, "initialized", true);
- if (bindingDef.initialize) {
- var rect = el.getBoundingClientRect();
- var result = bindingDef.initialize(el, rect.width, rect.height);
- elementData(el, "init_result", result);
- }
- }
- bindingDef.renderValue(el, data.x, elementData(el, "init_result"));
- evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]);
- };
-
- // Only override resize if bindingDef implements it
- if (bindingDef.resize) {
- shinyBinding.resize = function(el, width, height) {
- // Shiny can call resize before initialize/renderValue have been
- // called, which doesn't make sense for widgets.
- if (elementData(el, "initialized")) {
- bindingDef.resize(el, width, height, elementData(el, "init_result"));
- }
- };
- }
-
- Shiny.outputBindings.register(shinyBinding, bindingDef.name);
- }
- };
-
- var scheduleStaticRenderTimerId = null;
- function scheduleStaticRender() {
- if (!scheduleStaticRenderTimerId) {
- scheduleStaticRenderTimerId = setTimeout(function() {
- scheduleStaticRenderTimerId = null;
- window.HTMLWidgets.staticRender();
- }, 1);
- }
- }
-
- // Render static widgets after the document finishes loading
- // Statically render all elements that are of this widget's class
- window.HTMLWidgets.staticRender = function() {
- var bindings = window.HTMLWidgets.widgets || [];
- forEach(bindings, function(binding) {
- var matches = binding.find(document.documentElement);
- forEach(matches, function(el) {
- var sizeObj = initSizing(el, binding);
-
- var getSize = function(el) {
- if (sizeObj) {
- return {w: sizeObj.getWidth(), h: sizeObj.getHeight()}
- } else {
- var rect = el.getBoundingClientRect();
- return {w: rect.width, h: rect.height}
- }
- };
-
- if (hasClass(el, "html-widget-static-bound"))
- return;
- el.className = el.className + " html-widget-static-bound";
-
- var initResult;
- if (binding.initialize) {
- var size = getSize(el);
- initResult = binding.initialize(el, size.w, size.h);
- elementData(el, "init_result", initResult);
- }
-
- if (binding.resize) {
- var lastSize = getSize(el);
- var resizeHandler = function(e) {
- var size = getSize(el);
- if (size.w === 0 && size.h === 0)
- return;
- if (size.w === lastSize.w && size.h === lastSize.h)
- return;
- lastSize = size;
- binding.resize(el, size.w, size.h, initResult);
- };
-
- on(window, "resize", resizeHandler);
-
- // This is needed for cases where we're running in a Shiny
- // app, but the widget itself is not a Shiny output, but
- // rather a simple static widget. One example of this is
- // an rmarkdown document that has runtime:shiny and widget
- // that isn't in a render function. Shiny only knows to
- // call resize handlers for Shiny outputs, not for static
- // widgets, so we do it ourselves.
- if (window.jQuery) {
- window.jQuery(document).on(
- "shown.htmlwidgets shown.bs.tab.htmlwidgets shown.bs.collapse.htmlwidgets",
- resizeHandler
- );
- window.jQuery(document).on(
- "hidden.htmlwidgets hidden.bs.tab.htmlwidgets hidden.bs.collapse.htmlwidgets",
- resizeHandler
- );
- }
-
- // This is needed for the specific case of ioslides, which
- // flips slides between display:none and display:block.
- // Ideally we would not have to have ioslide-specific code
- // here, but rather have ioslides raise a generic event,
- // but the rmarkdown package just went to CRAN so the
- // window to getting that fixed may be long.
- if (window.addEventListener) {
- // It's OK to limit this to window.addEventListener
- // browsers because ioslides itself only supports
- // such browsers.
- on(document, "slideenter", resizeHandler);
- on(document, "slideleave", resizeHandler);
- }
- }
-
- var scriptData = document.querySelector("script[data-for='" + el.id + "'][type='application/json']");
- if (scriptData) {
- var data = JSON.parse(scriptData.textContent || scriptData.text);
- // Resolve strings marked as javascript literals to objects
- if (!(data.evals instanceof Array)) data.evals = [data.evals];
- for (var k = 0; data.evals && k < data.evals.length; k++) {
- window.HTMLWidgets.evaluateStringMember(data.x, data.evals[k]);
- }
- binding.renderValue(el, data.x, initResult);
- evalAndRun(data.jsHooks.render, initResult, [el, data.x]);
- }
- });
- });
-
- invokePostRenderHandlers();
- }
-
-
- function has_jQuery3() {
- if (!window.jQuery) {
- return false;
- }
- var $version = window.jQuery.fn.jquery;
- var $major_version = parseInt($version.split(".")[0]);
- return $major_version >= 3;
- }
-
- /*
- / Shiny 1.4 bumped jQuery from 1.x to 3.x which means jQuery's
- / on-ready handler (i.e., $(fn)) is now asyncronous (i.e., it now
- / really means $(setTimeout(fn)).
- / https://jquery.com/upgrade-guide/3.0/#breaking-change-document-ready-handlers-are-now-asynchronous
- /
- / Since Shiny uses $() to schedule initShiny, shiny>=1.4 calls initShiny
- / one tick later than it did before, which means staticRender() is
- / called renderValue() earlier than (advanced) widget authors might be expecting.
- / https://github.com/rstudio/shiny/issues/2630
- /
- / For a concrete example, leaflet has some methods (e.g., updateBounds)
- / which reference Shiny methods registered in initShiny (e.g., setInputValue).
- / Since leaflet is privy to this life-cycle, it knows to use setTimeout() to
- / delay execution of those methods (until Shiny methods are ready)
- / https://github.com/rstudio/leaflet/blob/18ec981/javascript/src/index.js#L266-L268
- /
- / Ideally widget authors wouldn't need to use this setTimeout() hack that
- / leaflet uses to call Shiny methods on a staticRender(). In the long run,
- / the logic initShiny should be broken up so that method registration happens
- / right away, but binding happens later.
- */
- function maybeStaticRenderLater() {
- if (shinyMode && has_jQuery3()) {
- window.jQuery(window.HTMLWidgets.staticRender);
- } else {
- window.HTMLWidgets.staticRender();
- }
- }
-
- if (document.addEventListener) {
- document.addEventListener("DOMContentLoaded", function() {
- document.removeEventListener("DOMContentLoaded", arguments.callee, false);
- maybeStaticRenderLater();
- }, false);
- } else if (document.attachEvent) {
- document.attachEvent("onreadystatechange", function() {
- if (document.readyState === "complete") {
- document.detachEvent("onreadystatechange", arguments.callee);
- maybeStaticRenderLater();
- }
- });
- }
-
-
- window.HTMLWidgets.getAttachmentUrl = function(depname, key) {
- // If no key, default to the first item
- if (typeof(key) === "undefined")
- key = 1;
-
- var link = document.getElementById(depname + "-" + key + "-attachment");
- if (!link) {
- throw new Error("Attachment " + depname + "/" + key + " not found in document");
- }
- return link.getAttribute("href");
- };
-
- window.HTMLWidgets.dataframeToD3 = function(df) {
- var names = [];
- var length;
- for (var name in df) {
- if (df.hasOwnProperty(name))
- names.push(name);
- if (typeof(df[name]) !== "object" || typeof(df[name].length) === "undefined") {
- throw new Error("All fields must be arrays");
- } else if (typeof(length) !== "undefined" && length !== df[name].length) {
- throw new Error("All fields must be arrays of the same length");
- }
- length = df[name].length;
- }
- var results = [];
- var item;
- for (var row = 0; row < length; row++) {
- item = {};
- for (var col = 0; col < names.length; col++) {
- item[names[col]] = df[names[col]][row];
- }
- results.push(item);
- }
- return results;
- };
-
- window.HTMLWidgets.transposeArray2D = function(array) {
- if (array.length === 0) return array;
- var newArray = array[0].map(function(col, i) {
- return array.map(function(row) {
- return row[i]
- })
- });
- return newArray;
- };
- // Split value at splitChar, but allow splitChar to be escaped
- // using escapeChar. Any other characters escaped by escapeChar
- // will be included as usual (including escapeChar itself).
- function splitWithEscape(value, splitChar, escapeChar) {
- var results = [];
- var escapeMode = false;
- var currentResult = "";
- for (var pos = 0; pos < value.length; pos++) {
- if (!escapeMode) {
- if (value[pos] === splitChar) {
- results.push(currentResult);
- currentResult = "";
- } else if (value[pos] === escapeChar) {
- escapeMode = true;
- } else {
- currentResult += value[pos];
- }
- } else {
- currentResult += value[pos];
- escapeMode = false;
- }
- }
- if (currentResult !== "") {
- results.push(currentResult);
- }
- return results;
- }
- // Function authored by Yihui/JJ Allaire
- window.HTMLWidgets.evaluateStringMember = function(o, member) {
- var parts = splitWithEscape(member, '.', '\\');
- for (var i = 0, l = parts.length; i < l; i++) {
- var part = parts[i];
- // part may be a character or 'numeric' member name
- if (o !== null && typeof o === "object" && part in o) {
- if (i == (l - 1)) { // if we are at the end of the line then evalulate
- if (typeof o[part] === "string")
- o[part] = tryEval(o[part]);
- } else { // otherwise continue to next embedded object
- o = o[part];
- }
- }
- }
- };
-
- // Retrieve the HTMLWidget instance (i.e. the return value of an
- // HTMLWidget binding's initialize() or factory() function)
- // associated with an element, or null if none.
- window.HTMLWidgets.getInstance = function(el) {
- return elementData(el, "init_result");
- };
-
- // Finds the first element in the scope that matches the selector,
- // and returns the HTMLWidget instance (i.e. the return value of
- // an HTMLWidget binding's initialize() or factory() function)
- // associated with that element, if any. If no element matches the
- // selector, or the first matching element has no HTMLWidget
- // instance associated with it, then null is returned.
- //
- // The scope argument is optional, and defaults to window.document.
- window.HTMLWidgets.find = function(scope, selector) {
- if (arguments.length == 1) {
- selector = scope;
- scope = document;
- }
-
- var el = scope.querySelector(selector);
- if (el === null) {
- return null;
- } else {
- return window.HTMLWidgets.getInstance(el);
- }
- };
-
- // Finds all elements in the scope that match the selector, and
- // returns the HTMLWidget instances (i.e. the return values of
- // an HTMLWidget binding's initialize() or factory() function)
- // associated with the elements, in an array. If elements that
- // match the selector don't have an associated HTMLWidget
- // instance, the returned array will contain nulls.
- //
- // The scope argument is optional, and defaults to window.document.
- window.HTMLWidgets.findAll = function(scope, selector) {
- if (arguments.length == 1) {
- selector = scope;
- scope = document;
- }
-
- var nodes = scope.querySelectorAll(selector);
- var results = [];
- for (var i = 0; i < nodes.length; i++) {
- results.push(window.HTMLWidgets.getInstance(nodes[i]));
- }
- return results;
- };
-
- var postRenderHandlers = [];
- function invokePostRenderHandlers() {
- while (postRenderHandlers.length) {
- var handler = postRenderHandlers.shift();
- if (handler) {
- handler();
- }
- }
- }
-
- // Register the given callback function to be invoked after the
- // next time static widgets are rendered.
- window.HTMLWidgets.addPostRenderHandler = function(callback) {
- postRenderHandlers.push(callback);
- };
-
- // Takes a new-style instance-bound definition, and returns an
- // old-style class-bound definition. This saves us from having
- // to rewrite all the logic in this file to accomodate both
- // types of definitions.
- function createLegacyDefinitionAdapter(defn) {
- var result = {
- name: defn.name,
- type: defn.type,
- initialize: function(el, width, height) {
- return defn.factory(el, width, height);
- },
- renderValue: function(el, x, instance) {
- return instance.renderValue(x);
- },
- resize: function(el, width, height, instance) {
- return instance.resize(width, height);
- }
- };
-
- if (defn.find)
- result.find = defn.find;
- if (defn.renderError)
- result.renderError = defn.renderError;
- if (defn.clearError)
- result.clearError = defn.clearError;
-
- return result;
- }
-})();
diff --git a/site_libs/plotly-binding-4.10.4/plotly.js b/site_libs/plotly-binding-4.10.4/plotly.js
deleted file mode 100644
index 7a2a143..0000000
--- a/site_libs/plotly-binding-4.10.4/plotly.js
+++ /dev/null
@@ -1,941 +0,0 @@
-
-HTMLWidgets.widget({
- name: "plotly",
- type: "output",
-
- initialize: function(el, width, height) {
- return {};
- },
-
- resize: function(el, width, height, instance) {
- if (instance.autosize) {
- var width = instance.width || width;
- var height = instance.height || height;
- Plotly.relayout(el.id, {width: width, height: height});
- }
- },
-
- renderValue: function(el, x, instance) {
-
- // Plotly.relayout() mutates the plot input object, so make sure to
- // keep a reference to the user-supplied width/height *before*
- // we call Plotly.plot();
- var lay = x.layout || {};
- instance.width = lay.width;
- instance.height = lay.height;
- instance.autosize = lay.autosize || true;
-
- /*
- / 'inform the world' about highlighting options this is so other
- / crosstalk libraries have a chance to respond to special settings
- / such as persistent selection.
- / AFAIK, leaflet is the only library with such intergration
- / https://github.com/rstudio/leaflet/pull/346/files#diff-ad0c2d51ce5fdf8c90c7395b102f4265R154
- */
- var ctConfig = crosstalk.var('plotlyCrosstalkOpts').set(x.highlight);
-
- if (typeof(window) !== "undefined") {
- // make sure plots don't get created outside the network (for on-prem)
- window.PLOTLYENV = window.PLOTLYENV || {};
- window.PLOTLYENV.BASE_URL = x.base_url;
-
- // Enable persistent selection when shift key is down
- // https://stackoverflow.com/questions/1828613/check-if-a-key-is-down
- var persistOnShift = function(e) {
- if (!e) window.event;
- if (e.shiftKey) {
- x.highlight.persistent = true;
- x.highlight.persistentShift = true;
- } else {
- x.highlight.persistent = false;
- x.highlight.persistentShift = false;
- }
- };
-
- // Only relevant if we haven't forced persistent mode at command line
- if (!x.highlight.persistent) {
- window.onmousemove = persistOnShift;
- }
- }
-
- var graphDiv = document.getElementById(el.id);
-
- // TODO: move the control panel injection strategy inside here...
- HTMLWidgets.addPostRenderHandler(function() {
-
- // lower the z-index of the modebar to prevent it from highjacking hover
- // (TODO: do this via CSS?)
- // https://github.com/ropensci/plotly/issues/956
- // https://www.w3schools.com/jsref/prop_style_zindex.asp
- var modebars = document.querySelectorAll(".js-plotly-plot .plotly .modebar");
- for (var i = 0; i < modebars.length; i++) {
- modebars[i].style.zIndex = 1;
- }
- });
-
- // inject a "control panel" holding selectize/dynamic color widget(s)
- if ((x.selectize || x.highlight.dynamic) && !instance.plotly) {
- var flex = document.createElement("div");
- flex.class = "plotly-crosstalk-control-panel";
- flex.style = "display: flex; flex-wrap: wrap";
-
- // inject the colourpicker HTML container into the flexbox
- if (x.highlight.dynamic) {
- var pickerDiv = document.createElement("div");
-
- var pickerInput = document.createElement("input");
- pickerInput.id = el.id + "-colourpicker";
- pickerInput.placeholder = "asdasd";
-
- var pickerLabel = document.createElement("label");
- pickerLabel.for = pickerInput.id;
- pickerLabel.innerHTML = "Brush color ";
-
- pickerDiv.appendChild(pickerLabel);
- pickerDiv.appendChild(pickerInput);
- flex.appendChild(pickerDiv);
- }
-
- // inject selectize HTML containers (one for every crosstalk group)
- if (x.selectize) {
- var ids = Object.keys(x.selectize);
-
- for (var i = 0; i < ids.length; i++) {
- var container = document.createElement("div");
- container.id = ids[i];
- container.style = "width: 80%; height: 10%";
- container.class = "form-group crosstalk-input-plotly-highlight";
-
- var label = document.createElement("label");
- label.for = ids[i];
- label.innerHTML = x.selectize[ids[i]].group;
- label.class = "control-label";
-
- var selectDiv = document.createElement("div");
- var select = document.createElement("select");
- select.multiple = true;
-
- selectDiv.appendChild(select);
- container.appendChild(label);
- container.appendChild(selectDiv);
- flex.appendChild(container);
- }
- }
-
- // finally, insert the flexbox inside the htmlwidget container,
- // but before the plotly graph div
- graphDiv.parentElement.insertBefore(flex, graphDiv);
-
- if (x.highlight.dynamic) {
- var picker = $("#" + pickerInput.id);
- var colors = x.highlight.color || [];
- // TODO: let users specify options?
- var opts = {
- value: colors[0],
- showColour: "both",
- palette: "limited",
- allowedCols: colors.join(" "),
- width: "20%",
- height: "10%"
- };
- picker.colourpicker({changeDelay: 0});
- picker.colourpicker("settings", opts);
- picker.colourpicker("value", opts.value);
- // inform crosstalk about a change in the current selection colour
- var grps = x.highlight.ctGroups || [];
- for (var i = 0; i < grps.length; i++) {
- crosstalk.group(grps[i]).var('plotlySelectionColour')
- .set(picker.colourpicker('value'));
- }
- picker.on("change", function() {
- for (var i = 0; i < grps.length; i++) {
- crosstalk.group(grps[i]).var('plotlySelectionColour')
- .set(picker.colourpicker('value'));
- }
- });
- }
- }
-
- // if no plot exists yet, create one with a particular configuration
- if (!instance.plotly) {
-
- var plot = Plotly.newPlot(graphDiv, x);
- instance.plotly = true;
-
- } else if (x.layout.transition) {
-
- var plot = Plotly.react(graphDiv, x);
-
- } else {
-
- // this is essentially equivalent to Plotly.newPlot(), but avoids creating
- // a new webgl context
- // https://github.com/plotly/plotly.js/blob/2b24f9def901831e61282076cf3f835598d56f0e/src/plot_api/plot_api.js#L531-L532
-
- // TODO: restore crosstalk selections?
- Plotly.purge(graphDiv);
- // TODO: why is this necessary to get crosstalk working?
- graphDiv.data = undefined;
- graphDiv.layout = undefined;
- var plot = Plotly.newPlot(graphDiv, x);
- }
-
- // Trigger plotly.js calls defined via `plotlyProxy()`
- plot.then(function() {
- if (HTMLWidgets.shinyMode) {
- Shiny.addCustomMessageHandler("plotly-calls", function(msg) {
- var gd = document.getElementById(msg.id);
- if (!gd) {
- throw new Error("Couldn't find plotly graph with id: " + msg.id);
- }
- // This isn't an official plotly.js method, but it's the only current way to
- // change just the configuration of a plot
- // https://community.plot.ly/t/update-config-function/9057
- if (msg.method == "reconfig") {
- Plotly.react(gd, gd.data, gd.layout, msg.args);
- return;
- }
- if (!Plotly[msg.method]) {
- throw new Error("Unknown method " + msg.method);
- }
- var args = [gd].concat(msg.args);
- Plotly[msg.method].apply(null, args);
- });
- }
-
- // plotly's mapbox API doesn't currently support setting bounding boxes
- // https://www.mapbox.com/mapbox-gl-js/example/fitbounds/
- // so we do this manually...
- // TODO: make sure this triggers on a redraw and relayout as well as on initial draw
- var mapboxIDs = graphDiv._fullLayout._subplots.mapbox || [];
- for (var i = 0; i < mapboxIDs.length; i++) {
- var id = mapboxIDs[i];
- var mapOpts = x.layout[id] || {};
- var args = mapOpts._fitBounds || {};
- if (!args) {
- continue;
- }
- var mapObj = graphDiv._fullLayout[id]._subplot.map;
- mapObj.fitBounds(args.bounds, args.options);
- }
-
- });
-
- // Attach attributes (e.g., "key", "z") to plotly event data
- function eventDataWithKey(eventData) {
- if (eventData === undefined || !eventData.hasOwnProperty("points")) {
- return null;
- }
- return eventData.points.map(function(pt) {
- var obj = {
- curveNumber: pt.curveNumber,
- pointNumber: pt.pointNumber,
- x: pt.x,
- y: pt.y
- };
-
- // If 'z' is reported with the event data, then use it!
- if (pt.hasOwnProperty("z")) {
- obj.z = pt.z;
- }
-
- if (pt.hasOwnProperty("customdata")) {
- obj.customdata = pt.customdata;
- }
-
- /*
- TL;DR: (I think) we have to select the graph div (again) to attach keys...
-
- Why? Remember that crosstalk will dynamically add/delete traces
- (see traceManager.prototype.updateSelection() below)
- For this reason, we can't simply grab keys from x.data (like we did previously)
- Moreover, we can't use _fullData, since that doesn't include
- unofficial attributes. It's true that click/hover events fire with
- pt.data, but drag events don't...
- */
- var gd = document.getElementById(el.id);
- var trace = gd.data[pt.curveNumber];
-
- if (!trace._isSimpleKey) {
- var attrsToAttach = ["key"];
- } else {
- // simple keys fire the whole key
- obj.key = trace.key;
- var attrsToAttach = [];
- }
-
- for (var i = 0; i < attrsToAttach.length; i++) {
- var attr = trace[attrsToAttach[i]];
- if (Array.isArray(attr)) {
- if (typeof pt.pointNumber === "number") {
- obj[attrsToAttach[i]] = attr[pt.pointNumber];
- } else if (Array.isArray(pt.pointNumber)) {
- obj[attrsToAttach[i]] = attr[pt.pointNumber[0]][pt.pointNumber[1]];
- } else if (Array.isArray(pt.pointNumbers)) {
- obj[attrsToAttach[i]] = pt.pointNumbers.map(function(idx) { return attr[idx]; });
- }
- }
- }
- return obj;
- });
- }
-
-
- var legendEventData = function(d) {
- // if legendgroup is not relevant just return the trace
- var trace = d.data[d.curveNumber];
- if (!trace.legendgroup) return trace;
-
- // if legendgroup was specified, return all traces that match the group
- var legendgrps = d.data.map(function(trace){ return trace.legendgroup; });
- var traces = [];
- for (i = 0; i < legendgrps.length; i++) {
- if (legendgrps[i] == trace.legendgroup) {
- traces.push(d.data[i]);
- }
- }
-
- return traces;
- };
-
-
- // send user input event data to shiny
- if (HTMLWidgets.shinyMode && Shiny.setInputValue) {
-
- // Some events clear other input values
- // TODO: always register these?
- var eventClearMap = {
- plotly_deselect: ["plotly_selected", "plotly_selecting", "plotly_brushed", "plotly_brushing", "plotly_click"],
- plotly_unhover: ["plotly_hover"],
- plotly_doubleclick: ["plotly_click"]
- };
-
- Object.keys(eventClearMap).map(function(evt) {
- graphDiv.on(evt, function() {
- var inputsToClear = eventClearMap[evt];
- inputsToClear.map(function(input) {
- Shiny.setInputValue(input + "-" + x.source, null, {priority: "event"});
- });
- });
- });
-
- var eventDataFunctionMap = {
- plotly_click: eventDataWithKey,
- plotly_sunburstclick: eventDataWithKey,
- plotly_hover: eventDataWithKey,
- plotly_unhover: eventDataWithKey,
- // If 'plotly_selected' has already been fired, and you click
- // on the plot afterwards, this event fires `undefined`?!?
- // That might be considered a plotly.js bug, but it doesn't make
- // sense for this input change to occur if `d` is falsy because,
- // even in the empty selection case, `d` is truthy (an object),
- // and the 'plotly_deselect' event will reset this input
- plotly_selected: function(d) { if (d) { return eventDataWithKey(d); } },
- plotly_selecting: function(d) { if (d) { return eventDataWithKey(d); } },
- plotly_brushed: function(d) {
- if (d) { return d.range ? d.range : d.lassoPoints; }
- },
- plotly_brushing: function(d) {
- if (d) { return d.range ? d.range : d.lassoPoints; }
- },
- plotly_legendclick: legendEventData,
- plotly_legenddoubleclick: legendEventData,
- plotly_clickannotation: function(d) { return d.fullAnnotation }
- };
-
- var registerShinyValue = function(event) {
- var eventDataPreProcessor = eventDataFunctionMap[event] || function(d) { return d ? d : el.id };
- // some events are unique to the R package
- var plotlyJSevent = (event == "plotly_brushed") ? "plotly_selected" : (event == "plotly_brushing") ? "plotly_selecting" : event;
- // register the event
- graphDiv.on(plotlyJSevent, function(d) {
- Shiny.setInputValue(
- event + "-" + x.source,
- JSON.stringify(eventDataPreProcessor(d)),
- {priority: "event"}
- );
- });
- }
-
- var shinyEvents = x.shinyEvents || [];
- shinyEvents.map(registerShinyValue);
- }
-
- // Given an array of {curveNumber: x, pointNumber: y} objects,
- // return a hash of {
- // set1: {value: [key1, key2, ...], _isSimpleKey: false},
- // set2: {value: [key3, key4, ...], _isSimpleKey: false}
- // }
- function pointsToKeys(points) {
- var keysBySet = {};
- for (var i = 0; i < points.length; i++) {
-
- var trace = graphDiv.data[points[i].curveNumber];
- if (!trace.key || !trace.set) {
- continue;
- }
-
- // set defaults for this keySet
- // note that we don't track the nested property (yet) since we always
- // emit the union -- http://cpsievert.github.io/talks/20161212b/#21
- keysBySet[trace.set] = keysBySet[trace.set] || {
- value: [],
- _isSimpleKey: trace._isSimpleKey
- };
-
- // Use pointNumber by default, but aggregated traces should emit pointNumbers
- var ptNum = points[i].pointNumber;
- var hasPtNum = typeof ptNum === "number";
- var ptNum = hasPtNum ? ptNum : points[i].pointNumbers;
-
- // selecting a point of a "simple" trace means: select the
- // entire key attached to this trace, which is useful for,
- // say clicking on a fitted line to select corresponding observations
- var key = trace._isSimpleKey ? trace.key : Array.isArray(ptNum) ? ptNum.map(function(idx) { return trace.key[idx]; }) : trace.key[ptNum];
- // http://stackoverflow.com/questions/10865025/merge-flatten-an-array-of-arrays-in-javascript
- var keyFlat = trace._isNestedKey ? [].concat.apply([], key) : key;
-
- // TODO: better to only add new values?
- keysBySet[trace.set].value = keysBySet[trace.set].value.concat(keyFlat);
- }
-
- return keysBySet;
- }
-
-
- x.highlight.color = x.highlight.color || [];
- // make sure highlight color is an array
- if (!Array.isArray(x.highlight.color)) {
- x.highlight.color = [x.highlight.color];
- }
-
- var traceManager = new TraceManager(graphDiv, x.highlight);
-
- // Gather all *unique* sets.
- var allSets = [];
- for (var curveIdx = 0; curveIdx < x.data.length; curveIdx++) {
- var newSet = x.data[curveIdx].set;
- if (newSet) {
- if (allSets.indexOf(newSet) === -1) {
- allSets.push(newSet);
- }
- }
- }
-
- // register event listeners for all sets
- for (var i = 0; i < allSets.length; i++) {
-
- var set = allSets[i];
- var selection = new crosstalk.SelectionHandle(set);
- var filter = new crosstalk.FilterHandle(set);
-
- var filterChange = function(e) {
- removeBrush(el);
- traceManager.updateFilter(set, e.value);
- };
- filter.on("change", filterChange);
-
-
- var selectionChange = function(e) {
-
- // Workaround for 'plotly_selected' now firing previously selected
- // points (in addition to new ones) when holding shift key. In our case,
- // we just want the new keys
- if (x.highlight.on === "plotly_selected" && x.highlight.persistentShift) {
- // https://stackoverflow.com/questions/1187518/how-to-get-the-difference-between-two-arrays-in-javascript
- Array.prototype.diff = function(a) {
- return this.filter(function(i) {return a.indexOf(i) < 0;});
- };
- e.value = e.value.diff(e.oldValue);
- }
-
- // array of "event objects" tracking the selection history
- // this is used to avoid adding redundant selections
- var selectionHistory = crosstalk.var("plotlySelectionHistory").get() || [];
-
- // Construct an event object "defining" the current event.
- var event = {
- receiverID: traceManager.gd.id,
- plotlySelectionColour: crosstalk.group(set).var("plotlySelectionColour").get()
- };
- event[set] = e.value;
- // TODO: is there a smarter way to check object equality?
- if (selectionHistory.length > 0) {
- var ev = JSON.stringify(event);
- for (var i = 0; i < selectionHistory.length; i++) {
- var sel = JSON.stringify(selectionHistory[i]);
- if (sel == ev) {
- return;
- }
- }
- }
-
- // accumulate history for persistent selection
- if (!x.highlight.persistent) {
- selectionHistory = [event];
- } else {
- selectionHistory.push(event);
- }
- crosstalk.var("plotlySelectionHistory").set(selectionHistory);
-
- // do the actual updating of traces, frames, and the selectize widget
- traceManager.updateSelection(set, e.value);
- // https://github.com/selectize/selectize.js/blob/master/docs/api.md#methods_items
- if (x.selectize) {
- if (!x.highlight.persistent || e.value === null) {
- selectize.clear(true);
- }
- selectize.addItems(e.value, true);
- selectize.close();
- }
- }
- selection.on("change", selectionChange);
-
- // Set a crosstalk variable selection value, triggering an update
- var turnOn = function(e) {
- if (e) {
- var selectedKeys = pointsToKeys(e.points);
- // Keys are group names, values are array of selected keys from group.
- for (var set in selectedKeys) {
- if (selectedKeys.hasOwnProperty(set)) {
- selection.set(selectedKeys[set].value, {sender: el});
- }
- }
- }
- };
- if (x.highlight.debounce > 0) {
- turnOn = debounce(turnOn, x.highlight.debounce);
- }
- graphDiv.on(x.highlight.on, turnOn);
-
- graphDiv.on(x.highlight.off, function turnOff(e) {
- // remove any visual clues
- removeBrush(el);
- // remove any selection history
- crosstalk.var("plotlySelectionHistory").set(null);
- // trigger the actual removal of selection traces
- selection.set(null, {sender: el});
- });
-
- // register a callback for selectize so that there is bi-directional
- // communication between the widget and direct manipulation events
- if (x.selectize) {
- var selectizeID = Object.keys(x.selectize)[i];
- var options = x.selectize[selectizeID];
- var first = [{value: "", label: "(All)"}];
- var opts = $.extend({
- options: first.concat(options.items),
- searchField: "label",
- valueField: "value",
- labelField: "label",
- maxItems: 50
- },
- options
- );
- var select = $("#" + selectizeID).find("select")[0];
- var selectize = $(select).selectize(opts)[0].selectize;
- // NOTE: this callback is triggered when *directly* altering
- // dropdown items
- selectize.on("change", function() {
- var currentItems = traceManager.groupSelections[set] || [];
- if (!x.highlight.persistent) {
- removeBrush(el);
- for (var i = 0; i < currentItems.length; i++) {
- selectize.removeItem(currentItems[i], true);
- }
- }
- var newItems = selectize.items.filter(function(idx) {
- return currentItems.indexOf(idx) < 0;
- });
- if (newItems.length > 0) {
- traceManager.updateSelection(set, newItems);
- } else {
- // Item has been removed...
- // TODO: this logic won't work for dynamically changing palette
- traceManager.updateSelection(set, null);
- traceManager.updateSelection(set, selectize.items);
- }
- });
- }
- } // end of selectionChange
-
- } // end of renderValue
-}); // end of widget definition
-
-/**
- * @param graphDiv The Plotly graph div
- * @param highlight An object with options for updating selection(s)
- */
-function TraceManager(graphDiv, highlight) {
- // The Plotly graph div
- this.gd = graphDiv;
-
- // Preserve the original data.
- // TODO: try using Lib.extendFlat() as done in
- // https://github.com/plotly/plotly.js/pull/1136
- this.origData = JSON.parse(JSON.stringify(graphDiv.data));
-
- // avoid doing this over and over
- this.origOpacity = [];
- for (var i = 0; i < this.origData.length; i++) {
- this.origOpacity[i] = this.origData[i].opacity === 0 ? 0 : (this.origData[i].opacity || 1);
- }
-
- // key: group name, value: null or array of keys representing the
- // most recently received selection for that group.
- this.groupSelections = {};
-
- // selection parameters (e.g., transient versus persistent selection)
- this.highlight = highlight;
-}
-
-TraceManager.prototype.close = function() {
- // TODO: Unhook all event handlers
-};
-
-TraceManager.prototype.updateFilter = function(group, keys) {
-
- if (typeof(keys) === "undefined" || keys === null) {
-
- this.gd.data = JSON.parse(JSON.stringify(this.origData));
-
- } else {
-
- var traces = [];
- for (var i = 0; i < this.origData.length; i++) {
- var trace = this.origData[i];
- if (!trace.key || trace.set !== group) {
- continue;
- }
- var matchFunc = getMatchFunc(trace);
- var matches = matchFunc(trace.key, keys);
-
- if (matches.length > 0) {
- if (!trace._isSimpleKey) {
- // subsetArrayAttrs doesn't mutate trace (it makes a modified clone)
- trace = subsetArrayAttrs(trace, matches);
- }
- traces.push(trace);
- }
- }
- this.gd.data = traces;
- }
-
- Plotly.redraw(this.gd);
-
- // NOTE: we purposely do _not_ restore selection(s), since on filter,
- // axis likely will update, changing the pixel -> data mapping, leading
- // to a likely mismatch in the brush outline and highlighted marks
-
-};
-
-TraceManager.prototype.updateSelection = function(group, keys) {
-
- if (keys !== null && !Array.isArray(keys)) {
- throw new Error("Invalid keys argument; null or array expected");
- }
-
- // if selection has been cleared, or if this is transient
- // selection, delete the "selection traces"
- var nNewTraces = this.gd.data.length - this.origData.length;
- if (keys === null || !this.highlight.persistent && nNewTraces > 0) {
- var tracesToRemove = [];
- for (var i = 0; i < this.gd.data.length; i++) {
- if (this.gd.data[i]._isCrosstalkTrace) tracesToRemove.push(i);
- }
- Plotly.deleteTraces(this.gd, tracesToRemove);
- this.groupSelections[group] = keys;
- } else {
- // add to the groupSelection, rather than overwriting it
- // TODO: can this be removed?
- this.groupSelections[group] = this.groupSelections[group] || [];
- for (var i = 0; i < keys.length; i++) {
- var k = keys[i];
- if (this.groupSelections[group].indexOf(k) < 0) {
- this.groupSelections[group].push(k);
- }
- }
- }
-
- if (keys === null) {
-
- Plotly.restyle(this.gd, {"opacity": this.origOpacity});
-
- } else if (keys.length >= 1) {
-
- // placeholder for new "selection traces"
- var traces = [];
- // this variable is set in R/highlight.R
- var selectionColour = crosstalk.group(group).var("plotlySelectionColour").get() ||
- this.highlight.color[0];
-
- for (var i = 0; i < this.origData.length; i++) {
- // TODO: try using Lib.extendFlat() as done in
- // https://github.com/plotly/plotly.js/pull/1136
- var trace = JSON.parse(JSON.stringify(this.gd.data[i]));
- if (!trace.key || trace.set !== group) {
- continue;
- }
- // Get sorted array of matching indices in trace.key
- var matchFunc = getMatchFunc(trace);
- var matches = matchFunc(trace.key, keys);
-
- if (matches.length > 0) {
- // If this is a "simple" key, that means select the entire trace
- if (!trace._isSimpleKey) {
- trace = subsetArrayAttrs(trace, matches);
- }
- // reach into the full trace object so we can properly reflect the
- // selection attributes in every view
- var d = this.gd._fullData[i];
-
- /*
- / Recursively inherit selection attributes from various sources,
- / in order of preference:
- / (1) official plotly.js selected attribute
- / (2) highlight(selected = attrs_selected(...))
- */
- // TODO: it would be neat to have a dropdown to dynamically specify these!
- $.extend(true, trace, this.highlight.selected);
-
- // if it is defined, override color with the "dynamic brush color""
- if (d.marker) {
- trace.marker = trace.marker || {};
- trace.marker.color = selectionColour || trace.marker.color || d.marker.color;
- }
- if (d.line) {
- trace.line = trace.line || {};
- trace.line.color = selectionColour || trace.line.color || d.line.color;
- }
- if (d.textfont) {
- trace.textfont = trace.textfont || {};
- trace.textfont.color = selectionColour || trace.textfont.color || d.textfont.color;
- }
- if (d.fillcolor) {
- // TODO: should selectionColour inherit alpha from the existing fillcolor?
- trace.fillcolor = selectionColour || trace.fillcolor || d.fillcolor;
- }
- // attach a sensible name/legendgroup
- trace.name = trace.name || keys.join(" ");
- trace.legendgroup = trace.legendgroup || keys.join(" ");
-
- // keep track of mapping between this new trace and the trace it targets
- // (necessary for updating frames to reflect the selection traces)
- trace._originalIndex = i;
- trace._newIndex = this.gd._fullData.length + traces.length;
- trace._isCrosstalkTrace = true;
- traces.push(trace);
- }
- }
-
- if (traces.length > 0) {
-
- Plotly.addTraces(this.gd, traces).then(function(gd) {
- // incrementally add selection traces to frames
- // (this is heavily inspired by Plotly.Plots.modifyFrames()
- // in src/plots/plots.js)
- var _hash = gd._transitionData._frameHash;
- var _frames = gd._transitionData._frames || [];
-
- for (var i = 0; i < _frames.length; i++) {
-
- // add to _frames[i].traces *if* this frame references selected trace(s)
- var newIndices = [];
- for (var j = 0; j < traces.length; j++) {
- var tr = traces[j];
- if (_frames[i].traces.indexOf(tr._originalIndex) > -1) {
- newIndices.push(tr._newIndex);
- _frames[i].traces.push(tr._newIndex);
- }
- }
-
- // nothing to do...
- if (newIndices.length === 0) {
- continue;
- }
-
- var ctr = 0;
- var nFrameTraces = _frames[i].data.length;
-
- for (var j = 0; j < nFrameTraces; j++) {
- var frameTrace = _frames[i].data[j];
- if (!frameTrace.key || frameTrace.set !== group) {
- continue;
- }
-
- var matchFunc = getMatchFunc(frameTrace);
- var matches = matchFunc(frameTrace.key, keys);
-
- if (matches.length > 0) {
- if (!trace._isSimpleKey) {
- frameTrace = subsetArrayAttrs(frameTrace, matches);
- }
- var d = gd._fullData[newIndices[ctr]];
- if (d.marker) {
- frameTrace.marker = d.marker;
- }
- if (d.line) {
- frameTrace.line = d.line;
- }
- if (d.textfont) {
- frameTrace.textfont = d.textfont;
- }
- ctr = ctr + 1;
- _frames[i].data.push(frameTrace);
- }
- }
-
- // update gd._transitionData._frameHash
- _hash[_frames[i].name] = _frames[i];
- }
-
- });
-
- // dim traces that have a set matching the set of selection sets
- var tracesToDim = [],
- opacities = [],
- sets = Object.keys(this.groupSelections),
- n = this.origData.length;
-
- for (var i = 0; i < n; i++) {
- var opacity = this.origOpacity[i] || 1;
- // have we already dimmed this trace? Or is this even worth doing?
- if (opacity !== this.gd._fullData[i].opacity || this.highlight.opacityDim === 1) {
- continue;
- }
- // is this set an element of the set of selection sets?
- var matches = findMatches(sets, [this.gd.data[i].set]);
- if (matches.length) {
- tracesToDim.push(i);
- opacities.push(opacity * this.highlight.opacityDim);
- }
- }
-
- if (tracesToDim.length > 0) {
- Plotly.restyle(this.gd, {"opacity": opacities}, tracesToDim);
- // turn off the selected/unselected API
- Plotly.restyle(this.gd, {"selectedpoints": null});
- }
-
- }
-
- }
-};
-
-/*
-Note: in all of these match functions, we assume needleSet (i.e. the selected keys)
-is a 1D (or flat) array. The real difference is the meaning of haystack.
-findMatches() does the usual thing you'd expect for
-linked brushing on a scatterplot matrix. findSimpleMatches() returns a match iff
-haystack is a subset of the needleSet. findNestedMatches() returns
-*/
-
-function getMatchFunc(trace) {
- return (trace._isNestedKey) ? findNestedMatches :
- (trace._isSimpleKey) ? findSimpleMatches : findMatches;
-}
-
-// find matches for "flat" keys
-function findMatches(haystack, needleSet) {
- var matches = [];
- haystack.forEach(function(obj, i) {
- if (obj === null || needleSet.indexOf(obj) >= 0) {
- matches.push(i);
- }
- });
- return matches;
-}
-
-// find matches for "simple" keys
-function findSimpleMatches(haystack, needleSet) {
- var match = haystack.every(function(val) {
- return val === null || needleSet.indexOf(val) >= 0;
- });
- // yes, this doesn't make much sense other than conforming
- // to the output type of the other match functions
- return (match) ? [0] : []
-}
-
-// find matches for a "nested" haystack (2D arrays)
-function findNestedMatches(haystack, needleSet) {
- var matches = [];
- for (var i = 0; i < haystack.length; i++) {
- var hay = haystack[i];
- var match = hay.every(function(val) {
- return val === null || needleSet.indexOf(val) >= 0;
- });
- if (match) {
- matches.push(i);
- }
- }
- return matches;
-}
-
-function isPlainObject(obj) {
- return (
- Object.prototype.toString.call(obj) === '[object Object]' &&
- Object.getPrototypeOf(obj) === Object.prototype
- );
-}
-
-function subsetArrayAttrs(obj, indices) {
- var newObj = {};
- Object.keys(obj).forEach(function(k) {
- var val = obj[k];
-
- if (k.charAt(0) === "_") {
- newObj[k] = val;
- } else if (k === "transforms" && Array.isArray(val)) {
- newObj[k] = val.map(function(transform) {
- return subsetArrayAttrs(transform, indices);
- });
- } else if (k === "colorscale" && Array.isArray(val)) {
- newObj[k] = val;
- } else if (isPlainObject(val)) {
- newObj[k] = subsetArrayAttrs(val, indices);
- } else if (Array.isArray(val)) {
- newObj[k] = subsetArray(val, indices);
- } else {
- newObj[k] = val;
- }
- });
- return newObj;
-}
-
-function subsetArray(arr, indices) {
- var result = [];
- for (var i = 0; i < indices.length; i++) {
- result.push(arr[indices[i]]);
- }
- return result;
-}
-
-// Convenience function for removing plotly's brush
-function removeBrush(el) {
- var outlines = el.querySelectorAll(".select-outline");
- for (var i = 0; i < outlines.length; i++) {
- outlines[i].remove();
- }
-}
-
-
-// https://davidwalsh.name/javascript-debounce-function
-
-// Returns a function, that, as long as it continues to be invoked, will not
-// be triggered. The function will be called after it stops being called for
-// N milliseconds. If `immediate` is passed, trigger the function on the
-// leading edge, instead of the trailing.
-function debounce(func, wait, immediate) {
- var timeout;
- return function() {
- var context = this, args = arguments;
- var later = function() {
- timeout = null;
- if (!immediate) func.apply(context, args);
- };
- var callNow = immediate && !timeout;
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- if (callNow) func.apply(context, args);
- };
-};
diff --git a/structures/structures.html b/structures/structures.html
index 4636891..9319908 100644
--- a/structures/structures.html
+++ b/structures/structures.html
@@ -200,7 +200,7 @@
This week you will meet your data. The independent study will concisely cover how these data were generated and how they have been processed before being given to you. There will also be an overview of the analysis we will carry out over three workshops. In the workshop, you will learn what steps to take to get a good understanding of ’omics data before you consider any statistical analysis. This is an often overlooked, but very valuable and informative, part of any data pipeline. It gives you the deep understanding of the data structures and values that you will need to code and trouble-shoot code, allows you to spot failed or problematic samples and informs your decisions on quality control.
+
This week you will meet your data. The independent study will summarise how these data were generated and how they have been processed before being given to you. There will also be an overview of the analysis we will carry out over three workshops. In the workshop, you will learn what steps to take to get a good understanding of transcriptomics data before you consider any statistical analysis. This is an often overlooked, but very valuable and informative, part of any data pipeline. It gives you the deep understanding of the data structures and values that you will need to code and trouble-shoot code, allows you to spot failed or problematic samples and informs your decisions on quality control.
We suggest you sit together with your group in the workshop.
You need only do the section for your own project data
-
🐸 Frogs
-
🎬 Open your frogs-88H Project. Make a new script and, using cont-fgf-s30.R as a template, repeat the analysis on one of the other comparisons.
-
🐭 Mice
-
🎬 Open your mice-88H Project. Open your hspc-prog.R script and, using you code working with the hspc cells as a template, repeat the analysis on the prog cells.
-
🍂 xxxx
-
Follow one of the other examples.
-
+
🐸 Frog development
+
🎬 Open your frogs-88H Project. Make a new script and, using cont-fgf-s30.R as a template, repeat the analysis on one of the other comparisons. It does not matter which one you choose. I recommend making a new script.
+
🐭 Stem cells
+
🎬 Open your mice-88H Project. Open your hspc-prog.R script and, using your code working with the hspc cells as a template, repeat the analysis on the prog cells. Add the code to hspc-prog.R as you will later add the statistical comparison between these cell types.
The RNA-seq data are from an Illumina machine 150-300bp
-
Reads are in FASTQ files
-
FASTQ files contain the sequence of each read and a quality score for each base
-
-
-
-
What has been done to the data so far
@@ -541,32 +516,32 @@
What has been done to the data so far
General steps
-
Reads are filtered and trimmed on the basis of the quality score
+
Reads are filtered and trimmed on the basis of a quality score
They are then aligned/pseudo-aligned to a reference genome/transcriptome
-
Reads are then counted to quantify the expression
-
Counts will need to be normalised to account for differences in sequencing depth and gene/transcript/ length before, or as part of, statistical analysis.
+
And then counted to quantify the expression
+
Counts need to be normalised to account for differences in sequencing depth and transcript length before, or as part of, statistical analysis.
Transcriptomics 1: Hello data Getting to know the data. Checking the distributions of values overall, across samples and across genes to check things are as we expect and detect genes/samples that need to be removed
-
Transcriptomics 2: Statistical Analysis Identifying which genes are differentially expressed between treatments. This is the main analysis step. We will use different methods for bulk and single cell data.
-
Transcriptomics 3: Visualising and Interpreting Production of volcano plots and heatmaps to visualise the results of the statistical analysis. We will also look at how to interpret the results and how to find out more about the genes of interest.
+
Transcriptomics 1: Hello data Getting to know the data. Checking the distributions of values overall, across rows and columns to check things are as we expect and detect rows/columns that need to be removed
+
Transcriptomics 2: Statistical Analysis. Identifying which genes are differentially expressed between treatments. This is the main analysis step. We will use different methods for bulk and single cell data.
+
Transcriptomics 3: Visualising. Principal Component Analysis (PCA) volcano plots to visualise the results of the
Love, Michael I., Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-Seq Data with DESeq2.”Genome Biology 15: 550. https://doi.org/10.1186/s13059-014-0550-8.
@@ -597,9 +579,24 @@
References
Nestorowa, Sonia, Fiona K. Hamey, Blanca Pijuan Sala, Evangelia Diamanti, Mairi Shepherd, Elisa Laurenti, Nicola K. Wilson, David G. Kent, and Berthold Göttgens. 2016. “A Single-Cell Resolution Map of Mouse Hematopoietic Stem and Progenitor Cell Differentiation.”Blood 128 (8): e20–31. https://doi.org/10.1182/blood-2016-05-716480.
+
+R Core Team. 2024. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
+
+Xie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.
+
+
+———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
+
+
+———. 2024. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.
+
In this workshop you will learn what steps to take to get a good understanding of your transcriptomics data before you consider any statistical analysis. This is an often overlooked, but very valuable and informative, part of any data pipeline. It gives you the deep understanding of the data structures and values that you will need to code and trouble-shoot code, allows you to spot failed or problematic samples and informs your decisions on quality control.
-
You should examine all three data sets because the comparisons will give you a stronger understanding of your own project data.
-
Exercises
-
Set up a Project
+
In this session, you should examine all four data sets because the comparisons will give you a much stronger understanding of your own project data. Compare and contrast is a very useful way to build understanding.
+
Set up a Project
🎬 Start RStudio from the Start menu
🎬 Make an RStudio project. Be deliberate about where you create it so that it is a good place for you
🎬 Use the Files pane to make new folders for the data. I suggest data-raw and data-processed
# 🐸 import the s30 data
-s30<-read_csv("data-raw/xlaevis_counts_S30.csv")
-
-
-
# 🐭 import the hspc data
-hspc<-read_csv("data-raw/surfaceome_hspc.csv")
-
-
-
# 🍂 xxxx import the xxxx data
-# prog <- read_csv("")
-
-
🎬 Check these have the number of rows and column you were expecting and that column types and names are as expected.
-
Explore
+
Explore data in R
The first task is to get an overview. We want to know
-
are there any missing values? If so, how many and how are they distributed?
-
how may zeros are there and how are they distributed
-
does it look as tough all the samples/cells were equally “successful”? Can we spot any problematic anomalies?
-
what is the distribution of values?
+
how may zeros are there and how are they distributed?
+
what is the distribution of non-zero values?
+
does it look as though all the samples/cells were equally “successful”? Can we spot any problems?
+
can we determine a quality threshold for filtering out genes with very low counts?
-
If our data collection has gone well we would hope to see approximately the same average expression in each sample or cell of the same type. That is replicates should be similar. We would also expect to see that the average expression of genes varies. We might have genes which are zero in every cell/sample. We will want to to filter those out.
+
Genes which are zero in every cell/sample, i.e., genes that are not expressed at all give us no information. We will want to to filter those out. We will also want to filter out genes with very low counts for quality control. These are mostly likely false positives. If our data collection has gone well we would hope to see approximately the same average expression in each sample/cell of the same type. That is, replicates should be similar. In contrast, we would expect to see that the average expression of genes varies.
We get this overview by looking at:
-
The distribution of values across the whole dataset
-
The distribution of values across the sample/cells (i.e., averaged across genes). This allows us to see variation between samples/cells:
-
The distribution of values across the genes (i.e., averaged across samples/cells). This allows us to see variation between genes.
+
The distribution of values across all the data in the file
+
The distribution of values across the samples/cells (i.e., averaged across genes). This allows us to see variation between samples/cells:
+
The distribution of values across the genes (i.e., averaged across samples/cells). This allows us to see variation between genes.
-
Distribution of values across the whole dataset
-
In all data sets, the values are spread over multiple columns so in order to plot the distribution as a whole, we will need to first use pivot_longer() to put the data in ‘tidy’ format(Wickham2014-nl?) by stacking the columns. We could save a copy of the stacked data and then plot it, but here, I have just piped the stacked data straight into ggplot().
-
🐸 Frogs
-
🎬 Pivot the counts (stack the columns) so all the counts are in a single column (count) and pipe into ggplot() to create a histogram:
+
The next sections will guide you through each of these for each of the data sets. Start with your own data set then move on to at least one of the others.
# 🐸 import the s30 data
+s30<-read_csv("data-raw/xlaevis_counts_S30.csv")
+
+
🎬 Check the dataframe has the number of rows and columns you were expecting and that column types and names are as expected.
+
Distribution of values across all the data in the file
+
The values are spread over multiple columns so in order to plot the distribution as a whole, we will need to first use pivot_longer() to put the data in ‘tidy’ format(Wickham 2014) by stacking the columns. We could save a copy of the stacked data and then plot it, but here, I have just piped the stacked data straight into ggplot(). This helps me avoid cluttering my R environment with temporary objects.
+
🎬 Pivot the counts (stack the columns) so all the counts are in a single column (count) labelled in sample by the column it came from and pipe into ggplot() to create a histogram:
This data is very skewed - there are so many low values that we can’t see the tiny bars for the higher values. Logging the counts is a way to make the distribution more visible.
-
🎬 Repeat the plot on log of the counts.
+
This data is very skewed - there are very many low counts and a very few higher numbers. It is hard to see the very low bars for the higher values. Logging the counts is a way to make the distribution more visible. You cannot take the log of 0 so we add 1 to the count before logging. The log of 1 is zero so we will be able to see how many zeros we had.
I’ve used base 10 only because it easy to convert to the original scale (1 is 10, 2 is 100, 3 is 1000 etc). The warning about rows being removed is expected - these are the counts of 0 since you can’t log a value of 0. The peak at zero suggests quite a few counts of 1. We would expect we would expect the distribution of counts to be roughly log normal because this is expression of all the genes in the genome1. That small peak near the low end suggests that these lower counts might be anomalies.
-
The excess number of low counts indicates we might want to create a cut off for quality control. The removal of low counts is a common processing step in ’omic data. We will revisit this after we have considered the distribution of counts across samples and genes.
-
🐭 Mice
-
🎬 Pivot the expression values (stack the columns) so all the counts are in a single column (expr) and pipe into ggplot() to create a histogram:
This is a very striking distribution. Is it what we are expecting? Again,the excess number of low values is almost certainly anomalous. They will be inaccurate measure and we will want to exclude expression values below (about) 1. We will revisit this after we have considered the distribution of expression across cells and genes.
-
What about the bimodal appearance of the the ‘real’ values? If we had the whole genome we would not expect to see such a pattern - we’d expect to see a roughly normal distribution2. However, this is a subset of the genome and the nature of the subsetting has had an influence here. These are a subset of cell surface proteins that show a significant difference between at least two of twelve cell subtypes. That is, all of these genes are either high or low.
-
Distribution of values across the sample/cells
-
🐸 Frog samples
-
Summary statistics including the the number of NAs can be seen using the summary(). It is most helpful which you have up to about 30 columns. There is nothing special about the number 30, it is just that text summaries of a larger number of columns are difficult to grasp.
-
🎬 Get a quick overview of the columns:
+
I’ve used base 10 only because it easy to convert to the original scale (1 is 10, 2 is 100, 3 is 1000 etc). Notice we have a peak at zero indicating there are many zeros. We would expect the distribution of counts to be roughly log normal because this is expression of all the genes in the genome1. The number of low counts is inflated (small peak near the low end). This suggests that these lower counts might be false positives. The removal of low counts is a common processing step in ’omic data. We will revisit this after we have considered the distribution of counts across samples and genes.
+
Distribution of values across the samples
+
Summary statistics including the the number of NAs can be seen using the summary(). It is most helpful which you have up to about 25 columns. There is nothing special about the number 25, it is just that summaries of a larger number of columns are difficult to grasp.
+
🎬 Get a quick overview of the 7 columns:
-
# examine all the columns quickly
+
# examine all the columns quickly# works well with smaller numbers of columnsummary(s30)
@@ -539,51 +524,56 @@
Workshop
Max. :117573.0 Max. :130672.0 Max. :61531.0
-
Notice that: - the minimum count is 0 and the maximums are very high in all the columns - the medians are quite a lot lower than the means so the data are skewed (hump to the left, tail to the right) - there must be quite a lot of zeros - the columns are roughly similar and it doesn’t look like there is an anomalous replicate.
-
To find out how may zeros there are in a column we can make use of the fact that TRUE evaluates to 1 and FALSE evaluates to 0. This means sum(S30_C_1 == 0) gives the number of 0 in the S30_C_1 column
-
🎬 Find the number of zeros in all six columns:
+
Notice that:
+
+
the minimum count is 0 and the maximums are very high in all the columns
+
the medians are quite a lot lower than the means so the data are skewed (hump to the left, tail to the right) and there must be quite a lot of zeros
+
+S30_F_3 does have a somewhat lower maximum count
+
+
We want to know how many zeros there are in each a column. A useful trick to determine this is to make use we can make use of the fact that TRUE evaluates to 1 and FALSE evaluates to 0. This means you can sum a column of TRUE/FALSE values to get the number of TRUE values. For example, sum(S30_C_1 > 0) gives the number of values above zero in the S30_C_1 column. If you wanted the number of zeros, you would use sum(S30_C_1 == 0).
+
🎬 Find the number values above zero in all six columns:
There is a better way of doing this that saves you having to repeat so much code - especially useful if you have a lot more than 6 columns. We can use pivot_longer() to put the data in tidy format and then use the group_by() and summarise() approach we have used extensively before.
+
There is a better way of doing this that saves you having to repeat so much code - very useful if you have a lot more than 6 columns! We can use pivot_longer() to put the data in tidy format and then use the group_by() and summarise() approach we have used extensively before.
Plotting the distribution of values is perhaps the easiest way to understand the data. We could plot each column separately or we can pipe the tidy format of data into ggplot() and make use of facet_wrap()
-
🎬 Pivot the data and pipe into ggplot:
+
The mean count ranges from 260 to 426. S30_F_3 does stand out a little but not by too much. If we had more replicates we might consider analysing with and with out this replicate. Since we have just 3, we will leave it in. The potential effect of an odd replicate is slightly statistical power. The major differences in gene expression will still be uncovered. Differences between genes with lower average expression and or more variable expression might be missed. Whether this matters depends on the biological question you are asking. In this case, it does not matter because the major differences in gene expression will be enough.
+
🎬 Save the summary as a dataframe, s30_summary_samp (using assignment).
+
We can also plot the distribution of counts across samples. We have many values (11893) so we are not limited to using geom_histogram(). geom_density() gives us a smooth distribution.
+
🎬 Plot the log10 of the counts + 1 again but this time facet by the sample:
the distributions are roughly similar in width, height, location and overall shape so it doesn’t look as though we have any suspect samples
+
the distributions are roughly similar with S30_F_3 does stand out a little
the peak at zero suggests quite a few counts of 1.
since we would expect the distribution of counts in each sample to be roughly log normal so that the small rise near the low end, even before the peak at zero, suggests that these lower counts might be anomalies.
-
The excess number of low counts indicates we might want to create a cut off for quality control. The removal of low counts is a common processing step in ’omic data. We will revisit this after we have considered the distribution of counts across genes (averaged over the samples).
-
🐭 Mouse cells
-
We used the summary() function to get an overview of the columns in the frog data. Let’s try that here.
ensembl_gene_id HSPC_001 HSPC_002 HSPC_003
- Length:280 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- Class :character 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Mode :character Median : 0.000 Median : 0.000 Median : 0.9929
- Mean : 2.143 Mean : 1.673 Mean : 2.5964
- 3rd Qu.: 2.120 3rd Qu.: 2.239 3rd Qu.: 6.1559
- Max. :12.567 Max. :11.976 Max. :11.1138
- HSPC_004 HSPC_006 HSPC_008 HSPC_009
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. :0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000
- Median : 0.000 Median : 1.276 Median : 0.000 Median :0.000
- Mean : 1.851 Mean : 2.338 Mean : 2.375 Mean :2.220
- 3rd Qu.: 2.466 3rd Qu.: 3.536 3rd Qu.: 3.851 3rd Qu.:3.594
- Max. :11.133 Max. :10.014 Max. :11.574 Max. :9.997
- HSPC_011 HSPC_012 HSPC_014 HSPC_015
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 1.750 Median : 0.000 Median : 0.000
- Mean : 2.285 Mean : 2.431 Mean : 2.295 Mean : 2.515
- 3rd Qu.: 3.193 3rd Qu.: 3.741 3rd Qu.: 3.150 3rd Qu.: 3.789
- Max. :11.260 Max. :10.905 Max. :11.051 Max. :10.751
- HSPC_016 HSPC_017 HSPC_018 HSPC_020
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.9488 Median : 0.000 Median : 1.248 Median : 0.000
- Mean : 2.6115 Mean : 2.146 Mean : 2.710 Mean : 2.509
- 3rd Qu.: 5.9412 3rd Qu.: 2.357 3rd Qu.: 6.006 3rd Qu.: 4.470
- Max. :11.3082 Max. :12.058 Max. :11.894 Max. :11.281
- HSPC_021 HSPC_022 HSPC_023 HSPC_024
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.170 Mean : 2.287 Mean : 2.314 Mean : 2.195
- 3rd Qu.: 2.996 3rd Qu.: 3.351 3rd Qu.: 2.749 3rd Qu.: 2.944
- Max. :10.709 Max. :11.814 Max. :12.113 Max. :11.279
- HSPC_025 HSPC_026 HSPC_027 HSPC_028
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.572 Median : 1.385 Median : 0.000 Median : 0.000
- Mean : 2.710 Mean : 2.721 Mean : 2.458 Mean : 1.906
- 3rd Qu.: 5.735 3rd Qu.: 6.392 3rd Qu.: 5.496 3rd Qu.: 2.037
- Max. :11.309 Max. :10.865 Max. :11.266 Max. :10.777
- HSPC_030 HSPC_031 HSPC_033 HSPC_034
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 1.119 Median : 0.9026 Median : 0.000 Median : 0.7984
- Mean : 2.338 Mean : 2.3049 Mean : 1.938 Mean : 2.3220
- 3rd Qu.: 3.005 3rd Qu.: 2.9919 3rd Qu.: 2.434 3rd Qu.: 4.8324
- Max. :11.391 Max. :11.1748 Max. :10.808 Max. :10.6707
- HSPC_035 HSPC_036 HSPC_037 HSPC_038
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.8879 Median : 1.517 Median : 0.000
- Mean : 1.810 Mean : 2.6918 Mean : 2.327 Mean : 2.212
- 3rd Qu.: 2.175 3rd Qu.: 5.9822 3rd Qu.: 3.079 3rd Qu.: 2.867
- Max. :11.221 Max. :11.3018 Max. :11.399 Max. :12.275
- HSPC_040 HSPC_041 HSPC_042 HSPC_043
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.8673 Median : 1.342
- Mean : 2.509 Mean : 2.492 Mean : 2.3673 Mean : 2.420
- 3rd Qu.: 3.995 3rd Qu.: 3.943 3rd Qu.: 3.8371 3rd Qu.: 3.731
- Max. :11.863 Max. :11.016 Max. :11.4852 Max. :11.123
- HSPC_044 HSPC_045 HSPC_046 HSPC_047
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.8452 Median : 2.195
- Mean : 2.382 Mean : 2.277 Mean : 1.9707 Mean : 2.498
- 3rd Qu.: 3.998 3rd Qu.: 2.843 3rd Qu.: 2.0656 3rd Qu.: 3.937
- Max. :10.782 Max. :10.629 Max. :11.0311 Max. :10.180
- HSPC_048 HSPC_049 HSPC_050 HSPC_051
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 1.108 Median : 1.275 Median : 0.000 Median : 0.9757
- Mean : 2.289 Mean : 2.453 Mean : 2.673 Mean : 2.2693
- 3rd Qu.: 2.988 3rd Qu.: 3.819 3rd Qu.: 5.772 3rd Qu.: 3.1644
- Max. :10.335 Max. :11.844 Max. :11.301 Max. :10.8692
- HSPC_052 HSPC_053 HSPC_054 HSPC_055
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.509 Median : 0.818 Median : 0.000 Median : 0.000
- Mean : 2.561 Mean : 2.684 Mean : 2.107 Mean : 1.959
- 3rd Qu.: 4.644 3rd Qu.: 5.937 3rd Qu.: 2.568 3rd Qu.: 2.573
- Max. :11.674 Max. :11.624 Max. :10.770 Max. :11.105
- HSPC_056 HSPC_057 HSPC_058 HSPC_060
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 1.399 Median : 0.000
- Mean : 2.295 Mean : 2.430 Mean : 2.296 Mean : 2.112
- 3rd Qu.: 3.721 3rd Qu.: 3.806 3rd Qu.: 3.199 3rd Qu.: 2.201
- Max. :11.627 Max. :10.575 Max. :11.134 Max. :10.631
- HSPC_061 HSPC_062 HSPC_063 HSPC_064
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 1.515 Median : 1.101
- Mean : 1.934 Mean : 2.129 Mean : 2.508 Mean : 2.696
- 3rd Qu.: 2.489 3rd Qu.: 2.875 3rd Qu.: 4.895 3rd Qu.: 6.412
- Max. :11.190 Max. :10.433 Max. :10.994 Max. :10.873
- HSPC_065 HSPC_066 HSPC_067 HSPC_068
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.4852 Median : 0.000 Median : 1.441 Median : 0.000
- Mean : 2.2676 Mean : 2.136 Mean : 2.480 Mean : 2.449
- 3rd Qu.: 3.8217 3rd Qu.: 2.632 3rd Qu.: 3.548 3rd Qu.: 4.517
- Max. :10.9023 Max. :11.608 Max. :11.147 Max. :10.901
- HSPC_069 HSPC_070 HSPC_071 HSPC_072
- Min. : 0.000 Min. : 0.0000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.000 Median : 0.8949 Median : 0.9272 Median : 1.121
- Mean : 2.406 Mean : 2.5826 Mean : 2.2844 Mean : 2.545
- 3rd Qu.: 4.705 3rd Qu.: 5.4749 3rd Qu.: 3.2531 3rd Qu.: 4.939
- Max. :11.258 Max. :11.6715 Max. :10.7886 Max. :11.397
- HSPC_073 HSPC_074 HSPC_075 HSPC_076
- Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.00 Median : 1.674 Median : 0.000
- Mean : 2.491 Mean : 2.46 Mean : 2.413 Mean : 2.289
- 3rd Qu.: 4.134 3rd Qu.: 3.40 3rd Qu.: 3.013 3rd Qu.: 2.550
- Max. :11.844 Max. :11.66 Max. :11.976 Max. :12.136
- HSPC_077 HSPC_078 HSPC_079 HSPC_080
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.6624 Median : 1.492 Median : 1.384 Median : 1.013
- Mean : 2.4336 Mean : 2.637 Mean : 2.432 Mean : 2.881
- 3rd Qu.: 5.4937 3rd Qu.: 5.472 3rd Qu.: 3.617 3rd Qu.: 7.220
- Max. :11.6020 Max. :10.673 Max. :11.199 Max. :11.836
- HSPC_081 HSPC_082 HSPC_083 HSPC_084
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.7671 Median : 0.000 Median : 1.896 Median : 1.128
- Mean : 1.9227 Mean : 2.474 Mean : 2.864 Mean : 2.289
- 3rd Qu.: 1.6349 3rd Qu.: 3.488 3rd Qu.: 5.101 3rd Qu.: 2.792
- Max. :11.4681 Max. :11.962 Max. :10.865 Max. :11.834
- HSPC_085 HSPC_087 HSPC_088 HSPC_089
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.157 Mean : 2.314 Mean : 2.202 Mean : 2.329
- 3rd Qu.: 3.010 3rd Qu.: 3.245 3rd Qu.: 2.092 3rd Qu.: 3.246
- Max. :10.809 Max. :10.976 Max. :11.362 Max. :11.301
- HSPC_090 HSPC_094 HSPC_095 HSPC_096
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. :0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000
- Median : 0.000 Median : 0.000 Median : 2.055 Median :0.000
- Mean : 2.286 Mean : 2.186 Mean : 2.756 Mean :2.348
- 3rd Qu.: 4.174 3rd Qu.: 2.002 3rd Qu.: 4.370 3rd Qu.:4.482
- Max. :11.124 Max. :11.694 Max. :11.385 Max. :9.601
- HSPC_098 HSPC_099 HSPC_100 HSPC_101
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.007
- Mean : 2.209 Mean : 2.082 Mean : 2.313 Mean : 2.587
- 3rd Qu.: 3.354 3rd Qu.: 2.505 3rd Qu.: 2.775 3rd Qu.: 5.334
- Max. :11.070 Max. :10.200 Max. :11.452 Max. :11.456
- HSPC_102 HSPC_103 HSPC_104 HSPC_105
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.111 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.210 Mean : 2.853 Mean : 2.099 Mean : 1.893
- 3rd Qu.: 2.993 3rd Qu.: 6.123 3rd Qu.: 2.720 3rd Qu.: 2.129
- Max. :11.153 Max. :11.328 Max. :10.746 Max. :10.721
- HSPC_106 HSPC_107 HSPC_108 HSPC_109
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.595
- Mean : 1.980 Mean : 2.279 Mean : 2.296 Mean : 2.420
- 3rd Qu.: 2.425 3rd Qu.: 3.396 3rd Qu.: 3.361 3rd Qu.: 4.006
- Max. :10.919 Max. :10.982 Max. :11.744 Max. :10.463
- HSPC_110 HSPC_111 HSPC_114 HSPC_115
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.9173 Median : 2.349
- Mean : 2.159 Mean : 1.800 Mean : 1.8376 Mean : 2.943
- 3rd Qu.: 2.667 3rd Qu.: 2.214 3rd Qu.: 1.8741 3rd Qu.: 6.223
- Max. :11.121 Max. :11.109 Max. :10.4645 Max. :11.124
- HSPC_117 HSPC_118 HSPC_119 HSPC_120
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.187
- Mean : 1.919 Mean : 1.855 Mean : 2.289 Mean : 2.041
- 3rd Qu.: 2.306 3rd Qu.: 2.387 3rd Qu.: 3.292 3rd Qu.: 2.610
- Max. :14.579 Max. :11.119 Max. :12.534 Max. :11.438
- HSPC_121 HSPC_122 HSPC_123 HSPC_125
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.803 Mean : 2.072 Mean : 2.200 Mean : 2.116
- 3rd Qu.: 5.798 3rd Qu.: 2.140 3rd Qu.: 3.215 3rd Qu.: 2.409
- Max. :11.320 Max. :11.013 Max. :11.163 Max. :11.368
- HSPC_126 HSPC_127 HSPC_130 HSPC_131
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.9381 Median : 1.147 Median : 0.000 Median : 0.000
- Mean : 2.0014 Mean : 2.287 Mean : 2.551 Mean : 2.240
- 3rd Qu.: 2.2215 3rd Qu.: 3.051 3rd Qu.: 3.968 3rd Qu.: 3.773
- Max. :10.9622 Max. :11.028 Max. :10.585 Max. :11.216
- HSPC_132 HSPC_133 HSPC_134 HSPC_135
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.4438 Median : 2.234 Median : 0.000 Median : 0.000
- Mean : 2.1659 Mean : 2.582 Mean : 2.335 Mean : 2.402
- 3rd Qu.: 1.8512 3rd Qu.: 4.591 3rd Qu.: 3.659 3rd Qu.: 4.134
- Max. :10.6431 Max. :10.730 Max. :11.995 Max. :11.573
- HSPC_136 HSPC_138 HSPC_139 HSPC_140
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.7062 Median : 2.078 Median : 0.000
- Mean : 2.546 Mean : 2.1054 Mean : 2.876 Mean : 2.220
- 3rd Qu.: 5.219 3rd Qu.: 1.8181 3rd Qu.: 4.604 3rd Qu.: 3.716
- Max. :11.281 Max. :11.1177 Max. :11.013 Max. :10.893
- HSPC_141 HSPC_142 HSPC_143 HSPC_144
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.075
- Mean : 2.385 Mean : 2.232 Mean : 2.592 Mean : 2.004
- 3rd Qu.: 4.149 3rd Qu.: 2.523 3rd Qu.: 4.248 3rd Qu.: 2.441
- Max. :11.099 Max. :11.902 Max. :12.932 Max. :11.121
- HSPC_146 HSPC_148 HSPC_149 HSPC_151
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.9711
- Mean : 2.418 Mean : 2.385 Mean : 2.314 Mean : 2.4375
- 3rd Qu.: 4.430 3rd Qu.: 3.288 3rd Qu.: 3.139 3rd Qu.: 3.2523
- Max. :10.385 Max. :12.823 Max. :10.910 Max. :11.7148
- HSPC_152 HSPC_153 HSPC_154 HSPC_155
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.247 Mean : 2.415 Mean : 2.476 Mean : 2.468
- 3rd Qu.: 3.293 3rd Qu.: 3.524 3rd Qu.: 4.653 3rd Qu.: 3.621
- Max. :12.463 Max. :12.205 Max. :11.437 Max. :11.207
- HSPC_156 HSPC_157 HSPC_158 HSPC_159
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.5545 Median : 1.993 Median : 0.000 Median : 0.000
- Mean : 2.2297 Mean : 2.493 Mean : 2.119 Mean : 2.461
- 3rd Qu.: 2.0977 3rd Qu.: 3.692 3rd Qu.: 2.930 3rd Qu.: 3.340
- Max. :11.2431 Max. :10.539 Max. :11.336 Max. :11.123
- HSPC_161 HSPC_162 HSPC_164 HSPC_165
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.701 Median : 0.7152 Median : 0.000 Median : 0.000
- Mean : 2.533 Mean : 2.3473 Mean : 2.161 Mean : 2.084
- 3rd Qu.: 3.616 3rd Qu.: 2.4973 3rd Qu.: 2.553 3rd Qu.: 3.020
- Max. :11.429 Max. :11.0065 Max. :11.865 Max. :10.282
- HSPC_166 HSPC_168 HSPC_169 HSPC_170
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 1.002 Median : 1.158 Median : 0.000
- Mean : 2.177 Mean : 2.390 Mean : 2.038 Mean : 2.401
- 3rd Qu.: 3.296 3rd Qu.: 4.701 3rd Qu.: 2.232 3rd Qu.: 3.703
- Max. :11.427 Max. :10.393 Max. :10.447 Max. :11.288
- HSPC_171 HSPC_172 HSPC_173 HSPC_174
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.525 Median : 0.7679 Median : 0.000 Median : 1.257
- Mean : 2.312 Mean : 2.3115 Mean : 2.288 Mean : 2.444
- 3rd Qu.: 2.729 3rd Qu.: 3.7889 3rd Qu.: 3.037 3rd Qu.: 4.996
- Max. :10.468 Max. :11.1442 Max. :11.074 Max. :11.095
- HSPC_175 HSPC_176 HSPC_177 HSPC_178
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.496 Median : 2.024 Median : 1.971 Median : 1.003
- Mean : 2.613 Mean : 2.593 Mean : 2.421 Mean : 2.277
- 3rd Qu.: 4.845 3rd Qu.: 4.092 3rd Qu.: 3.665 3rd Qu.: 2.812
- Max. :11.235 Max. :10.379 Max. :10.864 Max. :10.979
- HSPC_179 HSPC_180 HSPC_181 HSPC_182
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.836 Median : 1.544 Median : 2.030 Median : 0.000
- Mean : 2.205 Mean : 2.556 Mean : 2.890 Mean : 2.363
- 3rd Qu.: 2.300 3rd Qu.: 4.798 3rd Qu.: 4.846 3rd Qu.: 3.779
- Max. :11.244 Max. :10.802 Max. :10.945 Max. :10.399
- HSPC_183 HSPC_185 HSPC_186 HSPC_187
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.020 Median : 0.000 Median : 1.606 Median : 0.000
- Mean : 2.242 Mean : 2.708 Mean : 2.053 Mean : 2.360
- 3rd Qu.: 2.842 3rd Qu.: 4.855 3rd Qu.: 2.834 3rd Qu.: 3.541
- Max. :10.530 Max. :11.079 Max. :11.016 Max. :10.923
- HSPC_189 HSPC_190 HSPC_191 HSPC_192
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.412
- Mean : 2.120 Mean : 2.417 Mean : 2.175 Mean : 2.192
- 3rd Qu.: 2.652 3rd Qu.: 5.226 3rd Qu.: 2.574 3rd Qu.: 2.669
- Max. :11.300 Max. :11.023 Max. :11.454 Max. :10.225
- HSPC_193 HSPC_195 HSPC_196 HSPC_198
- Min. :0.0000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.:0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median :0.9691 Median : 0.9175 Median : 1.379 Median : 1.105
- Mean :2.5448 Mean : 2.7307 Mean : 2.327 Mean : 2.155
- 3rd Qu.:5.1191 3rd Qu.: 5.8899 3rd Qu.: 2.625 3rd Qu.: 2.756
- Max. :9.8728 Max. :10.4757 Max. :11.319 Max. :11.405
- HSPC_199 HSPC_200 HSPC_202 HSPC_203
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 1.069 Median : 1.572 Median : 0.8045 Median : 1.311
- Mean : 1.909 Mean : 2.346 Mean : 2.1384 Mean : 2.058
- 3rd Qu.: 2.431 3rd Qu.: 2.791 3rd Qu.: 2.0569 3rd Qu.: 2.792
- Max. :11.377 Max. :11.334 Max. :11.0516 Max. :10.852
- HSPC_204 HSPC_205 HSPC_206 HSPC_207
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 1.342 Median : 1.997 Median : 1.076 Median : 0.9235
- Mean : 2.716 Mean : 2.520 Mean : 2.426 Mean : 2.2974
- 3rd Qu.: 5.611 3rd Qu.: 4.244 3rd Qu.: 4.057 3rd Qu.: 2.6736
- Max. :10.269 Max. :10.817 Max. :11.866 Max. :11.4287
- HSPC_208 HSPC_210 HSPC_211 HSPC_212
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 2.263 Median : 1.021 Median : 1.351 Median : 0.000
- Mean : 2.893 Mean : 2.315 Mean : 2.425 Mean : 2.336
- 3rd Qu.: 5.014 3rd Qu.: 2.676 3rd Qu.: 3.820 3rd Qu.: 3.443
- Max. :11.375 Max. :12.208 Max. :11.360 Max. :11.808
- HSPC_213 HSPC_214 HSPC_215 HSPC_216
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 1.270 Median : 0.9195 Median : 1.653 Median : 0.8022
- Mean : 2.483 Mean : 2.1976 Mean : 2.563 Mean : 2.6010
- 3rd Qu.: 4.903 3rd Qu.: 2.7139 3rd Qu.: 4.344 3rd Qu.: 6.0076
- Max. :11.548 Max. :10.6947 Max. :10.933 Max. :11.2119
- HSPC_218 HSPC_219 HSPC_220 HSPC_221
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 1.027 Median : 0.000 Median : 1.269
- Mean : 2.467 Mean : 2.291 Mean : 2.449 Mean : 2.641
- 3rd Qu.: 3.980 3rd Qu.: 2.853 3rd Qu.: 4.486 3rd Qu.: 3.617
- Max. :11.654 Max. :10.801 Max. :10.410 Max. :11.651
- HSPC_222 HSPC_223 HSPC_224 HSPC_225
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.449 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.262 Mean : 2.271 Mean : 2.492 Mean : 2.585
- 3rd Qu.: 3.271 3rd Qu.: 3.727 3rd Qu.: 3.769 3rd Qu.: 5.253
- Max. :11.133 Max. :12.000 Max. :11.114 Max. :11.671
- HSPC_227 HSPC_228 HSPC_229 HSPC_230
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 2.484 Median : 0.000
- Mean : 2.492 Mean : 2.370 Mean : 2.742 Mean : 2.586
- 3rd Qu.: 3.692 3rd Qu.: 4.488 3rd Qu.: 4.836 3rd Qu.: 5.188
- Max. :10.815 Max. :10.165 Max. :11.143 Max. :10.734
- HSPC_231 HSPC_232 HSPC_233 HSPC_235
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 1.869 Median : 1.254 Median : 0.000
- Mean : 2.379 Mean : 2.264 Mean : 2.531 Mean : 2.552
- 3rd Qu.: 4.787 3rd Qu.: 3.163 3rd Qu.: 3.925 3rd Qu.: 4.389
- Max. :10.790 Max. :12.098 Max. :11.533 Max. :11.765
- HSPC_236 HSPC_237 HSPC_239 HSPC_240
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 2.207 Median : 0.892
- Mean : 2.205 Mean : 2.457 Mean : 2.656 Mean : 2.049
- 3rd Qu.: 3.748 3rd Qu.: 3.488 3rd Qu.: 4.904 3rd Qu.: 2.617
- Max. :10.234 Max. :10.630 Max. :10.858 Max. :10.528
- HSPC_243 HSPC_244 HSPC_245 HSPC_246
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.118 Median : 0.7872 Median : 1.459 Median : 1.629
- Mean : 2.311 Mean : 2.6638 Mean : 2.360 Mean : 2.321
- 3rd Qu.: 2.574 3rd Qu.: 6.2395 3rd Qu.: 3.000 3rd Qu.: 3.229
- Max. :11.069 Max. :10.0730 Max. :11.297 Max. :11.237
- HSPC_247 HSPC_248 HSPC_249 HSPC_250
- Min. :0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.:0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median :0.000 Median : 0.8453 Median : 0.000 Median : 1.278
- Mean :2.537 Mean : 2.3719 Mean : 1.803 Mean : 2.751
- 3rd Qu.:4.687 3rd Qu.: 3.3090 3rd Qu.: 2.335 3rd Qu.: 6.330
- Max. :9.821 Max. :10.8128 Max. :10.568 Max. :11.256
- HSPC_251 HSPC_253 HSPC_254 HSPC_255
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.9714 Median : 1.265 Median : 0.000 Median : 0.9098
- Mean : 2.5626 Mean : 2.492 Mean : 2.177 Mean : 2.1878
- 3rd Qu.: 4.9167 3rd Qu.: 4.185 3rd Qu.: 3.437 3rd Qu.: 2.4313
- Max. :11.1252 Max. :10.435 Max. :10.422 Max. :10.7952
- HSPC_256 HSPC_257 HSPC_258 HSPC_261
- Min. : 0.0000 Min. : 0.000 Min. :0.0000 Min. : 0.0000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.:0.0000 1st Qu.: 0.0000
- Median : 0.8248 Median : 1.241 Median :0.8526 Median : 0.5387
- Mean : 2.1051 Mean : 2.630 Mean :2.0295 Mean : 2.1419
- 3rd Qu.: 2.3331 3rd Qu.: 5.646 3rd Qu.:3.0784 3rd Qu.: 1.9352
- Max. :13.0375 Max. :11.499 Max. :9.9116 Max. :11.3247
- HSPC_263 HSPC_264 HSPC_265 HSPC_266
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.538 Median : 1.426 Median : 1.883 Median : 1.839
- Mean : 2.613 Mean : 2.374 Mean : 3.177 Mean : 2.833
- 3rd Qu.: 4.485 3rd Qu.: 3.238 3rd Qu.: 5.702 3rd Qu.: 5.801
- Max. :10.571 Max. :11.136 Max. :12.436 Max. :10.338
- HSPC_267 HSPC_268 HSPC_269 HSPC_270
- Min. : 0.0000 Min. : 0.0000 Min. : 0.0000 Min. : 0.0000
- 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.0000
- Median : 0.9675 Median : 0.7787 Median : 0.8632 Median : 0.9637
- Mean : 2.4910 Mean : 2.5342 Mean : 2.4029 Mean : 2.6899
- 3rd Qu.: 3.5345 3rd Qu.: 4.9871 3rd Qu.: 4.3176 3rd Qu.: 5.7266
- Max. :10.0139 Max. :10.7848 Max. :11.2689 Max. :11.1648
- HSPC_271 HSPC_274 HSPC_275 HSPC_276
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 1.352 Median : 1.730 Median : 0.5252 Median : 1.156
- Mean : 2.493 Mean : 2.382 Mean : 2.5375 Mean : 2.485
- 3rd Qu.: 4.430 3rd Qu.: 3.360 3rd Qu.: 5.7329 3rd Qu.: 4.623
- Max. :11.636 Max. :11.165 Max. :11.6234 Max. :11.562
- HSPC_278 HSPC_279 HSPC_280 HSPC_281
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 1.487 Median : 1.608 Median : 2.611
- Mean : 2.161 Mean : 2.497 Mean : 2.580 Mean : 2.737
- 3rd Qu.: 2.270 3rd Qu.: 3.813 3rd Qu.: 3.985 3rd Qu.: 4.731
- Max. :11.734 Max. :10.900 Max. :11.673 Max. :10.076
- HSPC_282 HSPC_283 HSPC_285 HSPC_286
- Min. : 0.0000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.7021 Median : 1.911 Median : 0.8658 Median : 1.178
- Mean : 2.4272 Mean : 2.534 Mean : 2.4868 Mean : 2.293
- 3rd Qu.: 4.1254 3rd Qu.: 3.888 3rd Qu.: 5.3804 3rd Qu.: 2.597
- Max. :11.1094 Max. :10.258 Max. :10.5533 Max. :11.112
- HSPC_287 HSPC_288 HSPC_289 HSPC_290
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.049 Median : 0.8548 Median : 1.953 Median : 1.176
- Mean : 2.775 Mean : 2.6412 Mean : 2.925 Mean : 2.304
- 3rd Qu.: 5.476 3rd Qu.: 5.4204 3rd Qu.: 5.613 3rd Qu.: 3.445
- Max. :10.925 Max. :11.0814 Max. :10.199 Max. :11.094
- HSPC_291 HSPC_292 HSPC_293 HSPC_294
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 1.176 Median : 1.320 Median : 1.077 Median : 0.9161
- Mean : 2.662 Mean : 2.534 Mean : 2.538 Mean : 2.4365
- 3rd Qu.: 5.690 3rd Qu.: 4.297 3rd Qu.: 3.458 3rd Qu.: 4.8204
- Max. :12.255 Max. :11.090 Max. :10.987 Max. :10.6135
- HSPC_295 HSPC_296 HSPC_297 HSPC_298
- Min. :0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.:0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median :1.479 Median : 2.157 Median : 2.444 Median : 1.281
- Mean :2.849 Mean : 2.977 Mean : 3.062 Mean : 2.277
- 3rd Qu.:5.282 3rd Qu.: 5.006 3rd Qu.: 5.005 3rd Qu.: 2.749
- Max. :9.986 Max. :10.830 Max. :11.009 Max. :10.636
- HSPC_299 HSPC_300 HSPC_301 HSPC_302
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.716 Median : 1.163 Median : 2.235 Median : 2.240
- Mean : 2.597 Mean : 2.346 Mean : 2.739 Mean : 2.890
- 3rd Qu.: 3.762 3rd Qu.: 2.876 3rd Qu.: 4.593 3rd Qu.: 4.945
- Max. :11.663 Max. :11.690 Max. :10.364 Max. :10.498
- HSPC_303 HSPC_304 HSPC_305 HSPC_306
- Min. : 0.0000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.8348 Median : 0.9727 Median : 1.152 Median : 1.303
- Mean : 2.3400 Mean : 2.3710 Mean : 2.469 Mean : 2.496
- 3rd Qu.: 3.2942 3rd Qu.: 2.9942 3rd Qu.: 3.300 3rd Qu.: 3.015
- Max. :10.3022 Max. :11.7185 Max. :11.051 Max. :11.211
- HSPC_307 HSPC_308 HSPC_309 HSPC_310
- Min. :0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.:0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median :1.976 Median : 1.634 Median : 1.804 Median : 1.743
- Mean :2.873 Mean : 2.812 Mean : 2.892 Mean : 2.874
- 3rd Qu.:5.396 3rd Qu.: 5.089 3rd Qu.: 5.165 3rd Qu.: 5.004
- Max. :9.921 Max. :10.527 Max. :10.476 Max. :11.107
- HSPC_312 HSPC_313 HSPC_314 HSPC_315
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.420 Median : 1.592 Median : 1.635 Median : 2.262
- Mean : 2.645 Mean : 2.637 Mean : 2.564 Mean : 2.628
- 3rd Qu.: 4.925 3rd Qu.: 4.257 3rd Qu.: 4.297 3rd Qu.: 4.092
- Max. :11.367 Max. :10.644 Max. :10.882 Max. :12.140
- HSPC_317 HSPC_318 HSPC_320 HSPC_321
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 2.335 Median : 1.728 Median : 2.340 Median : 1.835
- Mean : 2.648 Mean : 2.637 Mean : 3.064 Mean : 2.742
- 3rd Qu.: 4.103 3rd Qu.: 4.483 3rd Qu.: 5.325 3rd Qu.: 4.340
- Max. :10.933 Max. :11.712 Max. :11.589 Max. :11.695
- HSPC_322 HSPC_323 HSPC_324 HSPC_325
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.9842 Median : 0.989 Median : 1.088 Median : 2.132
- Mean : 2.5948 Mean : 2.905 Mean : 2.655 Mean : 3.091
- 3rd Qu.: 3.4619 3rd Qu.: 5.629 3rd Qu.: 3.772 3rd Qu.: 5.191
- Max. :11.9594 Max. :12.267 Max. :11.310 Max. :11.134
- HSPC_326 HSPC_327 HSPC_328 HSPC_329
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.781 Median : 1.085 Median : 1.936 Median : 1.954
- Mean : 3.021 Mean : 2.838 Mean : 2.582 Mean : 3.034
- 3rd Qu.: 5.582 3rd Qu.: 6.388 3rd Qu.: 4.048 3rd Qu.: 5.497
- Max. :11.268 Max. :11.433 Max. :11.908 Max. :10.927
- HSPC_330 HSPC_331 HSPC_332 HSPC_333
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.870 Median : 2.953 Median : 1.644 Median : 1.320
- Mean : 2.791 Mean : 3.058 Mean : 2.768 Mean : 2.428
- 3rd Qu.: 4.409 3rd Qu.: 5.118 3rd Qu.: 5.141 3rd Qu.: 2.985
- Max. :11.561 Max. :10.855 Max. :10.420 Max. :11.946
- HSPC_334 HSPC_335 HSPC_336 HSPC_337
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.931 Median : 1.541 Median : 2.761 Median : 0.000
- Mean : 2.894 Mean : 2.746 Mean : 3.051 Mean : 2.415
- 3rd Qu.: 4.160 3rd Qu.: 4.461 3rd Qu.: 4.408 3rd Qu.: 4.188
- Max. :11.592 Max. :11.076 Max. :11.246 Max. :10.205
- HSPC_338 HSPC_339 HSPC_341 HSPC_342
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000
- Median : 0.000 Median : 0.000 Median : 0.9553 Median : 0.4452
- Mean : 2.205 Mean : 2.325 Mean : 2.0823 Mean : 2.4572
- 3rd Qu.: 2.449 3rd Qu.: 3.136 3rd Qu.: 2.0118 3rd Qu.: 4.9582
- Max. :12.052 Max. :11.858 Max. :11.3855 Max. :11.8066
- HSPC_343 HSPC_344 HSPC_345 HSPC_346
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.5197
- Mean : 2.363 Mean : 2.290 Mean : 1.984 Mean : 2.5126
- 3rd Qu.: 4.285 3rd Qu.: 3.238 3rd Qu.: 2.561 3rd Qu.: 5.2033
- Max. :11.422 Max. :11.877 Max. :10.939 Max. :11.1527
- HSPC_348 HSPC_349 HSPC_350 HSPC_351
- Min. : 0.000 Min. : 0.000 Min. : 0.00 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.00 1st Qu.: 0.000
- Median : 1.113 Median : 0.000 Median : 0.00 Median : 0.000
- Mean : 2.232 Mean : 1.949 Mean : 2.11 Mean : 2.259
- 3rd Qu.: 2.875 3rd Qu.: 2.784 3rd Qu.: 3.07 3rd Qu.: 3.214
- Max. :11.161 Max. :10.720 Max. :11.15 Max. :10.912
- HSPC_352 HSPC_353 HSPC_354 HSPC_356
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.333 Mean : 2.162 Mean : 2.427 Mean : 2.135
- 3rd Qu.: 3.197 3rd Qu.: 2.819 3rd Qu.: 3.808 3rd Qu.: 2.709
- Max. :12.275 Max. :11.351 Max. :11.190 Max. :10.662
- HSPC_358 HSPC_359 HSPC_360 HSPC_361
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.278 Mean : 2.012 Mean : 2.381 Mean : 2.137
- 3rd Qu.: 3.608 3rd Qu.: 1.460 3rd Qu.: 3.044 3rd Qu.: 2.875
- Max. :10.924 Max. :11.678 Max. :11.203 Max. :10.847
- HSPC_362 HSPC_363 HSPC_365 HSPC_367
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 1.783 Mean : 1.987 Mean : 2.937 Mean : 2.449
- 3rd Qu.: 1.594 3rd Qu.: 2.750 3rd Qu.: 5.572 3rd Qu.: 3.936
- Max. :11.889 Max. :10.389 Max. :12.427 Max. :11.081
- HSPC_368 HSPC_370 HSPC_371 HSPC_372
- Min. : 0.000 Min. : 0.0000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.000 Median : 0.7971 Median : 0.7613 Median : 0.000
- Mean : 1.877 Mean : 2.7681 Mean : 2.4278 Mean : 2.487
- 3rd Qu.: 2.018 3rd Qu.: 6.5358 3rd Qu.: 4.9578 3rd Qu.: 4.226
- Max. :11.523 Max. :11.9636 Max. :11.4223 Max. :11.700
- HSPC_373 HSPC_374 HSPC_376 HSPC_377
- Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.00 Median : 0.000 Median : 0.000
- Mean : 2.330 Mean : 2.21 Mean : 2.625 Mean : 2.456
- 3rd Qu.: 3.784 3rd Qu.: 2.44 3rd Qu.: 4.365 3rd Qu.: 4.875
- Max. :11.672 Max. :12.04 Max. :12.011 Max. :11.282
- HSPC_380 HSPC_382 HSPC_383 HSPC_386
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.9728 Median : 1.753 Median : 0.000
- Mean : 2.291 Mean : 2.3318 Mean : 2.307 Mean : 2.351
- 3rd Qu.: 2.403 3rd Qu.: 2.7605 3rd Qu.: 3.113 3rd Qu.: 3.704
- Max. :11.415 Max. :11.3370 Max. :11.592 Max. :11.079
- HSPC_387 HSPC_388 HSPC_389 HSPC_390
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.9037 Median : 0.000 Median : 0.000
- Mean : 2.255 Mean : 2.4969 Mean : 2.081 Mean : 2.131
- 3rd Qu.: 3.151 3rd Qu.: 5.3587 3rd Qu.: 2.723 3rd Qu.: 2.738
- Max. :11.700 Max. :10.9923 Max. :11.868 Max. :10.913
- HSPC_391 HSPC_392 HSPC_393 HSPC_395
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.026 Mean : 2.356 Mean : 2.063 Mean : 1.779
- 3rd Qu.: 2.126 3rd Qu.: 3.781 3rd Qu.: 2.163 3rd Qu.: 1.924
- Max. :12.021 Max. :11.370 Max. :10.530 Max. :12.219
- HSPC_396 HSPC_398 HSPC_399 HSPC_400
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.164 Mean : 2.309 Mean : 1.831 Mean : 2.091
- 3rd Qu.: 2.681 3rd Qu.: 3.994 3rd Qu.: 1.844 3rd Qu.: 2.781
- Max. :11.292 Max. :11.431 Max. :11.343 Max. :10.863
- HSPC_402 HSPC_403 HSPC_404 HSPC_405
- Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.000 Median : 0.00 Median : 0.000 Median : 0.5496
- Mean : 2.343 Mean : 2.06 Mean : 1.878 Mean : 2.3660
- 3rd Qu.: 4.552 3rd Qu.: 2.45 3rd Qu.: 1.644 3rd Qu.: 2.5449
- Max. :11.444 Max. :12.00 Max. :11.188 Max. :12.2605
- HSPC_406 HSPC_407 HSPC_408 HSPC_409
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.000 Median : 0.565 Median : 0.5775 Median : 0.000
- Mean : 2.169 Mean : 2.611 Mean : 1.9174 Mean : 2.234
- 3rd Qu.: 2.606 3rd Qu.: 6.000 3rd Qu.: 1.3086 3rd Qu.: 3.044
- Max. :10.866 Max. :11.296 Max. :12.8185 Max. :11.595
- HSPC_410 HSPC_411 HSPC_412 HSPC_413
- Min. : 0.000 Min. : 0.0000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.000 Median : 0.9059 Median : 0.6614 Median : 0.000
- Mean : 2.308 Mean : 3.1194 Mean : 3.0437 Mean : 2.433
- 3rd Qu.: 4.022 3rd Qu.: 7.7574 3rd Qu.: 7.4695 3rd Qu.: 3.329
- Max. :11.620 Max. :12.0858 Max. :11.5582 Max. :12.549
- HSPC_415 HSPC_416 HSPC_417 HSPC_418
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.7222 Median : 0.000
- Mean : 2.904 Mean : 2.228 Mean : 2.4242 Mean : 2.508
- 3rd Qu.: 5.531 3rd Qu.: 3.111 3rd Qu.: 3.0795 3rd Qu.: 3.249
- Max. :12.359 Max. :11.338 Max. :12.0314 Max. :11.857
- HSPC_419 HSPC_420 HSPC_421 HSPC_422
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.6924 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.6246 Mean : 2.514 Mean : 2.075 Mean : 2.552
- 3rd Qu.: 4.8156 3rd Qu.: 5.709 3rd Qu.: 3.682 3rd Qu.: 5.382
- Max. :12.0526 Max. :11.270 Max. :10.250 Max. :11.691
- HSPC_423 HSPC_424 HSPC_425 HSPC_426
- Min. : 0.00 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.00 Median : 0.000 Median : 1.016 Median : 0.000
- Mean : 2.12 Mean : 2.225 Mean : 2.658 Mean : 2.235
- 3rd Qu.: 1.55 3rd Qu.: 2.471 3rd Qu.: 6.474 3rd Qu.: 3.134
- Max. :11.56 Max. :11.734 Max. :11.303 Max. :10.888
- HSPC_427 HSPC_431 HSPC_432 HSPC_435
- Min. : 0.000 Min. : 0.000 Min. :0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000 1st Qu.: 0.000
- Median : 0.000 Median : 1.102 Median :0.000 Median : 1.098
- Mean : 1.829 Mean : 2.360 Mean :2.169 Mean : 2.060
- 3rd Qu.: 2.980 3rd Qu.: 3.640 3rd Qu.:3.261 3rd Qu.: 2.744
- Max. :10.517 Max. :10.533 Max. :9.911 Max. :10.677
- HSPC_436 HSPC_440 HSPC_441 HSPC_442
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.4719 Median : 1.385 Median : 1.084 Median : 0.595
- Mean : 2.3880 Mean : 1.712 Mean : 2.265 Mean : 2.109
- 3rd Qu.: 4.3738 3rd Qu.: 2.079 3rd Qu.: 2.828 3rd Qu.: 2.193
- Max. :11.2839 Max. :11.065 Max. :11.152 Max. :11.560
- HSPC_443 HSPC_444 HSPC_446 HSPC_447
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.7734 Median : 1.374 Median : 0.000 Median : 1.113
- Mean : 2.5663 Mean : 2.262 Mean : 1.475 Mean : 2.446
- 3rd Qu.: 4.9423 3rd Qu.: 2.952 3rd Qu.: 1.683 3rd Qu.: 4.733
- Max. :10.9262 Max. :10.705 Max. :10.545 Max. :10.303
- HSPC_448 HSPC_449 HSPC_450 HSPC_451
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.139 Median : 1.344 Median : 0.000 Median : 1.759
- Mean : 2.396 Mean : 2.164 Mean : 1.946 Mean : 1.806
- 3rd Qu.: 3.660 3rd Qu.: 2.490 3rd Qu.: 2.483 3rd Qu.: 2.528
- Max. :11.091 Max. :11.324 Max. :10.397 Max. :10.395
- HSPC_453 HSPC_454 HSPC_455 HSPC_456
- Min. : 0.0000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.9321 Median : 0.5303 Median : 0.000 Median : 0.6497
- Mean : 2.4906 Mean : 2.4477 Mean : 2.379 Mean : 2.4263
- 3rd Qu.: 4.9604 3rd Qu.: 4.8773 3rd Qu.: 3.016 3rd Qu.: 5.4740
- Max. :10.5263 Max. :11.1628 Max. :11.437 Max. :10.9787
- HSPC_457 HSPC_459 HSPC_460 HSPC_461
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.313
- Mean : 2.060 Mean : 2.403 Mean : 1.712 Mean : 1.875
- 3rd Qu.: 2.937 3rd Qu.: 3.029 3rd Qu.: 1.598 3rd Qu.: 2.104
- Max. :11.746 Max. :12.135 Max. :12.526 Max. :10.210
- HSPC_462 HSPC_463 HSPC_465 HSPC_466
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.000 Median : 0.7257 Median : 0.000 Median : 0.5816
- Mean : 2.095 Mean : 2.2325 Mean : 2.000 Mean : 1.9972
- 3rd Qu.: 2.578 3rd Qu.: 2.3442 3rd Qu.: 2.633 3rd Qu.: 2.2384
- Max. :11.429 Max. :11.1776 Max. :11.064 Max. :11.5475
- HSPC_467 HSPC_468 HSPC_470 HSPC_471
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.177 Median : 0.649 Median : 0.000 Median : 0.000
- Mean : 1.866 Mean : 2.130 Mean : 1.774 Mean : 2.279
- 3rd Qu.: 2.258 3rd Qu.: 2.513 3rd Qu.: 1.931 3rd Qu.: 2.744
- Max. :10.632 Max. :10.527 Max. :10.781 Max. :11.533
- HSPC_472 HSPC_473 HSPC_474 HSPC_475
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.265 Mean : 2.168 Mean : 2.016 Mean : 2.339
- 3rd Qu.: 2.982 3rd Qu.: 2.677 3rd Qu.: 2.061 3rd Qu.: 3.319
- Max. :11.795 Max. :12.071 Max. :11.732 Max. :10.672
- HSPC_477 HSPC_478 HSPC_479 HSPC_480
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.6278 Median : 0.000 Median : 1.281 Median : 1.034
- Mean : 1.9910 Mean : 2.068 Mean : 2.175 Mean : 2.239
- 3rd Qu.: 1.6695 3rd Qu.: 3.402 3rd Qu.: 3.028 3rd Qu.: 2.642
- Max. :11.1171 Max. :12.113 Max. :11.277 Max. :10.641
- HSPC_482 HSPC_483 HSPC_485 HSPC_486
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.000 Median : 1.088 Median : 0.6036 Median : 1.411
- Mean : 1.998 Mean : 2.454 Mean : 2.3824 Mean : 2.078
- 3rd Qu.: 2.648 3rd Qu.: 3.006 3rd Qu.: 4.8213 3rd Qu.: 2.579
- Max. :13.948 Max. :10.722 Max. :11.8691 Max. :10.155
- HSPC_488 HSPC_489 HSPC_490 HSPC_491
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 1.310 Median : 0.000
- Mean : 1.809 Mean : 1.947 Mean : 2.518 Mean : 2.268
- 3rd Qu.: 2.120 3rd Qu.: 2.330 3rd Qu.: 4.140 3rd Qu.: 3.300
- Max. :11.271 Max. :11.518 Max. :11.646 Max. :10.366
- HSPC_492 HSPC_493 HSPC_494 HSPC_495
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.127 Mean : 2.054 Mean : 2.255 Mean : 2.326
- 3rd Qu.: 2.322 3rd Qu.: 3.060 3rd Qu.: 3.386 3rd Qu.: 3.812
- Max. :11.674 Max. :10.404 Max. :10.461 Max. :10.304
- HSPC_496 HSPC_497 HSPC_498 HSPC_499
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.000 Median : 1.945 Median : 0.5839 Median : 0.000
- Mean : 1.938 Mean : 2.287 Mean : 2.3731 Mean : 2.045
- 3rd Qu.: 2.227 3rd Qu.: 2.872 3rd Qu.: 3.6112 3rd Qu.: 2.358
- Max. :11.323 Max. :11.873 Max. :11.3264 Max. :10.632
- HSPC_500 HSPC_501 HSPC_502 HSPC_503
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000
- Median : 0.000 Median : 0.000 Median : 0.9146 Median : 0.7789
- Mean : 2.199 Mean : 2.209 Mean : 2.2727 Mean : 2.4495
- 3rd Qu.: 2.678 3rd Qu.: 3.150 3rd Qu.: 2.8888 3rd Qu.: 5.4034
- Max. :11.665 Max. :10.727 Max. :11.4591 Max. :11.5376
- HSPC_504 HSPC_505 HSPC_506 HSPC_507
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.137 Mean : 2.132 Mean : 2.017 Mean : 2.314
- 3rd Qu.: 3.035 3rd Qu.: 2.744 3rd Qu.: 2.794 3rd Qu.: 3.175
- Max. :11.625 Max. :11.385 Max. :11.467 Max. :11.232
- HSPC_508 HSPC_509 HSPC_510 HSPC_512
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.2297 Median : 1.691 Median : 1.166 Median : 0.000
- Mean : 1.9265 Mean : 2.548 Mean : 2.319 Mean : 2.482
- 3rd Qu.: 0.8975 3rd Qu.: 4.397 3rd Qu.: 3.492 3rd Qu.: 3.753
- Max. :12.0747 Max. :10.603 Max. :10.885 Max. :12.492
- HSPC_514 HSPC_515 HSPC_516 HSPC_518
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.000 Median : 1.109 Median : 0.8853 Median : 0.000
- Mean : 2.295 Mean : 2.298 Mean : 2.5439 Mean : 2.649
- 3rd Qu.: 2.429 3rd Qu.: 2.560 3rd Qu.: 4.6629 3rd Qu.: 5.581
- Max. :11.783 Max. :12.193 Max. :12.1718 Max. :11.838
- HSPC_520 HSPC_521 HSPC_522 HSPC_523
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.3648
- Mean : 2.295 Mean : 2.348 Mean : 2.529 Mean : 1.9471
- 3rd Qu.: 2.975 3rd Qu.: 3.375 3rd Qu.: 5.350 3rd Qu.: 1.5726
- Max. :12.289 Max. :11.712 Max. :10.364 Max. :12.5906
- HSPC_524 HSPC_526 HSPC_527 HSPC_528
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.777 Median : 0.532
- Mean : 1.989 Mean : 2.218 Mean : 2.133 Mean : 2.238
- 3rd Qu.: 3.267 3rd Qu.: 2.431 3rd Qu.: 1.651 3rd Qu.: 2.095
- Max. :12.105 Max. :10.870 Max. :12.017 Max. :12.183
- HSPC_530 HSPC_532 HSPC_533 HSPC_534
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.7537 Median : 0.000
- Mean : 2.017 Mean : 1.856 Mean : 1.7546 Mean : 2.183
- 3rd Qu.: 2.514 3rd Qu.: 1.816 3rd Qu.: 1.3378 3rd Qu.: 2.311
- Max. :11.549 Max. :11.255 Max. :11.5862 Max. :11.696
- HSPC_535 HSPC_537 HSPC_538 HSPC_539
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.122 Mean : 2.010 Mean : 2.501 Mean : 2.463
- 3rd Qu.: 2.733 3rd Qu.: 2.541 3rd Qu.: 4.886 3rd Qu.: 4.100
- Max. :10.793 Max. :10.305 Max. :11.359 Max. :11.755
- HSPC_540 HSPC_541 HSPC_543 HSPC_544
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.9898 Median : 2.362 Median : 0.000 Median : 0.8222
- Mean : 2.1775 Mean : 2.613 Mean : 2.275 Mean : 2.8070
- 3rd Qu.: 1.9846 3rd Qu.: 4.440 3rd Qu.: 2.690 3rd Qu.: 6.4209
- Max. :12.2963 Max. :11.844 Max. :10.983 Max. :10.7976
- HSPC_545 HSPC_546 HSPC_547 HSPC_548
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 1.485 Median : 0.000 Median : 0.6548 Median : 1.456
- Mean : 2.215 Mean : 2.424 Mean : 2.5255 Mean : 2.415
- 3rd Qu.: 2.677 3rd Qu.: 3.573 3rd Qu.: 2.8714 3rd Qu.: 2.639
- Max. :11.815 Max. :11.235 Max. :11.8801 Max. :11.955
- HSPC_549 HSPC_550 HSPC_551 HSPC_552
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 1.750 Median : 1.287 Median : 1.226
- Mean : 2.149 Mean : 2.592 Mean : 2.680 Mean : 2.236
- 3rd Qu.: 2.289 3rd Qu.: 4.686 3rd Qu.: 4.007 3rd Qu.: 2.669
- Max. :11.827 Max. :12.064 Max. :11.874 Max. :11.581
- HSPC_553 HSPC_554 HSPC_555 HSPC_556
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.4709 Median : 0.000 Median : 0.000 Median : 0.9369
- Mean : 2.6931 Mean : 2.090 Mean : 1.903 Mean : 2.4784
- 3rd Qu.: 6.4420 3rd Qu.: 2.158 3rd Qu.: 2.579 3rd Qu.: 3.4024
- Max. :11.0566 Max. :11.755 Max. :11.245 Max. :11.9838
- HSPC_557 HSPC_559 HSPC_560 HSPC_562
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 1.681 Median : 0.000
- Mean : 1.972 Mean : 1.937 Mean : 2.082 Mean : 2.470
- 3rd Qu.: 1.880 3rd Qu.: 2.411 3rd Qu.: 2.436 3rd Qu.: 4.148
- Max. :11.792 Max. :11.871 Max. :11.761 Max. :11.958
- HSPC_563 HSPC_566 HSPC_567 HSPC_568
- Min. : 0.00 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.00 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 1.83 Mean : 2.486 Mean : 2.186 Mean : 2.267
- 3rd Qu.: 2.29 3rd Qu.: 3.577 3rd Qu.: 2.254 3rd Qu.: 2.957
- Max. :10.59 Max. :12.452 Max. :11.302 Max. :10.851
- HSPC_569 HSPC_571 HSPC_573 HSPC_574
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.771 Median : 1.042 Median : 0.000 Median : 0.7547
- Mean : 2.283 Mean : 2.213 Mean : 2.089 Mean : 2.3196
- 3rd Qu.: 3.021 3rd Qu.: 2.879 3rd Qu.: 2.291 3rd Qu.: 5.6078
- Max. :10.720 Max. :10.939 Max. :11.397 Max. :10.4741
- HSPC_575 HSPC_576 HSPC_577 HSPC_578
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 1.606 Median : 0.000
- Mean : 2.016 Mean : 2.206 Mean : 2.358 Mean : 2.257
- 3rd Qu.: 2.267 3rd Qu.: 2.741 3rd Qu.: 3.198 3rd Qu.: 2.923
- Max. :10.687 Max. :11.201 Max. :11.613 Max. :12.323
- HSPC_579 HSPC_580 HSPC_582 HSPC_584
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.182 Median : 0.9442 Median : 0.000 Median : 0.000
- Mean : 2.472 Mean : 2.4264 Mean : 2.218 Mean : 2.276
- 3rd Qu.: 5.009 3rd Qu.: 3.5841 3rd Qu.: 3.332 3rd Qu.: 3.067
- Max. :11.096 Max. :10.6790 Max. :10.882 Max. :10.954
- HSPC_585 HSPC_586 HSPC_589 HSPC_590
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.8915 Median : 0.000 Median : 1.192
- Mean : 2.034 Mean : 2.0490 Mean : 2.274 Mean : 2.252
- 3rd Qu.: 2.157 3rd Qu.: 1.8340 3rd Qu.: 3.655 3rd Qu.: 2.364
- Max. :11.956 Max. :11.4729 Max. :11.198 Max. :10.673
- HSPC_592 HSPC_593 HSPC_594 HSPC_595
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.228 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.317 Mean : 2.329 Mean : 2.474 Mean : 1.463
- 3rd Qu.: 2.671 3rd Qu.: 3.263 3rd Qu.: 4.396 3rd Qu.: 1.757
- Max. :12.036 Max. :10.626 Max. :11.347 Max. :11.286
- HSPC_596 HSPC_597 HSPC_598 HSPC_599
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.392 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.283 Mean : 1.858 Mean : 1.954 Mean : 1.905
- 3rd Qu.: 3.425 3rd Qu.: 2.296 3rd Qu.: 2.320 3rd Qu.: 2.497
- Max. :10.899 Max. :11.002 Max. :11.117 Max. :11.248
- HSPC_600 HSPC_601 HSPC_602 HSPC_603
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 1.662 Median : 0.000
- Mean : 2.335 Mean : 1.905 Mean : 2.343 Mean : 2.281
- 3rd Qu.: 3.827 3rd Qu.: 2.376 3rd Qu.: 3.272 3rd Qu.: 3.048
- Max. :11.208 Max. :11.022 Max. :10.908 Max. :11.464
- HSPC_604 HSPC_606 HSPC_607 HSPC_608
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.136 Mean : 2.392 Mean : 2.142 Mean : 2.139
- 3rd Qu.: 2.516 3rd Qu.: 4.726 3rd Qu.: 3.187 3rd Qu.: 2.885
- Max. :11.743 Max. :11.210 Max. :10.319 Max. :10.802
- HSPC_610 HSPC_612 HSPC_613 HSPC_614
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.315
- Mean : 2.327 Mean : 2.298 Mean : 2.228 Mean : 2.364
- 3rd Qu.: 3.718 3rd Qu.: 3.138 3rd Qu.: 2.705 3rd Qu.: 3.136
- Max. :10.860 Max. :11.564 Max. :10.560 Max. :11.824
- HSPC_615 HSPC_617 HSPC_618 HSPC_620
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.8525 Median : 0.000 Median : 0.000
- Mean : 1.964 Mean : 2.2100 Mean : 2.229 Mean : 1.881
- 3rd Qu.: 2.451 3rd Qu.: 2.3301 3rd Qu.: 2.885 3rd Qu.: 2.518
- Max. :11.058 Max. :10.9434 Max. :11.210 Max. :11.388
- HSPC_623 HSPC_624 HSPC_625 HSPC_626
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.7201 Median : 0.000 Median : 0.000
- Mean : 2.563 Mean : 2.0968 Mean : 2.042 Mean : 2.262
- 3rd Qu.: 4.626 3rd Qu.: 1.8437 3rd Qu.: 2.938 3rd Qu.: 3.424
- Max. :10.954 Max. :10.9459 Max. :11.226 Max. :11.770
- HSPC_627 HSPC_628 HSPC_629 HSPC_630
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.269 Mean : 2.302 Mean : 2.212 Mean : 2.519
- 3rd Qu.: 3.952 3rd Qu.: 2.875 3rd Qu.: 2.625 3rd Qu.: 4.511
- Max. :11.426 Max. :11.792 Max. :11.139 Max. :11.519
- HSPC_631 HSPC_633 HSPC_634 HSPC_635
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.303 Mean : 2.329 Mean : 2.268 Mean : 2.054
- 3rd Qu.: 2.685 3rd Qu.: 3.619 3rd Qu.: 3.662 3rd Qu.: 2.629
- Max. :10.996 Max. :12.011 Max. :11.406 Max. :11.178
- HSPC_636 HSPC_637 HSPC_638 HSPC_639
- Min. : 0.000 Min. : 0.0000 Min. : 0.0000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.0000
- Median : 0.000 Median : 0.9389 Median : 0.5101 Median : 0.9966
- Mean : 1.953 Mean : 2.1351 Mean : 1.6966 Mean : 1.5879
- 3rd Qu.: 2.129 3rd Qu.: 2.4817 3rd Qu.: 1.6879 3rd Qu.: 1.6840
- Max. :11.057 Max. :11.1881 Max. :10.8837 Max. :10.9561
- HSPC_640 HSPC_641 HSPC_643 HSPC_644
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 1.025 Median : 1.000 Median : 1.706 Median : 0.4904
- Mean : 2.136 Mean : 1.957 Mean : 2.468 Mean : 2.4726
- 3rd Qu.: 2.119 3rd Qu.: 2.001 3rd Qu.: 3.329 3rd Qu.: 5.6227
- Max. :11.173 Max. :11.056 Max. :12.016 Max. :11.0232
- HSPC_645 HSPC_646 HSPC_648 HSPC_649
- Min. : 0.0000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.7157 Median : 0.9959 Median : 1.519 Median : 0.7139
- Mean : 2.3517 Mean : 2.0594 Mean : 2.267 Mean : 2.3593
- 3rd Qu.: 4.5630 3rd Qu.: 2.3154 3rd Qu.: 2.722 3rd Qu.: 4.1542
- Max. :10.9922 Max. :11.6070 Max. :11.243 Max. :10.7707
- HSPC_651 HSPC_652 HSPC_654 HSPC_656
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. :0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000
- Median : 0.000 Median : 0.000 Median : 1.398 Median :0.000
- Mean : 2.550 Mean : 1.764 Mean : 2.108 Mean :1.983
- 3rd Qu.: 5.615 3rd Qu.: 2.038 3rd Qu.: 2.562 3rd Qu.:2.505
- Max. :11.202 Max. :10.897 Max. :10.367 Max. :9.673
- HSPC_657 HSPC_658 HSPC_660 HSPC_661
- Min. : 0.000 Min. : 0.000 Min. :0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median :1.253 Median : 1.491
- Mean : 1.839 Mean : 2.319 Mean :2.542 Mean : 2.401
- 3rd Qu.: 2.239 3rd Qu.: 4.021 3rd Qu.:5.274 3rd Qu.: 2.775
- Max. :12.132 Max. :11.264 Max. :9.852 Max. :11.647
- HSPC_662 HSPC_663 HSPC_664 HSPC_665
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000
- Median : 0.000 Median : 0.000 Median : 0.9407 Median : 0.6452
- Mean : 2.298 Mean : 2.726 Mean : 2.4039 Mean : 2.1211
- 3rd Qu.: 2.939 3rd Qu.: 6.519 3rd Qu.: 3.4095 3rd Qu.: 2.0744
- Max. :11.277 Max. :12.152 Max. :10.9423 Max. :12.0111
- HSPC_666 HSPC_667 HSPC_668 HSPC_669
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.130 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.815 Mean : 2.075 Mean : 2.245 Mean : 1.992
- 3rd Qu.: 6.359 3rd Qu.: 2.549 3rd Qu.: 2.407 3rd Qu.: 2.426
- Max. :11.052 Max. :11.406 Max. :11.061 Max. :11.752
- HSPC_670 HSPC_671 HSPC_672 HSPC_673
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.336 Mean : 2.349 Mean : 2.041 Mean : 2.148
- 3rd Qu.: 3.188 3rd Qu.: 3.777 3rd Qu.: 2.057 3rd Qu.: 2.723
- Max. :11.021 Max. :10.846 Max. :11.212 Max. :11.579
- HSPC_674 HSPC_676 HSPC_678 HSPC_679
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 1.525 Median : 1.531
- Mean : 1.801 Mean : 2.239 Mean : 2.298 Mean : 2.133
- 3rd Qu.: 1.892 3rd Qu.: 3.097 3rd Qu.: 3.089 3rd Qu.: 2.737
- Max. :10.875 Max. :10.496 Max. :12.125 Max. :11.583
- HSPC_680 HSPC_681 HSPC_682 HSPC_683
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 1.037 Median : 1.043 Median : 1.180
- Mean : 2.573 Mean : 2.277 Mean : 2.586 Mean : 2.498
- 3rd Qu.: 4.165 3rd Qu.: 4.210 3rd Qu.: 5.432 3rd Qu.: 3.929
- Max. :11.100 Max. :10.154 Max. :11.095 Max. :10.859
- HSPC_687 HSPC_689 HSPC_690 HSPC_692
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 2.091 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.136 Mean : 2.489 Mean : 2.686 Mean : 2.285
- 3rd Qu.: 2.911 3rd Qu.: 4.106 3rd Qu.: 5.055 3rd Qu.: 3.427
- Max. :11.380 Max. :10.693 Max. :10.408 Max. :12.242
- HSPC_695 HSPC_696 HSPC_697 HSPC_698
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.2681 Median : 1.538 Median : 1.271 Median : 0.000
- Mean : 1.6151 Mean : 2.688 Mean : 2.529 Mean : 2.531
- 3rd Qu.: 0.6895 3rd Qu.: 5.560 3rd Qu.: 4.779 3rd Qu.: 4.387
- Max. :12.4139 Max. :10.880 Max. :10.292 Max. :12.146
- HSPC_699 HSPC_700 HSPC_701 HSPC_702
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 1.157 Median : 0.000
- Mean : 2.586 Mean : 2.402 Mean : 2.401 Mean : 2.723
- 3rd Qu.: 4.595 3rd Qu.: 4.797 3rd Qu.: 3.889 3rd Qu.: 4.822
- Max. :11.389 Max. :10.630 Max. :11.750 Max. :11.805
- HSPC_703 HSPC_704 HSPC_705 HSPC_706
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 2.193 Median : 0.000 Median : 0.9795 Median : 1.273
- Mean : 2.543 Mean : 2.598 Mean : 2.5048 Mean : 2.364
- 3rd Qu.: 3.935 3rd Qu.: 4.335 3rd Qu.: 5.0680 3rd Qu.: 3.492
- Max. :11.710 Max. :11.488 Max. :11.3580 Max. :10.447
- HSPC_707 HSPC_708 HSPC_709 HSPC_714
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.361 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.371 Mean : 2.509 Mean : 2.601 Mean : 2.326
- 3rd Qu.: 3.626 3rd Qu.: 3.832 3rd Qu.: 5.060 3rd Qu.: 3.324
- Max. :11.796 Max. :10.865 Max. :10.145 Max. :11.126
- HSPC_716 HSPC_717 HSPC_719 HSPC_720
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.000 Median : 1.154 Median : 1.855 Median : 0.8206
- Mean : 2.325 Mean : 2.302 Mean : 2.519 Mean : 2.5768
- 3rd Qu.: 3.356 3rd Qu.: 2.833 3rd Qu.: 4.115 3rd Qu.: 5.5594
- Max. :11.812 Max. :11.047 Max. :12.237 Max. :10.5895
- HSPC_721 HSPC_722 HSPC_723 HSPC_724
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000
- Median : 2.113 Median : 1.185 Median : 0.8421 Median : 0.6485
- Mean : 2.205 Mean : 1.814 Mean : 2.6174 Mean : 1.9644
- 3rd Qu.: 3.456 3rd Qu.: 2.269 3rd Qu.: 4.9545 3rd Qu.: 1.9402
- Max. :10.706 Max. :10.709 Max. :11.5956 Max. :11.3505
- HSPC_725 HSPC_727 HSPC_729 HSPC_730
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 1.577 Median : 1.576 Median : 0.9579 Median : 1.135
- Mean : 2.483 Mean : 2.436 Mean : 2.2448 Mean : 2.445
- 3rd Qu.: 3.741 3rd Qu.: 3.447 3rd Qu.: 2.7343 3rd Qu.: 3.475
- Max. :10.647 Max. :11.512 Max. :10.9657 Max. :11.121
- HSPC_731 HSPC_732 HSPC_733 HSPC_734
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 1.130 Median : 0.6937 Median : 1.436 Median : 0.7333
- Mean : 2.854 Mean : 2.1051 Mean : 2.489 Mean : 2.5404
- 3rd Qu.: 6.019 3rd Qu.: 2.0311 3rd Qu.: 3.738 3rd Qu.: 5.6282
- Max. :10.471 Max. :11.0494 Max. :10.929 Max. :10.4547
- HSPC_735 HSPC_736 HSPC_737 HSPC_738
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.033 Median : 0.6789 Median : 1.185 Median : 1.514
- Mean : 2.389 Mean : 2.0224 Mean : 2.722 Mean : 2.503
- 3rd Qu.: 3.056 3rd Qu.: 2.0017 3rd Qu.: 5.669 3rd Qu.: 3.602
- Max. :10.866 Max. :11.8100 Max. :11.076 Max. :10.473
- HSPC_740 HSPC_742 HSPC_743 HSPC_744
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.8437 Median : 1.122 Median : 1.213
- Mean : 2.506 Mean : 1.8949 Mean : 2.028 Mean : 2.048
- 3rd Qu.: 3.794 3rd Qu.: 1.7586 3rd Qu.: 2.840 3rd Qu.: 2.309
- Max. :10.618 Max. :11.6327 Max. :10.449 Max. :10.598
- HSPC_745 HSPC_746 HSPC_747 HSPC_748
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 2.403 Median : 2.184 Median : 0.000 Median : 1.181
- Mean : 2.309 Mean : 2.153 Mean : 2.543 Mean : 2.017
- 3rd Qu.: 3.793 3rd Qu.: 3.016 3rd Qu.: 4.751 3rd Qu.: 2.264
- Max. :10.882 Max. :10.988 Max. :10.860 Max. :12.153
- HSPC_749 HSPC_750 HSPC_751 HSPC_752
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.444 Median : 1.030 Median : 1.567 Median : 2.228
- Mean : 2.477 Mean : 2.370 Mean : 2.416 Mean : 2.529
- 3rd Qu.: 3.501 3rd Qu.: 3.052 3rd Qu.: 3.435 3rd Qu.: 3.976
- Max. :11.391 Max. :11.167 Max. :10.239 Max. :10.586
- HSPC_753 HSPC_755 HSPC_756 HSPC_757
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.062 Median : 0.740 Median : 1.731 Median : 1.395
- Mean : 2.313 Mean : 2.102 Mean : 2.592 Mean : 2.477
- 3rd Qu.: 2.961 3rd Qu.: 2.509 3rd Qu.: 4.107 3rd Qu.: 3.253
- Max. :11.202 Max. :10.559 Max. :10.783 Max. :10.973
- HSPC_758 HSPC_759 HSPC_760 HSPC_761
- Min. : 0.0000 Min. : 0.0000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.8648 Median : 0.9415 Median : 1.052 Median : 0.6917
- Mean : 2.6819 Mean : 2.1274 Mean : 2.288 Mean : 2.2992
- 3rd Qu.: 4.7233 3rd Qu.: 2.2271 3rd Qu.: 2.404 3rd Qu.: 2.6015
- Max. :11.1096 Max. :11.2534 Max. :11.008 Max. :11.7228
- HSPC_762 HSPC_764 HSPC_765 HSPC_766
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 1.271 Median : 1.784 Median : 2.116 Median : 0.9828
- Mean : 2.242 Mean : 2.068 Mean : 2.100 Mean : 2.1721
- 3rd Qu.: 2.734 3rd Qu.: 3.059 3rd Qu.: 2.939 3rd Qu.: 2.6115
- Max. :12.043 Max. :11.003 Max. :12.757 Max. :10.2002
- HSPC_767 HSPC_768 HSPC_769 HSPC_770
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.6646 Median : 1.703 Median : 0.000 Median : 1.760
- Mean : 1.9552 Mean : 2.365 Mean : 2.080 Mean : 2.343
- 3rd Qu.: 1.9730 3rd Qu.: 3.325 3rd Qu.: 3.289 3rd Qu.: 3.122
- Max. :11.3033 Max. :10.958 Max. :11.176 Max. :10.497
- HSPC_771 HSPC_772 HSPC_773 HSPC_774
- Min. : 0.000 Min. : 0.000 Min. : 0.0000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.0000
- Median : 1.178 Median : 1.601 Median : 0.9901 Median : 0.9736
- Mean : 2.527 Mean : 2.283 Mean : 1.8628 Mean : 2.5263
- 3rd Qu.: 3.342 3rd Qu.: 2.828 3rd Qu.: 1.9851 3rd Qu.: 5.4694
- Max. :11.156 Max. :10.625 Max. :10.7274 Max. :10.7701
- HSPC_776 HSPC_777 HSPC_778 HSPC_780
- Min. : 0.000 Min. : 0.000 Min. :0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000 1st Qu.: 0.000
- Median : 0.000 Median : 1.053 Median :1.435 Median : 1.178
- Mean : 2.315 Mean : 2.110 Mean :2.130 Mean : 2.476
- 3rd Qu.: 3.788 3rd Qu.: 2.673 3rd Qu.:3.488 3rd Qu.: 3.769
- Max. :11.105 Max. :11.646 Max. :9.535 Max. :11.265
- HSPC_781 HSPC_782 HSPC_783 HSPC_784
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.050
- Mean : 1.911 Mean : 2.416 Mean : 2.254 Mean : 2.175
- 3rd Qu.: 2.884 3rd Qu.: 3.872 3rd Qu.: 2.548 3rd Qu.: 2.468
- Max. :11.445 Max. :10.161 Max. :10.970 Max. :10.958
- HSPC_785 HSPC_786 HSPC_787 HSPC_788
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.000 Median : 1.148 Median : 0.000 Median : 0.9386
- Mean : 2.230 Mean : 2.467 Mean : 2.100 Mean : 1.9749
- 3rd Qu.: 2.466 3rd Qu.: 3.899 3rd Qu.: 2.991 3rd Qu.: 2.6662
- Max. :11.041 Max. :11.080 Max. :10.690 Max. :11.1078
- HSPC_789 HSPC_790 HSPC_791 HSPC_794
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.181 Median : 1.353 Median : 1.790 Median : 1.113
- Mean : 2.225 Mean : 2.255 Mean : 2.699 Mean : 2.225
- 3rd Qu.: 2.876 3rd Qu.: 2.852 3rd Qu.: 4.931 3rd Qu.: 2.768
- Max. :11.245 Max. :11.558 Max. :11.104 Max. :11.118
- HSPC_795 HSPC_796 HSPC_797 HSPC_798
- Min. : 0.0000 Min. : 0.0000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.8317 Median : 0.7001 Median : 0.8722 Median : 1.531
- Mean : 2.3985 Mean : 2.6865 Mean : 2.6172 Mean : 2.485
- 3rd Qu.: 3.4461 3rd Qu.: 5.6688 3rd Qu.: 5.3078 3rd Qu.: 3.098
- Max. :11.0956 Max. :11.0829 Max. :11.4339 Max. :10.933
- HSPC_799 HSPC_800 HSPC_801 HSPC_802
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 1.033
- Mean : 2.179 Mean : 2.173 Mean : 2.427 Mean : 2.613
- 3rd Qu.: 3.517 3rd Qu.: 2.865 3rd Qu.: 4.665 3rd Qu.: 3.780
- Max. :11.666 Max. :11.263 Max. :10.905 Max. :10.864
- HSPC_803 HSPC_804 HSPC_806 HSPC_807
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.000 Median : 0.000 Median : 2.103 Median : 0.7501
- Mean : 2.395 Mean : 2.301 Mean : 2.222 Mean : 2.2476
- 3rd Qu.: 3.883 3rd Qu.: 3.167 3rd Qu.: 3.445 3rd Qu.: 2.3481
- Max. :10.766 Max. :11.298 Max. :10.326 Max. :11.2700
- HSPC_808 HSPC_809 HSPC_810 HSPC_812
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Median : 0.6619 Median : 1.788 Median : 1.651 Median : 0.8459
- Mean : 2.1677 Mean : 2.544 Mean : 2.471 Mean : 2.2960
- 3rd Qu.: 2.5355 3rd Qu.: 3.730 3rd Qu.: 3.662 3rd Qu.: 2.6906
- Max. :10.9302 Max. :11.791 Max. :10.829 Max. :11.5500
- HSPC_813 HSPC_814 HSPC_815 HSPC_816
- Min. : 0.0000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.6278 Median : 1.110 Median : 0.9631 Median : 1.346
- Mean : 2.2448 Mean : 2.762 Mean : 2.4587 Mean : 2.341
- 3rd Qu.: 2.3066 3rd Qu.: 5.996 3rd Qu.: 3.4228 3rd Qu.: 2.842
- Max. :12.0043 Max. :10.406 Max. :11.4527 Max. :11.151
- HSPC_818 HSPC_819 HSPC_820 HSPC_821
- Min. : 0.0000 Min. : 0.000 Min. : 0.0000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000
- Median : 0.9967 Median : 1.365 Median : 0.8099 Median : 1.382
- Mean : 2.3081 Mean : 2.426 Mean : 2.1063 Mean : 2.532
- 3rd Qu.: 2.9942 3rd Qu.: 3.632 3rd Qu.: 2.4643 3rd Qu.: 3.462
- Max. :11.9931 Max. :10.672 Max. :11.2412 Max. :12.126
- HSPC_822 HSPC_824 HSPC_825 HSPC_826
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.387 Median : 0.000 Median : 1.386 Median : 1.324
- Mean : 2.503 Mean : 2.084 Mean : 2.162 Mean : 2.398
- 3rd Qu.: 3.799 3rd Qu.: 2.342 3rd Qu.: 2.897 3rd Qu.: 3.150
- Max. :11.892 Max. :11.365 Max. :11.498 Max. :11.198
- HSPC_827 HSPC_828 HSPC_831 HSPC_832
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.746 Median : 1.003 Median : 1.304 Median : 1.035
- Mean : 2.239 Mean : 2.145 Mean : 2.589 Mean : 2.384
- 3rd Qu.: 2.638 3rd Qu.: 2.326 3rd Qu.: 3.866 3rd Qu.: 3.450
- Max. :12.101 Max. :10.710 Max. :10.839 Max. :10.686
- HSPC_833 HSPC_834 HSPC_835 HSPC_836
- Min. : 0.0000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.7166 Median : 0.9245 Median : 1.006 Median : 0.000
- Mean : 2.3553 Mean : 2.0872 Mean : 2.552 Mean : 2.471
- 3rd Qu.: 3.9364 3rd Qu.: 2.4568 3rd Qu.: 4.034 3rd Qu.: 3.994
- Max. :11.1695 Max. :11.1803 Max. :11.779 Max. :11.316
- HSPC_837 HSPC_838 HSPC_839 HSPC_840
- Min. : 0.000 Min. : 0.0000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.312 Median : 0.9838 Median : 1.083 Median : 1.867
- Mean : 2.590 Mean : 2.5281 Mean : 2.380 Mean : 2.548
- 3rd Qu.: 4.443 3rd Qu.: 3.5551 3rd Qu.: 3.743 3rd Qu.: 3.609
- Max. :10.672 Max. :11.2707 Max. :10.966 Max. :10.867
- HSPC_841 HSPC_842 HSPC_843 HSPC_844
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.439 Median : 1.774 Median : 1.257 Median : 1.584
- Mean : 2.408 Mean : 2.380 Mean : 2.845 Mean : 2.627
- 3rd Qu.: 3.494 3rd Qu.: 3.490 3rd Qu.: 6.768 3rd Qu.: 3.951
- Max. :10.930 Max. :11.137 Max. :11.933 Max. :11.446
- HSPC_845 HSPC_846 HSPC_848 HSPC_849
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 1.227 Median : 1.401 Median : 0.000 Median : 1.602
- Mean : 2.464 Mean : 2.240 Mean : 2.152 Mean : 2.402
- 3rd Qu.: 3.377 3rd Qu.: 2.920 3rd Qu.: 2.554 3rd Qu.: 2.920
- Max. :10.535 Max. :11.519 Max. :11.266 Max. :11.678
- HSPC_851 HSPC_852
- Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000
- Mean : 2.319 Mean : 2.143
- 3rd Qu.: 3.373 3rd Qu.: 2.901
- Max. :11.602 Max. :11.469
-
-
-
Hmmmm, did you get all that? Nope, me neither! We have 701 cells but we only have 6 samples for the frogs. We will need a different approach to get an overview but I find it is still useful to look at the few columns
ensembl_gene_id HSPC_001 HSPC_002 HSPC_003
- Length:280 Min. : 0.000 Min. : 0.000 Min. : 0.0000
- Class :character 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.0000
- Mode :character Median : 0.000 Median : 0.000 Median : 0.9929
- Mean : 2.143 Mean : 1.673 Mean : 2.5964
- 3rd Qu.: 2.120 3rd Qu.: 2.239 3rd Qu.: 6.1559
- Max. :12.567 Max. :11.976 Max. :11.1138
- HSPC_004 HSPC_006 HSPC_008 HSPC_009
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. :0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000
- Median : 0.000 Median : 1.276 Median : 0.000 Median :0.000
- Mean : 1.851 Mean : 2.338 Mean : 2.375 Mean :2.220
- 3rd Qu.: 2.466 3rd Qu.: 3.536 3rd Qu.: 3.851 3rd Qu.:3.594
- Max. :11.133 Max. :10.014 Max. :11.574 Max. :9.997
- HSPC_011 HSPC_012 HSPC_014 HSPC_015
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 1.750 Median : 0.000 Median : 0.000
- Mean : 2.285 Mean : 2.431 Mean : 2.295 Mean : 2.515
- 3rd Qu.: 3.193 3rd Qu.: 3.741 3rd Qu.: 3.150 3rd Qu.: 3.789
- Max. :11.260 Max. :10.905 Max. :11.051 Max. :10.751
- HSPC_016 HSPC_017 HSPC_018 HSPC_020
- Min. : 0.0000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.9488 Median : 0.000 Median : 1.248 Median : 0.000
- Mean : 2.6115 Mean : 2.146 Mean : 2.710 Mean : 2.509
- 3rd Qu.: 5.9412 3rd Qu.: 2.357 3rd Qu.: 6.006 3rd Qu.: 4.470
- Max. :11.3082 Max. :12.058 Max. :11.894 Max. :11.281
- HSPC_021 HSPC_022 HSPC_023 HSPC_024
- Min. : 0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
- 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.: 0.000
- Median : 0.000 Median : 0.000 Median : 0.000 Median : 0.000
- Mean : 2.170 Mean : 2.287 Mean : 2.314 Mean : 2.195
- 3rd Qu.: 2.996 3rd Qu.: 3.351 3rd Qu.: 2.749 3rd Qu.: 2.944
- Max. :10.709 Max. :11.814 Max. :12.113 Max. :11.279
-
-
-
Notice that:
-
-
the maximum value is much less high than for the frogs and has decimals. That is because the mouse data are logged (to base 2) normalised counts, not raw counts as they are in the frog data set.
-
a minimum value of 0 appears in all 20 columns - perhaps that is true across the whole dataset (or at least common)
-
at least some of the medians are zeros so there must be quite a lot of zeros
-
the few columns we can see are roughly similar
-
it would not be very practical to plot the distributions of values in cell cell using facet_wrap().
-
-
In this data set, there is even more of an advantage of using the pivot_longer(), group_by() and summarise() approach. We will be able to open the dataframe in the Viewer and make plots to examine whether the distributions are similar across cells.
Notice that I have used cell as the column name rather than sample and expr (expression) rather than count. I’ve also added the standard deviation.
-
🎬 View the hspc_summary_samp dataframe (click on it in the environment).
-
All cells have quite a few zeros and the lower quartile is 0 for all cells, i.e., every cell has many genes with zero expression.
-
To get a better understanding of the distribution of expressions in cells we can create a ggplot using the pointrange geom. Pointrange puts a dot at the mean and a line between a minimum and a maximum such as +/- one s.d. Not unlike a boxplot, but when you need the boxes too be very narrow!
You will need to use the Zoom button to pop the plot window out so you can make it as wide as possible
-
The things to notice are:
-
-
the average expression in cells is similar for all cells. This is good to know - if some cells had much lower expression perhaps there is something wrong with them, or their sequencing, and they should be excluded.
-
the distributions are roughly similar in width too
-
-
The default order of cell is alphabetical. It can be easier to see these (non-) effects if we order the lines by the size of the mean.
-
🎬 Order a pointrange plot with reorder(variable_to_order, order_by).
reorder() arranges cell in increasing size of mean
-
🎬 Write hspc_summary_samp to a file called “hspc_summary_samp.csv”:
-
Distribution of values across the genes
-
🐸 Frog genes
-
There are lots of genes in this dataset therefore we will take the same approach as that we took for the distributions across mouse cells. We will pivot the data to tidy and then summarise the counts for each gene.
-
🎬 Summarise the counts for each genes:
-
-
s30_summary_gene<-s30|>
-pivot_longer(cols =-xenbase_gene_id,
- names_to ="sample",
- values_to ="count")|>
-group_by(xenbase_gene_id)|>
-summarise(min =min(count),
- lowerq =quantile(count, 0.25),
- sd =sd(count),
- mean =mean(count),
- median =median(count),
- upperq =quantile(count, 0.75),
- max =max(count),
- total =sum(count),
- n_zero =sum(count==0))
-
-
I have calculated the values we used before with one addition: the sum of the counts (total).
+
We have found the distribution across samples to be like that to the distribution over all. This is good because it means that the samples are fairly consistent with each other. We can now move on to the next step.
+
Distribution of values across the genes
+
There are lots of genes in this dataset therefore we will take a slightly different approach. We would not want to use plot a distribution for each gene in the same way. Will pivot the data to tidy and then summarise the counts for each gene.
+
🎬 Summarise the counts for each gene and save the result as s30_summary_gene. Include the same columns as we had in the by sample summary (s30_summary_samp) and an additional column, total for the total number of counts for each gene.
🎬 View the s30_summary_gene dataframe.
Notice that we have:
@@ -2040,111 +633,81 @@
Workshop
a lot of genes with zero counts in several of the samples
some very very low counts.
-
These should be filtered out because they are unreliable - or, at the least, uninformative. The goal of our downstream analysis will be to see if there is a significant difference in gene expression between the control and FGF-treated sibling. Since we have only three replicates in each group, having one or two unreliable, missing or zero values, makes such a determination impossible for a particular gene. We will use the total counts and the number of samples with non-zero values to filter our genes later.
-
As we have a lot of genes, it is again helpful to plot the mean counts with pointrange to get an overview. We will plot the log of the counts - we saw earlier that logging made it easier to understand the distribution of counts over such a wide range. We will also order the genes from lowest to highest mean count.
+
Genes with very low counts should be filtered out because they are unreliable - or, at the least, uninformative. The goal of our downstream analysis will be to see if there is a significant difference in gene expression between the control and FGF-treated sibling. Since we have only three replicates in each group, having one or two unreliable, missing or zero values, makes such a determination impossible for a particular gene. We will use the total counts (total) and the number of samples with non-zero values (n_above_zero) in this dataframe to filter our genes later.
+
As we have a lot of genes, it is again helpful to plot the mean counts with geom_pointrange() to get an overview of the distributions. We will again plot the log of the mean counts. We will also order the genes from lowest to highest mean count.
🎬 Plot the logged mean counts for each gene in order of size using geom_pointrange():
(Remember, the warning is expected since we have zeros).
+
(Note the warning is expected since we have zero means).
You can see we also have quite a few genes with means less than 1 (log below zero). Note that the variability between genes (average counts between 0 and 102586) is far greater than between samples (average counts from 260 to 426) which is exactly what we would expect to see.
-
🎬 Write s30_summary_gene to a file called “s30_summary_gene.csv”:
-
🐭 Mouse genes
-
There are fewer genes in this dataset, but still more than you can understand without the overview provided by a plot. We will again pivot the data to tidy and then summarise the expression for each gene.
-
🎬 Summarise the expression for each genes:
-
-
hspc_summary_gene<-hspc|>
-pivot_longer(cols =-ensembl_gene_id,
- names_to ="cell",
- values_to ="expr")|>
-group_by(ensembl_gene_id)|>
-summarise(min =min(expr),
- lowerq =quantile(expr, 0.25),
- sd =sd(expr),
- mean =mean(expr),
- median =median(expr),
- upperq =quantile(expr, 0.75),
- max =max(expr),
- total =sum(expr),
- n_zero =sum(expr==0))
-
-
🎬 View the hspc_summary_gene dataframe. Remember these are normalised and logged (base 2) so we should not see very large values.
-
Notice that we have:
-
-
no genes with 0 in every cell
-
very few genes (9) with no zeros at all
-
quite a few genes with zero in many cells but this matters less than zeros in the frog samples because we had just 6 samples and we have 701 cells.
-
-
As we have a lot of genes, it is again helpful to plot the mean expression with pointrange to get an overview. We do not need to log the values but ordering the genes will help.
-
🎬 Plot the logged mean counts for each gene in order of size using geom_pointrange():
Note again that the variability between genes (average expression between 0.02 and and 10.03) is far greater than between cells (average expression from1.46 to 3.18) which is expected.
-
🎬 Write s30_summary_gene to a file called “s30_summary_gene.csv”:
-
Filtering for QC
-
🐸 Frog filtering
-
Our samples look to be similarly well sequenced. There are no samples we should remove. However, some genes are not express or the expression values are so low in for a gene that they are uninformative. We will filter the s30_summary_gene dataframe to obtain a list of xenbase_gene_id we can use to filter s30.
-
My suggestion is to include only the genes with counts in at least 3 samples3 and those with total counts above 20.
+
🐭 Stem cells
+
Distribution of values across all the data in the file
+
Distribution of values across the samples
+
Distribution of values across the genes
+
🎄 Arabidopsis
+
Distribution of values across all the data in the file
+
Distribution of values across the samples
+
Distribution of values across the genes
+
💉 Leishmania
+
Distribution of values across all the data in the file
+
Distribution of values across the samples
+
Distribution of values across the genes
+
Filtering for QC
+
🐸 Frog development
+
Our samples look to be similarly well sequenced. There are no samples we should remove. However, some genes are not expressed or the expression values are so low in for a gene that they are uninformative. We will filter the s30_summary_gene dataframe to obtain a list of xenbase_gene_id we can use to filter s30.
+
My suggestion is to include only the genes with counts in at least 3 samples. and those with total counts above 20. I chose 3 because that would keep genes expressed only in one sample: [0, 0, 0] [#,#,#]. This is a difference we cannot test statistically, but which matters biologically.
We will take a different approach to filtering the single cell data. For the Frog samples we are examining the control and the FGF treated samples. This means have a low number of counts overall means the gene is not really expressed (detected) in any condition, and filtering out those genes is removing things that definitely are not interesting. For the mice, we have examined only one cell type but will be making comparisons between cells types. It may be that low expression of a gene in this cell type tells us something if that gene is highly expressed in another cell type. Instead, we will make statistical comparisons between the cell types and then filter based on overall expression, the difference in expression between cell types and whether that difference is significant.
The number of “replicates” is also important. When you have only three in each group it is not possible to make statistical comparisons when several replicates are zero. This is less of an issue with single cell data.
-
🤗 Look after future you!
-
You need only do the section for your own project data
-
🐸 Frogs and future you
+
🎄 Arabidopsis
+
💉 Leishmania
+
🤗 Look after future you!
+
You need only do the section for your own project data but completing this step is important.
+
🐸 Frogs and future you
🎬 Create a new Project, frogs-88H, populated with folders and your data. Make a script file called cont-fgf-s30.R. This will a be commented analysis of the control vs FGF at S30 comparison. You will build on this each workshop and be able to use it as a template to examine other comparisons. Copy in the appropriate code and comments from workshop-1.R. Edit to improve your comments where your understanding has developed since you made them. Make sure you can close down RStudio, reopen it and run your whole script again.
-
🐭 Mice and future you
+
🐭 Mice and future you
🎬 Create a new Project, mice-88H, populated with folders and your data. Make a script file called hspc-prog.R. This will a be commented analysis of the hspc cells vs the prog cells. At this point you will have only code for the hspc cells. You will build on this each workshop and be able to use it as a template to examine other comparisons. Copy in the appropriate code and comments from workshop-1.R. Edit to improve your comments where your understanding has developed since you made them. Make sure you can close down RStudio, reopen it and run your whole script again.
These contain all the code needed in the workshop even where it is not visible on the webpage.
-
The workshop.qmd file is the file I use to compile the practical. Qmd stands for Quarto markdown. It allows code and ordinary text to be interleaved to produce well-formatted reports including webpages. Right-click on the link and choose Save-As to download. You will be able to open the Qmd file in RStudio. Alternatively, View in Browser. Coding and thinking answers are marked with #---CODING ANSWER--- and #---THINKING ANSWER---
The workshop.qmd file is the file I use to compile the practical. Qmd stands for Quarto markdown. It allows code and ordinary text to be interleaved to produce well-formatted reports including webpages. Right-click on the link and choose Save-As to download. You will be able to open the Qmd file in RStudio. Alternatively, View in Browser. Coding and thinking answers are marked with #---CODING ANSWER--- and #---THINKING ANSWER---
R Core Team. 2024. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the tidyverse.”Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686.
+
+Xie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.
+
+
+———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
+
-Xie, Yihui. 2024. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.
+———. 2024. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.
This a result of the Central limit theorem,one consequence of which is that adding together lots of distributions - whatever distributions they are - will tend to a normal distribution.↩︎
-
This a result of the Central limit theorem,one consequence of which is that adding together lots of distributions - whatever distributions they are - will tend to a normal distribution.↩︎
-
I chose three because that would keep [0, 0, 0] [#,#,#]. This is difference we cannot test statistically, but which would matter biologically.↩︎
In the workshop, you will learn how to merge gene information into our results, conduct and plot a Principle Component Analysis (PCA) as well as how to create a nicely formatted Volcano plot and heatmap.
+
In the workshop, you will learn how to conduct and plot a Principle Component Analysis (PCA) as well as how to create a nicely formatted Volcano plot. You will also save significant genes to file to make it easier to identify genes of interest and perform Gene Ontology (GO) term enrichment analysis.
+
import log where needed write sig to file add go terms prep data for pca do pca and plot volcano go term enrichment
Set up
-
Either:
-
🎬 Open 🐸 frogs-88H Project and the cont-fgf-s30.R script.
-
Or
-
🎬 Open 🐭 mice-88H Project and the hspc-prog.R script.
-
🎬 Make a new folder figures in the project directory. You can use the New Folder button in the Files pane but here I have used the fs(Hester, Wickham, and Csárdi 2023) package
🎬 Load tidyverse(Wickham et al. 2019) and conflicted(Wickham 2023). You most likely have this code at the top of cont-fgf-s30.R or hspc-prog.R already.
+
🐸 Frog development
+
🎬 Open the frogs-88H RStudio Project and the cont-fgf-s30.R script.
+
🎄 Arabidopisis
+
🎬 Open the arabi-88H RStudio Project and the wildsuf-wilddef-s30.R script.
+
💉 Leishmania mexicana
+
🎬 Open the leish-88H RStudio Project and the pro-meta-s30.R script.
+
🐭 Stem cells
+
🎬 Open the mice-88H RStudio Project and the hspc-prog.R script.
+
Everyone
+
🎬 Make a new folder figures in the project directory.
+
This is where we will save our figure files
+
🎬 Load tidyverse(Wickham et al. 2019) and conflicted(Wickham 2023). You most likely have this code at the top of your script already.
Visualise the expression of the most significant genes using a heatmap
-
Visual all the results with a volcano plot
-
-
Import
-
We need to import both the normalised counts and the statistical results. We will need all of these for the visualisation and interpretation.
-
🎬 Import files saved from last week from the results folder: S30_normalised_counts.csv and S30_results.csv. I used the names s30_count_norm and s30_results for the dataframes.
+
Import
+
Everyone
+
🎬 Import your results data. This should be a file in the results folder called xxxx_results.csv where xxxx indicates the comparison you made.
🎬 Remind yourself what is in the rows and columns and the structure of the dataframes (perhaps using glimpse())
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
It is useful to have this information in a single dataframe to which we will add the gene information from xenbase. Having all the information together will make it easier to interpret the results and select genes of interest.
-
🎬 Merge the two dataframes:
-
-
# merge the results with the normalised counts
-s30_results<-s30_count_norm|>
-left_join(s30_results, by ="xenbase_gene_id")
-
-
This means you have the counts for each sample along with the statistical results for each gene.
-
🎬 Import the metadata that maps the sample names to treatments:
-
-
# Import metadata that maps the sample names to treatments
-meta<-read_table("meta/frog_meta_data.txt")
-row.names(meta)<-meta$sample_id
-# We only need the s30
-meta_s30<-meta|>
-dplyr::filter(stage=="stage_30")
-
-
log2 transform the data
+
+
+
When we do PCA we will want to label the samples with their treatment for figures. This labelling information is most easily added using the metadata. You will need to select only the samples for the comparison that was made in the results file. You may need to refer back to the Week 4 Statistical Analysis workshop to remind yourself how to import and select the metadata you need
+
🎬 Import the metadata that maps the sample names to treatments. Remember to select only the samples for comparison that was made.
+
log2 transform the normalised counts
We use the normalised counts for data visualisations so that the comparisons are meaningful. Since the fold changes are given is log2 it is useful to log2 transform the normalised counts too. We will add columns to the dataframe with these transformed values. Since we have some counts of 0 we will add a tiny amount to avoid -Inf values.
-
🎬 log2 transform the normalised counts:
+
log2 transformation would be applied to one column like this:
+
+
# DO NOT DO
+# log2 transform the counts plus a tiny amount to avoid log(0)
+dataframe<-dataframe|>
+mutate(log2_mycolumn =log2(mycolumn+0.001))
+
+
We are going to use a wonderful bit of R wizardry to apply a transformation to multiple columns. This is the across() function which has three arguments:
+
across(.cols, .fns, .names)
+
where:
+
+
+.cols is the selection of columns to transform
+
+.fns is the function we want to apply to the selected columns
+
+.names is the naming convention for the new columns
+
+
The general form of the code you need is:
-
# log2 transform the counts plus a tiny amount to avoid log(0)
-s30_results<-s30_results|>
-mutate(across(starts_with("s30"),
+
# DO NOT DO
+# log2 transform the counts plus a tiny amount to avoid log(0)
+xxxx_results<-xxxx_results|>
+mutate(across(starts_with("pattern"), \(x)log2(x+0.001), .names ="log2_{.col}"))
-
This is a wonderful bit or R wizardry. We are using the across() function to apply a transformation to multiple columns. We have selected all the columns that start with s30. The \(x) is an “anonymous” function that takes the value of the column and adds 0.001 to it before applying the log2() function. The .names = "log2_{.col}" argument tells across() to name the new columns with the prefix log2_ followed by the original column name. You can read more about across() and anonymous functions from my posit::conf(2023) workshop
-
I recommend viewing the dataframe to see the new columns.
-
We now have dataframe with all the information we need: normalised counts, log2 normalised counts, statistical comparisons with fold changes and p values, and information about the gene other than just the id.
-
Write the significant genes to file
-
We will create dataframe of the significant genes and write them to file. These are the files you want to examine in more detail along with the visualisations to select your genes of interest.
-
🎬 Create a dataframe of the genes significant at the 0.01 level:
+
where:
+
+
+xxxx_results is the name of the dataframe of results
+
+pattern matches the starting letters for all of the normalised counts so that starts_with("pattern") gives the selection of columns to transform
+
the bit after the \(x) is the function we want to apply to the selected columns
+
the \(x) means it is an “anonymous” function which means we don’t have to define a function name.
+
+"log2_{.col}" means the columns will have the same name (in the .col) but with the prefix log2_ added.
🎬 Design the code to log2 transform the normalised counts using the template given
+
I recommend viewing the dataframe to see the new columns. Check you have the expected number of columns.
+
🐭 Stem cells
+
do not because the data is already log2 transformed.
+
Everyone
+
We now all have dataframes with all the information we need: normalised counts, log2 normalised counts, statistical comparisons with fold changes and p-values, and information about the gene.
+
Write the significant genes to file
+
Everyone
+
We will create dataframe of the significant genes and write them to file. This is subset from the results file but will make it a little easier to examine and select genes of interest.
# DO NOT DO
+# create a dataframe of genes significant at 0.05 level
+xxxx_results_sig0.05<-xxxx_results|>
+filter(padj<=0.05)
-
🎬 Write the dataframe to file
-
🎬 Create a dataframe of the genes significant at the 0.05 level and write to file:
+
Note that you determine the significance level using the adjusted p-values (padj or FDR) rather than the uncorrected p-values.
+
🎬 Create a dataframe of the genes significant at the 0.05 level.
❓How many genes are significant at the 0.01 and 0.05 levels?
-
-
-
View the relationship between samples using PCA
-
We have 10,136 genes in our dataset. PCA will allow us to plot our samples in the “gene expression” space so we can see if FGF-treated sample cluster together and control samples cluster together as we would expect. We do this on the log2 transformed normalised counts.
-
Our data have genes in rows and samples in columns which is a common organisation for gene expression data. However, PCA expects samples in rows and genes, the variables, in columns. We can transpose the data to get it in the correct format.
+
+
+
+
+
+
🎬 Write the dataframe to a csv file. I recommend using the same file name as you used for the dataframe.
+
Principal Component Analysis (PCA)
+
We have many genes in our datasets. PCA will allow us to plot our samples in the “gene expression” space so we can see if replicates with the same treatment cluster together as we would expect. PCA is a dimension reduction technique that finds the directions of maximum variance in the data. We are doing PCA after our statistical analysis but often it is one of the first techniques used to explore the data. If we do not see treatment effects in a PCA plot then we are not likely to see them in the statistical analysis. PCA can also help you identify any outlier replicates. The PCA is best conducted on the normalised counts or the log2 transformed normalised counts. We will use the log2 transformed normalised counts.
+
We will carry out the following steps to do the PCA:
+
+
Select the log2 transformed normalised counts. You can only use numerical data in PCA.
+
Transpose our data. We have genes in rows and samples in columns (this is common for gene expression data). However, to treatment the genes as variables, PCA expects samples in rows and genes in columns.
+
Add the gene names as column names in the transposed data
+
Perform the PCA
+
Extract the scores on the first two principal components and label the data
+
Plot the the first two principal components as a scatter plot
+
+
🐸 Frog development
🎬 Transpose the log2 transformed normalised counts:
We have used the select() function to select all the columns that start with log2_. We then use the t() function to transpose the dataframe. We then convert the resulting matrix to a dataframe using data.frame(). If you view that dataframe you’ll see it has default column name which we can fix using colnames() to set the column names to the Xenbase gene ids.
The rank. argument tells prcomp() to only calculate the first 4 principal components. This is useful for visualisation as we can only plot in 2 or 3 dimensions. We can see the results of the PCA by viewing the summary() of the pca object.
Importance of first k=4 (out of 6) components:
PC1 PC2 PC3 PC4
@@ -498,23 +547,26 @@
Workshop
Cumulative Proportion 0.4243 0.6562 0.8095 0.9116
-
The Proportion of Variance tells us how much of the variance is explained by each component. We can see that the first component explains 0.4243 of the variance, the second 0.2320, and the third 0.1532. Together the first three components explain nearly 81% of the total variance in the data. Plotting PC1 against PC2 will capture about 66% of the variance which is likely much better than we would get plotting any two genes against each other. To plot the PC1 against PC2 we will need to extract the PC1 and PC2 score from the pca object and add labels for the samples.
-
🎬 Remove log2 from the row names:
+
The Proportion of Variance tells us how much of the variance is explained by each component. We can see that the first component explains 0.4243 of the variance, the second 0.2320, and the third 0.1532. Together the first three components explain nearly 81% of the total variance in the data. Plotting PC1 against PC2 will capture about 66% of the variance which is likely very much better than we would get plotting any two genes against each other. To plot the PC1 against PC2 we will need to extract the PC1 and PC2 “scores” from the PCA object and add labels for the samples. Those labels will come from the row names of the transformed data which has the sample ids and from the metadata.
+
🎬 Create a vector of the sample ids from the row names. These include the log2 prefix which we can removed for labelling:
🎬 Create a dataframe of the PC1 and PC2 scores which are in pca$x and add the sample ids:
+
You might want to check the result.
+
Now we will extract the PC1 and PC2 scores from the PCA object and add. Our PCA object is called pca and the scores are in pca$x. We will create a dataframe of the scores and add the sample ids.
+
🎬 Create a dataframe of PC1 and PC2 scores and add the sample ids:
🎬 Merge with the metadata so we can label points by treatment and sibling pair:
-
pca_labelled<-pca_labelled|>
+
pca_labelled<-pca_labelled|>left_join(meta_s30, by ="sample_id")
-
Since the metadata contained the sample ids, it was especially important to remove the log2_ from the row names so that the join would work. The dataframe should look like this:
+
Since the metadata contained the sample ids, it was especially important to remove the log2_ from the row names so that the join would work.
+
The dataframe should look like this:
@@ -544,151 +596,194 @@
Workshop
0.814699
-60.728327
-5.820669
-
S30_C_5
+
S30_C_1
stage_30
control
-
five
+
one
-67.02571
25.668563
51.476835
28.480254
-
S30_C_6
+
S30_C_2
stage_30
control
-
six
+
two
-14.02772
-78.474054
15.282058
-9.213076
-
S30_C_A
+
S30_C_3
stage_30
control
-
A
+
three
47.60726
49.035510
-19.288753
20.928290
-
S30_F_5
+
S30_F_1
stage_30
FGF
-
five
+
one
26.04954
32.914201
20.206072
-55.752818
-
S30_F_6
+
S30_F_2
stage_30
FGF
-
six
+
two
83.78054
-29.958919
-6.947884
21.378020
-
S30_F_A
+
S30_F_3
stage_30
FGF
-
A
+
three
-
🎬 Plot PC1 against PC2 and colour by sibling pair and shape by treatment:
+
The next task is to plot PC2 against PC1 and colour by sibling pair. This is just a scatterplot so we can use geom_point(). We will use colour to indicate the sibling pair and shape to indicate the treatment.
+
🎬 Plot PC2 against PC1 and colour by sibling pair and shape by treatment:
There is a good separation between treatments on PCA1. The sibling pairs do not seem to cluster together. You can also try plotting PC3 or PC4.
+
I prefer to customise the colours and shapes. I especially like the
+viridis colour scales which provide colour scales that are perceptually uniform in both colour and black-and-white. They are also designed to be perceived by viewers with common forms of colour blindness. See Introduction to viridis for more information.
+
ggplot provides functions to access the viridis scales. Here I use scale_fill_viridis_d(). The d stands for discrete. The function scale_fill_viridis_c() would be used for continuous data. I’ve used the default “viridis” (or “D”) option (do ?scale_fill_viridis_d for all the options) and used the begin and end arguments to control the range of colour - I have set the range to be from 0.15 to 0.95 the avoid the strongest contrast. I have also set the name argument to provide a label for the legend.
+
I have used scale_shape_manual() to set the shapes for the treatments. I have used the values 21 and 19 which are the codes for filled and open circles and filled triangles. I have set the name argument to NULL to remove the label (it’s obvious what that categories are treatments) and the labels argument to improve the legend.
+
🎬 Plot PC2 against PC1 and colour by sibling pair and shape by treatment:
+
+
pca_labelled|>ggplot(aes(x =PC1, y =PC2, colour =sibling_rep, shape =treatment))+geom_point(size =3)+scale_colour_viridis_d(end =0.95, begin =0.15,
- name ="Sibling pair",
- labels =c("A", ".5", ".6"))+
+ name ="Sibling pair")+scale_shape_manual(values =c(21, 19), name =NULL, labels =c("Control", "FGF-Treated"))+
-theme_classic()
-pca
There is a good separation between treatments on PCA1. The sibling pairs do not seem to cluster together.
-
🎬 Save the plot to file:
+
🎄 Arabidopsis
+
💉 Leishmainia mexicana
+
🐭 Stem cells
+
Visualise all the results with a volcano plot
+
A volcano plot is a scatterplot that shows statistical significance (p-value) versus magnitude of change (fold change). As the independent study explained, we plot -log10(adjusted p-value) on the y-axis so that the most significant genes are uppermost.
+
🐸 Frog development
+
We will add a column to the results dataframe that contains the -log10(padj). You could perform this transformation within the plot command without adding a column to the data if you prefer.
+
🎬 Add a column to the results dataframe that contains the -log10(padj):
Visualise the expression of the most significant genes using a heatmap
-
A heatmap is a common way to visualise gene expression data. Often people will create heatmaps with thousands of genes but it can be more informative to use a subset along with clustering methods. We will use the genes which are significant at the 0.01 level.
-
We are going to create an interactive heatmap with the heatmaply(Galili et al. 2017) package. heatmaply takes a matrix as input so we need to convert a dataframe of the log2 values to a matrix. We will also set the rownames to the Xenbase gene symbols.
-
🎬 Convert a dataframe of the log2 values to a matrix:
We need to tell the clustering algorithm how many clusters to create. We will set the number of clusters for the treatments to be 2 and the number of clusters for the genes to be the same since it makes sense to see what clusters of genes correlate with the treatments.
-
🎬 Set the number of clusters for the treatments and genes:
+
Our dashed lines are at -log10(0.05) and log2(2) and log2(-2) to make more clear which genes (points) are significantly different between the control and the FGF-treated samples and have a fold change of at least 2.
+
In most cases, people colour the points to show that the quadrants. I like to add columns to the dataframe to indicate if the gene is significant and if the fold change is large and use those variables in the plot.
+
🎬 Add columns to the results dataframe to indicate if the gene is significant and if the fold change is large:
On the vertical axis are genes which are differentially expressed at the 0.01 level. On the horizontal axis are samples. We can see that the FGF-treated samples cluster together and the control samples cluster together. We can also see two clusters of genes; one of these shows genes upregulated (more yellow) in the FGF-treated samples (the pink cluster) and the other shows genes down regulated (more blue, the blue cluster) in the FGF-treated samples.
-
The heatmap will open in the viewer pane (rather than the plot pane) because it is html. You can “Show in a new window” to see it in a larger format. You can also zoom in and out and pan around the heatmap and download it as a png. You might feel the colour bars is not adding much to the plot. You can remove it by setting hide_colorbar = TRUE, in the heatmaply() function.
-
Visualise all the results with a volcano plot
-
colour the points if padj < 0.05 and log2FoldChange > 1
For exploring the data, I like add labels to all the significant genes with a large fold change so I can very quickly identity them. The ggrepel package has a function geom_text_repel() that is useful for adding labels so that they don’t overlap.
+
🎬 Load the package:
-
s30_results<-s30_results|>
-mutate(log10_padj =-log10(padj),
- sig =padj<0.05,
- bigfc =abs(log2FoldChange)>=2)
Error in `geom_text_repel()`:
-! Problem while computing aesthetics.
-ℹ Error occurred in the 5th layer.
-Caused by error:
-! object 'xenbase_gene_symbol' not found
Error in `geom_text_repel()`:
-! Problem while computing aesthetics.
-ℹ Error occurred in the 5th layer.
-Caused by error:
-! object 'xenbase_gene_symbol' not found
-
-
-
🐭 Analysis
-
We will carry out several steps
-
-
Import data and merge statistical results with normalised values
-
Add gene information from the NCBI using biomaRt
-
Write the significant genes to file
-
View the relationship between cells using PCA
-
Visualise the expression of the most significant genes using a heatmap
-
Visual all the results with a volcano plot
-
-
Import
-
We need to import both the normalised counts and the statistical results. We will need all of these for the visualisation and interpretation.
-
🎬 Import the normalised counts for the Prog and HSPC cell types. I used the names prog and hspc for the dataframes.
-
🎬 Combine the two dataframes (minus one set of gene ids) into one dataframe called prog_hspc:
-
-
# combine into one dataframe dropping one of the gene id columns
-prog_hspc<-bind_cols(prog, hspc[-1])
-
-
🎬 Import the statistical results in results/prog_hspc_results.csv. I used the name prog_hspc_results for the dataframe.
-
🎬 Remind yourself what is in the rows and columns and the structure of the dataframe (perhaps using glimpse())
-
-
-
-
-
-
-
It is useful to have this information in a single dataframe to which we will add the gene information from Ensembl Having all the information together will make it easier to interpret the results and select genes of interest.
-
🎬 Merge the two dataframes:
-
-
# merge stats results with normalise values
-prog_hspc_results<-prog_hspc_results|>
-left_join(prog_hspc, by ="ensembl_gene_id")
-
-
This means you have the counts for each sample along with the statistical results for each gene.
-
Write the significant genes to file
-
We will create dateframe of the signifcant genes and write them to file. These are the files you want to examine in more detail along with the visualisations to select your genes of interest.
-
🎬 Create a dataframe of the genes significant at the 0.01 level:
🎬 Create a dataframe of the genes significant at the 0.05 level and write to file:
-
❓How many genes are significant at the 0.01 and 0.05 levels?
-
-
-
-
View the relationship between cells using PCA
-
We have 280 genes in our dataset. PCA will allow us to plot our cells in the “gene expression” space so we can see if Prog cells cluster together and HSPC cells cluster together as we would expect. We do this on the log2 transformed normalised counts.
-
Our data have genes in rows and samples in columns which is a common organisation for gene expression data. However, PCA expects cells in rows and genes, the variables, in columns. We can transpose the data to get it in the correct format.
-
🎬 Transpose the log2 transformed normalised counts:
We have used the select() function to select all the columns that start with Prog_ or HSPC_. We then use the t() function to transpose the dataframe. We then convert the resulting matrix to a dataframe using data.frame(). If you view that dataframe you’ll see it has default column name which we can fix using colnames() to set the column names to the gene ids.
The rank. argument tells prcomp() to only calculate the first 15 principal components. This is useful for visualisation as we can only plot in 2 or 3 dimensions. We can see the results of the PCA by viewing the summary() of the pca object.
The Proportion of Variance tells us how much of the variance is explained by each component. We can see that the first component explains 0.1099 of the variance, the second 0.04874, and the third 0.2498. Together the first three components explain 18% of the total variance in the data. Plotting PC1 against PC2 will capture about 16% of the variance. This is not that high but it likely better than we would get plotting any two genes against each other. To plot the PC1 against PC2 we will need to extract the PC1 and PC2 score from the pca object and add labels for the cells.
-
🎬 Create a dataframe of the PC1 and PC2 scores which are in pca$x and add the cell ids:
It will be helpful to add a column for the cell type so we can label points. One way to do this is to extract the information in the cell_id column into two columns.
-
🎬 Extract the cell type and cell number from the cell_id column (keeping the cell_id column):
"([a-zA-Z]{4})_([0-9]{3})" is a regular expression - or regex. [a-zA-Z] means any lower or upper case letter, {4} means 4 of them, and [0-9] means any number, {3} means 3 of them. The brackets around the two parts of the regex mean we want to extract those parts. The first part goes into cell_type and the second part goes into cell_number. The _ between the two patterns matches the underscore and the fact it isn’t in a bracket means we don’t want to keep it.
-
We can now plot the PC1 and PC2 scores.
-
🎬 Plot PC1 against PC2 and colour the points by cell type:
Visualise the expression of the most significant genes using a heatmap
-
A heatmap is a common way to visualise gene expression data. Often people will create heatmaps with thousands of genes but it can be more informative to use a subset along with clustering methods. We will use the genes which are significant at the 0.01 level.
-
We are going to create an interactive heatmap with the heatmaply(Galili et al. 2017) package. heatmaply takes a matrix as input so we need to convert a dataframe of the log2 values to a matrix. We will also set the rownames to the gene names.
-
🎬 Convert a dataframe of the log2 values to a matrix. I have used sample() to select 70 random columns so the heatmap is generated quickly:
We need to tell the clustering algorithm how many clusters to create. We will set the number of clusters for the cell types to be 2 and the number of clusters for the genes to be the same since it makes sense to see what clusters of genes correlate with the cell types.
It will take a minute to run and display. On the vertical axis are genes which are differentially expressed at the 0.01 level. On the horizontal axis are cells. We can see that cells of the same type don’t cluster that well together. We can also see two clusters of genes but the pattern of gene is not as clear as it was for the frogs and the correspondence with the cell clusters is not as strong.
-
The heatmap will open in the viewer pane (rather than the plot pane) because it is html. You can “Show in a new window” to see it in a larger format. You can also zoom in and out and pan around the heatmap and download it as a png. You might feel the colour bars is not adding much to the plot. You can remove it by setting hide_colorbar = TRUE, in the heatmaply() function.
-
Using all the cells is worth doing but it will take a while to generate the heatmap and then show in the viewer so do it sometime when you’re ready for a coffee break.
-
Visualise all the results with a volcano plot
-
colour the points if FDR < 0.05 and prog_hspc_results > 1
prog_hspc_results<-prog_hspc_results|>
-mutate(log10_FDR =-log10(FDR),
- sig =FDR<0.05,
- bigfc =abs(summary.logFC)>=2)
-
+
Notice that I have used filter() label only the genes that are both significant and have a large fold change. In systems you are familiar with, this labelling is very informative and can help you quickly identify common themes. Key to interpreting the volcano plot is to remember that positive fold changes means the gene is up-regulated in the FGF-treated samples and negative fold changes means the gene is down-regulated (i.e., higher in the control). This was determined by the order of the treatments in the contrast used in the DESeq2 analysis
+
If you do forget which way round you did the comparison, you can always examine the results dataframe to see which of the treatments seem to be higher for the positive fold changes.
+
Please note that Betsy doesn’t like graphs like this in the report!
+
When you have a gene of interest, you may wish to label it on the plot. This is done in the same way except that you filter the data to only include the gene of interest. I have used and then use geom_label_repel() rather than geom_text_repel() to put the label in a box and nudged it’s position to get a line connecting the point and the label. I have also increased the size of the point.
+
🎬 Add a label to one gene of interest (hoxb9.S) and :
-
vol<-prog_hspc_results|>
-ggplot(aes(x =summary.logFC,
- y =log10_FDR,
+
Error in `geom_text_repel()`:
-! Problem while computing aesthetics.
-ℹ Error occurred in the 5th layer.
-Caused by error:
-! object 'external_gene_name' not found
Once you have finished designing your plots, you should save them using ggsave(). You will want to assign the plot to a variable and use code similar to this:
Error in `geom_text_repel()`:
-! Problem while computing aesthetics.
-ℹ Error occurred in the 5th layer.
-Caused by error:
-! object 'external_gene_name' not found
-
-
-
-
-
-
-
-
🤗 Look after future you!
-
🎬 Go through your script (cont-fgf-s30.R or hspc-prog.R) and tidy up. I would suggest restarting R and trying to run the full pipeline from start to finish. You might need to :
+
🐭 Analysis
+
We will carry out several steps
+
+
Import data
+
Write the significant genes to file
+
View the relationship between cells using PCA
+
Visual all the results with a volcano plot
+
🤗 Look after future you!
+
🎬 Go through your script and tidy up. I would suggest restarting R and trying to run the full pipeline from start to finish. You might need to:
collect together library statements at the top of the script
-
remove code that you needed to start today but which wouldn’t be needed running the script from the top (e.g., importing)
+
remove code that you needed to start today but which wouldn’t be needed running the script from the top (e.g., importing the results)
These contain all the code needed in the workshop even where it is not visible on the webpage.
-
The workshop.qmd file is the file I use to compile the practical. Qmd stands for Quarto markdown. It allows code and ordinary text to be interleaved to produce well-formatted reports including webpages. Right-click on the link and choose Save-As to download. You will be able to open the Qmd file in RStudio. Alternatively, View in Browser. Coding and thinking answers are marked with #---CODING ANSWER--- and #---THINKING ANSWER---
The workshop.qmd file is the file I use to compile the practical. Qmd stands for Quarto markdown. It allows code and ordinary text to be interleaved to produce well-formatted reports including webpages. Right-click on the link and choose Save-As to download. You will be able to open the Qmd file in RStudio. Alternatively, View in Browser. Coding and thinking answers are marked with #---CODING ANSWER--- and #---THINKING ANSWER---
-Fisher, Malcolm, Christina James-Zorn, Virgilio Ponferrada, Andrew J Bell, Nivitha Sundararaj, Erik Segerdell, Praneet Chaturvedi, et al. 2023. “Xenbase: Key Features and Resources of the Xenopus Model Organism Knowledgebase.”Genetics 224 (1): iyad018. https://doi.org/10.1093/genetics/iyad018.
-
-
-Galili, Tal, O’Callaghan, Alan, Sidi, Jonathan, Sievert, and Carson. 2017. “Heatmaply: An r Package for Creating Interactive Cluster Heatmaps for Online Publishing.”Bioinformatics. https://doi.org/10.1093/bioinformatics/btx657.
-
-
-Hester, Jim, Hadley Wickham, and Gábor Csárdi. 2023. “Fs: Cross-Platform File System Operations Based on ’Libuv’.”
-
R Core Team. 2024. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
@@ -1016,8 +906,14 @@
Workshop
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the tidyverse.”Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686.
+
+Xie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.
+
+
+———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
+
-Xie, Yihui. 2024. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.
+———. 2024. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.