diff --git a/blog/.github/workflows/publish.yml b/blog/.github/workflows/publish.yml new file mode 100644 index 0000000..e054371 --- /dev/null +++ b/blog/.github/workflows/publish.yml @@ -0,0 +1,25 @@ +on: + workflow_dispatch: + push: + branches: main + +name: Quarto Publish + +jobs: + build-deploy: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Quarto + uses: quarto-dev/quarto-actions/setup@v2 + + - name: Render and Publish + uses: quarto-dev/quarto-actions/publish@v2 + with: + target: gh-pages + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/blog/.gitignore b/blog/.gitignore new file mode 100644 index 0000000..3704144 --- /dev/null +++ b/blog/.gitignore @@ -0,0 +1,15 @@ +/.quarto/ +*.swp +~* +*~ +_site +.sass-cache +.jekyll-cache +.jekyll-metadata +vendor +_notebooks/.ipynb_checkpoints +# Local Netlify folder +.netlify +.tweet-cache +__pycache__ + diff --git a/blog/.nojekyll b/blog/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/blog/_quarto.yml b/blog/_quarto.yml new file mode 100644 index 0000000..00753b8 --- /dev/null +++ b/blog/_quarto.yml @@ -0,0 +1,19 @@ +project: + type: website + output-dir: docs + +website: + title: "OpenML Blog" + description: "Open machine learning blog" + navbar: + right: + - about.qmd + - icon: github + href: https://github.com/openml/blog +format: + html: + theme: cosmo + css: styles.css + + + diff --git a/blog/about.qmd b/blog/about.qmd new file mode 100644 index 0000000..1f9da82 --- /dev/null +++ b/blog/about.qmd @@ -0,0 +1,16 @@ +--- +title: "About" +image: openml-logo.png +about: + template: jolla + links: + - icon: github + text: Github + href: https://github.com/openml/blog + +--- + +# Welcome to the Open Machine Learning blog +This blog brings you stories about OpenML: why we want to streamline machine learning research, how you can use it, and what we are doing. +We are also open to [your stories](https://github.com/openml/blog#how-to-contribute) about anything related to open machine learning research, education, and applications. +Join the conversation :). \ No newline at end of file diff --git a/blog/docs/.nojekyll b/blog/docs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/blog/docs/about.html b/blog/docs/about.html new file mode 100644 index 0000000..442af4e --- /dev/null +++ b/blog/docs/about.html @@ -0,0 +1,556 @@ + + + + + + + + + +About – OpenML Blog + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+ +
+
+

About

+
+
+
+
+
+

Welcome to the Open Machine Learning blog

+

This blog brings you stories about OpenML: why we want to streamline machine learning research, how you can use it, and what we are doing. We are also open to your stories about anything related to open machine learning research, education, and applications. Join the conversation :).

+ + +
+
+
+ +
+ + +
+ + + + + \ No newline at end of file diff --git a/blog/docs/index.html b/blog/docs/index.html new file mode 100644 index 0000000..2eb4a96 --- /dev/null +++ b/blog/docs/index.html @@ -0,0 +1,953 @@ + + + + + + + + + +OpenML Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + \ No newline at end of file diff --git a/blog/docs/listings.json b/blog/docs/listings.json new file mode 100644 index 0000000..10a7220 --- /dev/null +++ b/blog/docs/listings.json @@ -0,0 +1,16 @@ +[ + { + "listing": "/index.html", + "items": [ + "/posts/Experiments-with-temperature/experiments_with_temp.html", + "/posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html", + "/posts/2020-05-06-Reproducible-deep-learning-with-OpenML/2020-05-06-Reproducible-deep-learning-with-OpenML.html", + "/posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/2020-03-23-Finding a-standard-dataset-format-for-machine-learning.html", + "/posts/2019-10-26-OpenML-Machine-Learning-as-a-community/2019-10-26-OpenML-Machine-Learning-as-a-community.html", + "/posts/2019-10-24-OpenML-workshop-at-Dagstuhl/2019-10-24-OpenML-workshop-at-Dagstuhl.html", + "/posts/2017-03-03-Basic-components-of-OpenML/2017-03-03-Basic-components-of-OpenML.html", + "/posts/2016-09-18-mlr-loves-OpenML/2016-09-18-mlr-loves-OpenML.html", + "/posts/2016-05-02-OpenML/2016-05-02-OpenML.html" + ] + } +] \ No newline at end of file diff --git a/blog/docs/openml-logo.png b/blog/docs/openml-logo.png new file mode 100644 index 0000000..904e91a Binary files /dev/null and b/blog/docs/openml-logo.png differ diff --git a/blog/docs/posts/2016-05-02-OpenML/2016-05-02-OpenML.html b/blog/docs/posts/2016-05-02-OpenML/2016-05-02-OpenML.html new file mode 100644 index 0000000..00fd0d4 --- /dev/null +++ b/blog/docs/posts/2016-05-02-OpenML/2016-05-02-OpenML.html @@ -0,0 +1,651 @@ + + + + + + + + + + + + +OpenML – OpenML Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+

OpenML

+
+
+ Introduction to OpenML +
+
+
+
OpenML
+
+
+
+ + +
+ +
+
Author
+
+

Heidi Seibold

+
+
+ +
+
Published
+
+

May 2, 2016

+
+
+ + +
+ + +
+ + + + +
+ + + + + +

OpenML is a very cool new online platform that aims at improving — as the name says — Open Machine Learning. It stands for Open Data, Open Algorithms and Open Research. OpenML is still in it’s beta phase, but already pretty awesome.

+

With this blog post I would like to introduce the main concepts, show who should be interested in the platform and I will go a little into a challenge it faces.

+
+

Concepts

+

The following four concepts form the basis of the platform:

+
    +
  • data

  • +
  • task

  • +
  • flow

  • +
  • run

  • +
+

The figure shows how they are connected.

+

+
+
+

Who can make use of OpenML?

+
+

The domain scientist

+

You have data that you do not know how to analyse best? Upload your data to OpenML and you will have the whole world helping you. Write a good data and task description to make sure people understand the problem.

+
+
+

The data analyst

+

You like taking part in challenges? Being the best solver of a task? Go to OpenML and check out the many tasks and go solve!

+
+
+

The algorithm developer

+

You developed a statistical method or a machine learning algorithm and want to try it out? You will find plenty of data sets and the possibility to make your algorithm public.

+
+
+

The student

+

You study statistics, data science, machine learning? You want to know what is out there? On OpenML you will find a wide variety of algorithms and, if the solvers do a good job, info on software and implementation.

+
+
+

The teacher

+

You teach a machine learning class and want the students to participate in a challenge? Make up your own task and let the students try solving it. The platform shows who uploaded what and when.

+
+
+

The unknown

+

There are possibly many other people who will benefit from the platform, like meta analysts, benchmarkers and people I can not think of right now.

+
+
+
+

How to use OpenML

+

Other than just browsing the website you can access OpenML through quite some interfaces such as R or WEKA. For an example on how to use the R interface check out the tutorial.

+

The whole project is of course open source. Check out the different git repositories for all the code and in case you have any complaints.

+
+
+

The overfitting problem

+

Platforms like kaggle, crowdanalytics and innocentive host challenges and give people only part of the data so they can evaluate the performance of the algorithm on a separate data set to (try to) prevent overfitting. So far OpenML does not do that. It always shows all the data, and algorithms are evaluated via resampling procedures (on OpenML called estimation procedures). There are big discussions about how to solve the problem of overfitting on OpenML. They go from keeping part of the data hidden for a certain time in the beginning to doing repeated cross-validation on the (overly) good performing flows on a given task. If you have ideas here, please don’t hesitate to leave me a comment.

+

The platform is still in it’s childhood and may not be perfect yet (If you find issues, post them on the github page). But I think it can grow to be a great thing one day.

+
+

Originally published at heidiseibold.github.io on May 2, 2016.

+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/blog/docs/posts/2016-05-02-OpenML/openml-logo.png b/blog/docs/posts/2016-05-02-OpenML/openml-logo.png new file mode 100644 index 0000000..904e91a Binary files /dev/null and b/blog/docs/posts/2016-05-02-OpenML/openml-logo.png differ diff --git a/blog/docs/posts/2016-09-18-mlr-loves-OpenML/2016-09-18-mlr-loves-OpenML.html b/blog/docs/posts/2016-09-18-mlr-loves-OpenML/2016-09-18-mlr-loves-OpenML.html new file mode 100644 index 0000000..705bfdf --- /dev/null +++ b/blog/docs/posts/2016-09-18-mlr-loves-OpenML/2016-09-18-mlr-loves-OpenML.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + +mlr loves OpenML – OpenML Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+

mlr loves OpenML

+
+
+ OpenML with mlr +
+
+
+
OpenML
+
mlr
+
R
+
+
+
+ + +
+ +
+
Author
+
+

Heidi Seibold

+
+
+ +
+
Published
+
+

September 18, 2016

+
+
+ + +
+ + +
+ + + + +
+ + + + + +

OpenML stands for Open Machine Learning and is an online platform, which aims at supporting collaborative machine learning online. It is an Open Science project that allows its users to share data, code and machine learning experiments.

+

At the time of writing this blog post I am in Eindhoven at an OpenML workshop, where developers and scientists meet to work on improving the project. Some of these people are R users and they (we) are developing an R package that communicates with the OpenML platform.

+

+
+

OpenML in R

+

The OpenML R package can list and download data sets and machine learning tasks (prediction challenges). In R one can run algorithms on the these data sets/tasks and then upload the results to OpenML. After successful uploading, the website shows how well the algorithm performs. To run the algorithm on a given task the OpenML R package builds on the mlr package. mlr understands what a task is and can run learners on that task. So all the OpenML package needs to do is convert the OpenML objects to objects mlr understands and then mlr deals with the learning.

+
+
+

A small case study

+

We want to create a little study on the OpenML website, in which we compare different types of Support Vector Machines. The study gets an ID assigned to it, which in our case is 27. We use the function ksvm (with different settings of the function argument type) from package kernlab, which is integrated in mlr (“classif.ksvm”).

+

+

For details on installing and setting up the OpenML R package please see the guide on GitHub.

+

Let’s start conducting the study:

+
    +
  • Load the packages and list all tasks which have between 100 and 500 observations.
  • +
+
library("OpenML") library("mlr") library("farff") library("BBmisc")
+
+dsize = c(100, 500) taskinfo_all = listOMLTasks(number.of.instances = dsize)
+
    +
  • Select all supervised classification tasks that do 10-fold cross-validation and choose only one task per data set. To keep the study simple and fast to compute, select only the first three tasks.
  • +
+
taskinfo_10cv = subset(taskinfo_all,
+     task.type == "Supervised Classification" &
+     estimation.procedure == "10-fold Crossvalidation" &
+     evaluation.measures == "predictive_accuracy" &
+     number.of.missing.values == 0 &
+     number.of.classes %in% c(2, 4))
+
+taskinfo = taskinfo_10cv[1:3, ]
+
    +
  • Create the learners we want to compare.
  • +
+
lrn.list = list(
+   makeLearner("classif.ksvm", type = "C-svc"),
+   makeLearner("classif.ksvm", type = "kbb-svc"),
+   makeLearner("classif.ksvm", type = "spoc-svc")
+)
+
    +
  • Run the learners on the three tasks.
  • +
+
grid = expand.grid(task.id = taskinfo$task.id,
+                   lrn.ind = seq_along(lrn.list))
+
+runs = lapply(seq_row(grid), function(i) {
+  message(i)
+  task = getOMLTask(grid$task.id[i])
+  ind = grid$lrn.ind[i]
+  runTaskMlr(task, lrn.list[[ind]])
+})
+
    +
  • And finally upload the runs to OpenML. The upload function (uploadOMLRun) returns the ID of the uploaded run object. When uploading runs that are part of a certain study, tag it with study_ and the study ID. After uploading the runs appear on the website and can be found using the tag or via the study homepage.
  • +
+
## please do not spam the OpenML server by uploading these
+## tasks. I already did that.
+run.id = lapply(runs, uploadOMLRun, tags = "study_27")
+
    +
  • To show the results of our study, list the run evaluations and make a nice plot.
  • +
+
evals = listOMLRunEvaluations(tag = "study_27")
+
+evals$task.id = as.factor(evals$task.id)
+evals$setup.id = as.factor(evals$setup.id)
+
+library("ggplot2")
+ggplot(evals, aes(x = setup.id, y = predictive.accuracy,
+                  color = data.name, group = task.id)) +
+  geom_point() + geom_line()
+

+

Now you can go ahead and create a bigger study using the techniques you have learned.

+
+
+

Further infos

+

If you are interested in more, check out the OpenML blog, the paper and the GitHub repos.

+
+

Originally published at mlr-org.github.io.

+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/blog/docs/posts/2016-09-18-mlr-loves-OpenML/mlropenml.png b/blog/docs/posts/2016-09-18-mlr-loves-OpenML/mlropenml.png new file mode 100644 index 0000000..71a8ee7 Binary files /dev/null and b/blog/docs/posts/2016-09-18-mlr-loves-OpenML/mlropenml.png differ diff --git a/blog/docs/posts/2017-03-03-Basic-components-of-OpenML/2017-03-03-Basic-components-of-OpenML.html b/blog/docs/posts/2017-03-03-Basic-components-of-OpenML/2017-03-03-Basic-components-of-OpenML.html new file mode 100644 index 0000000..9d389bc --- /dev/null +++ b/blog/docs/posts/2017-03-03-Basic-components-of-OpenML/2017-03-03-Basic-components-of-OpenML.html @@ -0,0 +1,647 @@ + + + + + + + + + + + + +Basic components of OpenML – OpenML Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+

Basic components of OpenML

+
+
+ Understanding the building blocks of OpenML +
+
+
+
OpenML
+
+
+
+ + +
+ +
+
Author
+
+

Jan van Rijn

+
+
+ +
+
Published
+
+

March 3, 2017

+
+
+ + +
+ + +
+ + + + +
+ + + + + +

During my PhD, we developed OpenML, an online experiment database for Machine Learning. Researchers are encouraged to upload their experimental results on it, so that these can be reused by anyone. Various high level papers have been published that overview the design goals, benefits and opportunities (for example, at ECML/PKDD 2013, SIGKDD Explorations and JLMR). However, there is no clear overview of the basic components upon which the platform is build. In this blog post I will review these, and discuss some best practises.

+
+

Data

+

One of the core components of OpenML are datasets. People can upload their datasets, and the system automatically organises these on line. An example of a dataset is the well-known Iris dataset. It shows all features, once of these is identified as the ‘default target attribute’, although this concept is flexible. It also shows some automatically computed data qualities (or, meta-features). Each dataset has it’s own unique ID. Information about the dataset, the data features and the data qualities can be obtained automatically by means of the following API functions:

+ +
+
+

Task types and tasks

+

A dataset alone does not constitute a scientific task. We must first agree on what types of results are expected to be shared. This is expressed in task types: they define what types of inputs are given, which types of output are expected to be returned, and what protocols should be used. For instance, classification tasks should include well-defined cross-validation procedures, labelled input data, and require predictions as outputs. The collection of all this information together is called a task. The Iris dataset has various tasks defined on it, for example this one. Although the web-interface does not show it, this task formally describes the target attribute that should be modelled (in this case the same as the default target attribute of the dataset, but this is flexible), the quality estimation procedure (10-fold cross-validation), the evaluation measure (predictive accuracy) and the cross-validation folds. Useful API operations include:

+ +

Currently, there are a wide range of task types defined on OpenML, including classification, regression, on line learning, clustering and subgroup discovery. Although this set can be extended, this is currently not a supported API operation (meaning that we will add them by hand). If you interested in task types that are currently not supported, please contact us.

+
+
+

Flows

+

Tasks can be ‘solved’ by classifiers (or algorithms, workflows, flows). OpenML stores references to these flows. It is important to stress that flows are actually ran on the computer of the user, only meta-information about the flow is stored on OpenML. This information includes basic trivialities such as the creator, toolbox and compilation instructions, but also more formal description about hyper parameter. A flow can also contain subflows, for example, the flow Bagging can have a subflow ‘Decision Tree’ which would make the flow ‘Bagging of Decision Trees’. A flow is distinguished by it’s name and ‘external version’, which are both provided by the uploader. When uploading a flow, it is important to think about a good naming convention for the both, for example, the git commit number could be used as external version, as this uniquely identifies a state of the code. Ideally, when two persons are using the same flow, they will use the same name and external version, so that results of the flows can be compared across tasks. (This is ensured when using the toolboxed in which OpenML is integrated, such as Weka, Scikit Learn and MLR). Useful API functions are:

+ +
+
+

Runs

+

Whenever a flow executes a task, this is called a run. The existence of runs is actually the main contribution of OpenML. Some experiments take weeks to complete, and having the results stored on OpenML helps other researchers resuse the experiments. The task description specifies which information should be uploaded in order to have a valid run, in most cases, for each cross-validation fold the predictions on the test set. This allows OpenML to calculate basic evaluation measures, such as predictive accuracy, ROC curves and many more. Also information about the flow and hyper parameter settings should be provided. Some useful API functions:

+ +

Usually, the result is in some XML or JSON format (depending on the preference of the user), linking together various task ids, flow ids, etc. In order for this to become meaningful, the user needs to perform other API tasks to get information about what flows were executed, what tasks and datasets were used, etc. Details about this will be provided in another post.

+
+
+

Setups

+

Every run that is executed by a flow, contains information about the hyper parameter settings of the flow. A setup is the combination of all parameter settings of a given flow. OpenML internally links the result of a given run to a setup id. This way, experiments can be done across hyper parameter settings. For example,

+ +

As setups constitute a complex concept, most of the operations concerning setups are hidden from the user. Hence, not all setup functions are properly documented yet. A later blogpost will detail on these.

+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/blog/docs/posts/2019-10-24-OpenML-workshop-at-Dagstuhl/2019-10-24-OpenML-workshop-at-Dagstuhl.html b/blog/docs/posts/2019-10-24-OpenML-workshop-at-Dagstuhl/2019-10-24-OpenML-workshop-at-Dagstuhl.html new file mode 100644 index 0000000..71fde3a --- /dev/null +++ b/blog/docs/posts/2019-10-24-OpenML-workshop-at-Dagstuhl/2019-10-24-OpenML-workshop-at-Dagstuhl.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + +OpenML workshop at Dagstuhl – OpenML Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+

OpenML workshop at Dagstuhl

+
+
+ OpenML workshop at Dagstuhl +
+
+
+
OpenML
+
+
+
+ + +
+ +
+
Author
+
+

Heidi Seibold

+
+
+ +
+
Published
+
+

October 24, 2019

+
+
+ + +
+ + +
+ + + + +
+ + + + + +

October 2019

+

Twice a year the OpenML community meets for a workshop/hackathon/unconference. We improve the platform, discuss and learn for 5 days. If that sounds interesting to you, get in touch or follow updates on meet.openml.org.

+

This time the workshop took place at Dagstuhl, a great place for Seminars.

+

+
+
+

+
Group pictures
+
+
+

We had several breakouts where workshop attendees can join to learn, discuss and progress OpenML. In the following we discuss some of the topics we touched.

+

Science projects

+

Brainstorm on scientific projects to do with OpenML. Prioritize impactful, well-defined research ideas. We came up with quite a long list of very promising research questions that should actually be quite easy to answer based on OpenML. Many of these are along the lines of empirically providing evidence to verify or bust commonly-held beliefs in the community. Frank would gladly hire a strong postdoc (or quite independent PhD student) and maybe a research engineer, to work on these scientific questions under the umbrella of “evidence-based machine learning with OpenML”.

+

Benchmarking using OpenML

+

Define guidelines on how to define world-class benchmarks and how to run them.

+

Diverse datasets

+

New and more diverse datasets.

+

Dataset quality

+

How to measure data quality and how to improve the quality of datasets on OpenML.

+

OpenML use cases for novices

+

Shortlist common use cases and start writing accessible blog posts for novice users. If you are a OpenML newbie we need your help with this topic.

+

The output of this breakout will be at least one blog post. Keep an eye out for them here :)

+

Running a competition using OpenML

+

We assessed the current issues with running in-class competitions for teaching purposes using OpenML (biggest one: easy use for non-developers) and brainstormed on a new competition format with related competitions, one for each component of a solution, such as HPO, creating good meta-features, creating a good search space, etc.

+

Planning future workshops

+

Decide on location and timing for the next couple of workshops. The next OpenML workshop will be in Spring (week of March 30th or week of April 14th) close to Munich. For updates check http://meet.openml.org. The workshop will be cohosted with some other Open Source Machine Learning projects.

+

Furthermore a workshop in Austin is being planned for next summer and a datathon is in planning. We are planning to organize dev sprints at various PyCons next year.

+

New frontend

+

Feedback session on new frontend, Additional visualization for datasets

+

Future of client APIs

+

Currently, a lot of resources are bound developing different client APIs, such as the Python API, R API and Java API. We discussed how we can better share work and code between the different APIs and the server. For now we are working on automatically generating the Swagger API documentation from the PHP function documentation, which in turn will allow us to generate (documented) parts of the APIs, reduce the need for maintenance and will help to spread updates on the API faster.

+

Flow 2.0 design

+

Current flow design used in OpenML was inspired by Weka, but through time many limitations have been identified, primarily that existing flow does not allow duplicate use of same component and that it cannot express DAG-based ML programs. We started working on a new specification building on insights from mlr3 and d3m projects, centered around DAG representation. Current plan is to prepare a draft specification and implement prototype converters between other systems and this new specification. Once we do that we will re-evaluate the amount of work it took to build those prototypes and how well the specification satisfied those other systems.

+

Random Bot

+

The LRZ in Munich provided us with CPU time during the SuperMUC-NG supercomputer test phase, which we used to perform experiments of popular machine learning algorithms with random hyperparameter configurations. This resulted in millions of data points on more than a hundred datasets that we will analyse and publish. The data can be used to learn about typical behaviour of different learners across different datasets, and to construct surrogate models for tuning algorithm benchmarks.

+

AutoML Benchmark (Janek)

+

A study was created containing 76 binary and multiclass tasks of reasonable difficulty.

+

These can be used as a more difficult version of OpenML-100 or in amlb a platform for reproducible benchmarking of AutoML systems.

+

R API

+

Short session on how the R api will (need to) change. The main issue discussed was that the OpenML R package runs with mlr and breaks when the new package (mlr3) is loaded. We will update the current OpenML R package to work with mlr3. At the same time we are thinking about a vision for a rewrite of the OpenML R package.

+

Python API

+

We made a lot of improvements to the Python API over the week, with over 20 PRs merged! We’ve added more examples on how to use the package, fixed bugs, improved documentation and refactored code. In the coming days we’re going to make all these improvements available in a new PyPI release. For those looking for a higher level overview of the package, we will publish a paper next week which highlights use-cases, its software design, and project structure.

+

Benchmarking paper

+

We are working on a comprehensive paper using sklearn, mlr and WEKA, which should demonstrate how OpenML can be used for proper benchmarking and analysis.

+

Guidelines / Overfitting / Comparable Metalearning

+

There are plans for writing a guidelines and pitfalls paper on benchmarking, meta-overfitting and statistical analysis of results on OpenML.

+

Data Formats

+

Currently OpenML supports only tabular data in ARFF data format. This is very limiting for many ML tasks. We discussed and explored other data formats we could use as the future next data format. We will post a separate blog post about our process and insights.

+

Funding

+

OpenML is looking for funding (developers). New ideas on obtaining funding are very welcome. We discussed some ideas: American funding (we need a collaboration partner); ALICE / CLAIRE; Companies. We are a foundation now, which might make it easier.

+

Some of the PIs (in particular Bernd Bischl, Frank Hutter and Dawn Song) in the project offer positions with a mix of ML research and development. Contact them if you are interested!

+

+
+
+

+
Sketch of the OpenML infrastructure (left), Breakout overview of Tuesday (right)
+
+
+

We had some talks at the workshop as well:

+ +

… and lots of fun…

+
+
+

+
On the hike
+
+
+

Wanna join the OpenML community? Get in touch!

+ + + +
+ +
+ + + + + \ No newline at end of file diff --git a/blog/docs/posts/2019-10-24-OpenML-workshop-at-Dagstuhl/dagstuhl.jpeg b/blog/docs/posts/2019-10-24-OpenML-workshop-at-Dagstuhl/dagstuhl.jpeg new file mode 100644 index 0000000..daed7e1 Binary files /dev/null and b/blog/docs/posts/2019-10-24-OpenML-workshop-at-Dagstuhl/dagstuhl.jpeg differ diff --git a/blog/docs/posts/2019-10-26-OpenML-Machine-Learning-as-a-community/2019-10-26-OpenML-Machine-Learning-as-a-community.html b/blog/docs/posts/2019-10-26-OpenML-Machine-Learning-as-a-community/2019-10-26-OpenML-Machine-Learning-as-a-community.html new file mode 100644 index 0000000..029164a --- /dev/null +++ b/blog/docs/posts/2019-10-26-OpenML-Machine-Learning-as-a-community/2019-10-26-OpenML-Machine-Learning-as-a-community.html @@ -0,0 +1,2232 @@ + + + + + + + + + + + + +OpenML - Machine Learning as a community – OpenML Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+

OpenML - Machine Learning as a community

+
+
+ A description of how OpenML fits into traditional ML practices +
+
+
+
OpenML
+
+
+
+ + +
+ +
+
Author
+
+

Neeratyoy Mallik

+
+
+ +
+
Published
+
+

October 26, 2019

+
+
+ + +
+ + +
+ + + + +
+ + + + + +

OpenML is an online Machine Learning (ML) experiments database accessible to everyone for free. The core idea is to have a single repository of datasets and results of ML experiments on them. Despite having gained a lot of popularity in recent years, with a plethora of tools now available, the numerous ML experimentations continue to happen in silos and not necessarily as one whole shared community. In this post, we shall try to get a brief glimpse of what OpenML offers and how it can fit our current Machine Learning practices.

+

Let us jump straight at getting our hands dirty by building a simple machine learning model. If it is simplicity we are looking for, it has to be the Iris dataset that we shall work with. In the example script below, we are going to load the Iris dataset available with scikit-learn, use 10-fold cross-validation to evaluate a Random Forest of 10 trees. Sounds trivial enough and is indeed less than 10 lines of code.

+
+
from sklearn import datasets
+from sklearn.svm import SVC
+from sklearn.ensemble import RandomForestClassifier
+from sklearn.model_selection import cross_val_score
+
+
+
# Loading Iris dataset
+X, y = datasets.load_iris(return_X_y=True)
+print(X.shape, y.shape)
+
+
(150, 4) (150,)
+
+
+
+
# Initializing a Random Forest with 
+# arbitrary hyperparameters
+# max_depth kept as 2 since Iris has
+# only 4 features
+clf = RandomForestClassifier(n_estimators=10, max_depth=2)
+
+
+
scores = cross_val_score(clf, X, y, cv=5, scoring='accuracy')
+print("Mean score : {:.5f}".format(scores.mean()))
+
+
Mean score : 0.94000
+
+
+

A simple script and we achieve a mean accuracy of 95.33%. That was easy. It is really amazing how far we have come with ML tools that make it easy to get started. As a result, we have hundreds of thousands of people working with these tools every day. That inevitably leads to the reinvention of the wheel. The tasks that each individual ML practitioner performs often have significant overlaps and can be omitted by reusing what someone from the community has done already. At the end of the day, we didn’t build a Random Forest model all the way from scratch. We gladly reused code written by generous folks from the community. The special attribute of our species is the ability to work as a collective wherein our combined intellect becomes larger than the individual sum of parts. Why not do the same for ML? I mean, can I see what other ML practitioners have done to get better scores on the Iris dataset?

+

Answering this is one of the targets of this post. We shall subsequently explore if this can be done, with the help of OpenML. However, first, we shall briefly familiarize ourselves with few terminologies and see how we can split the earlier example we saw into modular components.

+
+

OpenML Components

+

+

Image source: https://medium.com/open-machine-learning/openml-1e0d43f0ae13

+

Dataset: OpenML houses over 2k+ active datasets for various regression, classification, clustering, survival analysis, stream processing tasks and more. Any user can upload a dataset. Once uploaded, the server computes certain meta-features on the dataset - Number of classes, Number of missing values, Number of features, etc. With respect to our earlier example, the following line is the equivalent of fetching a dataset from OpenML.

+
+
X, y = datasets.load_iris(return_X_y=True)
+
+

Task: A task is linked to a specific dataset, defining what the target/dependent variable is. Also specifies evaluation measures such as - accuracy, precision, area under curve, etc. or the kind of estimation procedure to be used such as - 10-fold cross-validation, n% holdout set, etc. With respect to our earlier example, the parameters to the following function call capture the idea of a task.

+
+
scores = cross_val_score(clf, X, y, cv=5, scoring='accuracy')
+
+

Flow: Describes the kind of modelling to be performed. It could be a flow or a series of steps, i.e., a scikit-learn pipeline. For now, we have used a simple Random Forest model which is the flow component here.

+
+
clf = RandomForestClassifier(n_estimators=10, max_depth=2)
+
+

Run: Pairs a flow and task together which results in a run. The run has the predictions which are turned into evaluations by the server. This is effectively captured by the execution of the line:

+
+
scores = cross_val_score(clf, X, y, cv=5, scoring='accuracy')
+
+

Now, this may appear a little obfuscating given that we are trying to compartmentalize a simple 10-line code which works just fine. However, if we take a few seconds to go through the 4 components explained above, we can see that it makes our training of a Random Forest on Iris a series of modular tasks. Modules are such a fundamental concept in Computer Science. They are like Lego blocks. Once we have modules, it means we can plug and play at ease. The code snippet below attempts to rewrite the earlier example using the ideas of the OpenML components described, to give a glimpse of what we can potentially gain during experimentations.

+
+
from sklearn import datasets
+from sklearn.svm import SVC
+from sklearn.ensemble import RandomForestClassifier
+from sklearn.model_selection import cross_val_score
+
+
+

DATASET component

+
+
# To load IRIS dataset as a dataset module/component
+def dataset():
+    X, y = datasets.load_iris(return_X_y=True)
+    return X, y
+
+
+
+

TASK component

+
+
# Tasks here define the number of cross-validation folds
+# and the scoring metric to be used for evaluation
+def task_1(f):
+    X, y = dataset()  # loads IRIS
+    return cross_val_score(f, X, y, cv=5, 
+                           scoring='accuracy')
+
+def task_2(f):
+    X, y = dataset()  # loads IRIS
+    return cross_val_score(f, X, y, cv=15, 
+                           scoring='balanced_accuracy')
+
+
+
+

FLOW component

+
+
# Flows determine the modelling technique to be applied
+# Helps define a model irrespective of dataset or tasks
+def flow_1():
+    clf = RandomForestClassifier(n_estimators=10, max_depth=2)
+    return clf
+
+def flow_2():
+    clf = SVC(gamma='auto', kernel='linear')
+    return clf 
+
+
+
+

RUN component

+
+
# Runs essentially evaluates a task-flow pairing 
+# and therefore in effect executs the modelling 
+# of a dataset as per the task task definition
+def run(task, flow):
+    return task(flow)
+
+
+
# Results for Random Forest
+rf_task_1 = run(task_1, flow_1())
+rf_task_2 = run(task_2, flow_1())
+print("RF using task 1: {:<.5}; task 2: {:<.5}".format(rf_task_1.mean(), rf_task_2.mean()))
+
+# Results for SVM
+svm_task_1 = run(task_1, flow_2())
+svm_task_2 = run(task_2, flow_2())
+print("SVM using task 1: {:<.5}; task 2: {:<.5}".format(svm_task_1.mean(), svm_task_2.mean()))
+
+
RF using task 1: 0.95333; task 2: 0.94444
+SVM using task 1: 0.98; task 2: 0.97222
+
+
+

We can, therefore, compose various different tasks, flows, which are independent operations. Runs can then pair any such task and flow to construct an ML workflow and return the evaluated scores. This approach can help us define such components one-time, and we can extend this for any combination of a dataset, model, and for any number of evaluations in the future. Imagine if the entire ML community defines such tasks and various simple to complicated flows that they use in their daily practice. We can build custom working ML pipeline and even get to compare performances of our techniques on the same task with others! OpenML aims exactly for that. In the next section of this post, we shall scratch the surface of OpenML to see if we can actually do with OpenML what it promises.

+
+
+
+

Using OpenML

+

OpenML-Python can be installed using pip or by cloning the git repo and installing the current development version. So shall we then install OpenML? ;) It will be beneficial if the code snippets are tried out as this post is read. A consolidated Jupyter notebook with all the code can be found here.

+

Now that we have OpenML, let us jump straight into figuring out how we can get the Iris dataset from there. We can always browse theOpenML website and search for Iris. That is the easy route. Let us get familiar with the programmatic approach and learn how to fish instead. The OpenML-Python API can be found here.

+
+

Retrieving Iris from OpenML

+

In the example below, we will list out all possible datasets available in OpenML. We can choose the output format. I’ll go with dataframe so that we obtain a pandas DataFrame and can get a neat tabular representation to search and sort specific entries.

+
+
import openml
+
+import numpy as np
+import pandas as pd
+
+
+
# Fetching the list of all available datasets on OpenML
+d = openml.datasets.list_datasets(output_format='dataframe')
+print(d.shape)
+
+# Listing column names or attributes that OpenML offers
+for name in d.columns:
+    print(name)
+
+
(3073, 16)
+did
+name
+version
+uploader
+status
+format
+MajorityClassSize
+MaxNominalAttDistinctValues
+MinorityClassSize
+NumberOfClasses
+NumberOfFeatures
+NumberOfInstances
+NumberOfInstancesWithMissingValues
+NumberOfMissingValues
+NumberOfNumericFeatures
+NumberOfSymbolicFeatures
+
+
+
+
print(d.head())
+
+
   did        name  version uploader  status format  MajorityClassSize  \
+2    2      anneal        1        1  active   ARFF              684.0   
+3    3    kr-vs-kp        1        1  active   ARFF             1669.0   
+4    4       labor        1        1  active   ARFF               37.0   
+5    5  arrhythmia        1        1  active   ARFF              245.0   
+6    6      letter        1        1  active   ARFF              813.0   
+
+   MaxNominalAttDistinctValues  MinorityClassSize  NumberOfClasses  \
+2                          7.0                8.0              5.0   
+3                          3.0             1527.0              2.0   
+4                          3.0               20.0              2.0   
+5                         13.0                2.0             13.0   
+6                         26.0              734.0             26.0   
+
+   NumberOfFeatures  NumberOfInstances  NumberOfInstancesWithMissingValues  \
+2              39.0              898.0                               898.0   
+3              37.0             3196.0                                 0.0   
+4              17.0               57.0                                56.0   
+5             280.0              452.0                               384.0   
+6              17.0            20000.0                                 0.0   
+
+   NumberOfMissingValues  NumberOfNumericFeatures  NumberOfSymbolicFeatures  
+2                22175.0                      6.0                      33.0  
+3                    0.0                      0.0                      37.0  
+4                  326.0                      8.0                       9.0  
+5                  408.0                    206.0                      74.0  
+6                    0.0                     16.0                       1.0  
+
+
+

The column names indicate that they contain the meta-information about each of the datasets, and at this instance, we have access to 2958 datasets as indicated by the shape of the dataframe. We shall try searching for ‘iris’ in the column name and also use the version column to sort the results.

+
+
# Filtering dataset list to have 'iris' in the 'name' column
+# then sorting the list based on the 'version'
+d[d['name'].str.contains('iris')].sort_values(by='version').head()
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
didnameversionuploaderstatusformatMajorityClassSizeMaxNominalAttDistinctValuesMinorityClassSizeNumberOfClassesNumberOfFeaturesNumberOfInstancesNumberOfInstancesWithMissingValuesNumberOfMissingValuesNumberOfNumericFeaturesNumberOfSymbolicFeatures
6161iris11activeARFF50.03.050.03.05.0150.00.00.04.01.0
4195041950iris_test_upload14030activeARFF50.03.050.03.05.0150.00.00.04.01.0
4226142261iris-example1348activeARFF50.0NaN50.03.05.0150.00.00.04.01.0
451451irish12activeARFF278.010.0222.02.06.0500.032.032.02.04.0
969969iris32activeARFF100.02.050.02.05.0150.00.00.04.01.0
+ +
+
+
+

Okay, so the iris dataset with the version as 1 has an ID of 61. For verification, we can check the website for dataset ID 61. We can see that it is the original Iris dataset which is of interest to us - 3 classes of 50 instances, with 4 numeric features. However, we shall retrieve the same information, as promised, programmatically.

+
+
iris = openml.datasets.get_dataset(61)
+iris
+
+
OpenML Dataset
+==============
+Name..........: iris
+Version.......: 1
+Format........: ARFF
+Upload Date...: 2014-04-06 23:23:39
+Licence.......: Public
+Download URL..: https://www.openml.org/data/v1/download/61/iris.arff
+OpenML URL....: https://www.openml.org/d/61
+# of features.: 5
+# of instances: 150
+
+
+
+
iris.features
+
+
{0: [0 - sepallength (numeric)],
+ 1: [1 - sepalwidth (numeric)],
+ 2: [2 - petallength (numeric)],
+ 3: [3 - petalwidth (numeric)],
+ 4: [4 - class (nominal)]}
+
+
+
+
print(iris.description)
+
+
**Author**: R.A. Fisher  
+**Source**: [UCI](https://archive.ics.uci.edu/ml/datasets/Iris) - 1936 - Donated by Michael Marshall  
+**Please cite**:   
+
+**Iris Plants Database**  
+This is perhaps the best known database to be found in the pattern recognition literature.  Fisher's paper is a classic in the field and is referenced frequently to this day.  (See Duda & Hart, for example.)  The data set contains 3 classes of 50 instances each, where each class refers to a type of iris plant.  One class is     linearly separable from the other 2; the latter are NOT linearly separable from each other.
+
+Predicted attribute: class of iris plant.  
+This is an exceedingly simple domain.  
+ 
+### Attribute Information:
+    1. sepal length in cm
+    2. sepal width in cm
+    3. petal length in cm
+    4. petal width in cm
+    5. class: 
+       -- Iris Setosa
+       -- Iris Versicolour
+       -- Iris Virginica
+
+
+

With the appropriate dataset available, let us briefly go back to the terminologies we discussed earlier. We have only used the dataset component so far. The dataset component is closely tied with the task component. To reiterate, the task would describe how the dataset will be used.

+
+
+

Retrieving relevant tasks from OpenML

+

We shall firstly list all available tasks that work with the Iris dataset. However, we are only treating Iris as a supervised classification problem and hence will filter accordingly. Following which, we will collect only the task IDs of the tasks relevant to us.

+
+
df = openml.tasks.list_tasks(data_id=61, output_format='dataframe')
+df.head()
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
tidttiddidnametask_typestatusestimation_procedureevaluation_measuressource_datatarget_feature...NumberOfFeaturesNumberOfInstancesNumberOfInstancesWithMissingValuesNumberOfMissingValuesNumberOfNumericFeaturesNumberOfSymbolicFeaturesnumber_samplescost_matrixquality_measuretarget_value
5959161irisSupervised Classificationactive10-fold Crossvalidationpredictive_accuracy61class...51500041NaNNaNNaNNaN
118118361irisLearning Curveactive10 times 10-fold Learning Curvepredictive_accuracy61class...515000414NaNNaNNaN
289289161irisSupervised Classificationactive33% Holdout setpredictive_accuracy61class...51500041NaNNaNNaNNaN
17581758361irisLearning Curveactive10-fold Learning Curvepredictive_accuracy61class...515000414NaNNaNNaN
18231823161irisSupervised Classificationactive5 times 2-fold Crossvalidationpredictive_accuracy61class...51500041NaNNaNNaNNaN
+ +

5 rows × 24 columns

+
+
+
+
+
# Filtering only the Supervised Classification tasks on Iris
+df.query("task_type=='Supervised Classification'").head()
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
tidttiddidnametask_typestatusestimation_procedureevaluation_measuressource_datatarget_feature...NumberOfFeaturesNumberOfInstancesNumberOfInstancesWithMissingValuesNumberOfMissingValuesNumberOfNumericFeaturesNumberOfSymbolicFeaturesnumber_samplescost_matrixquality_measuretarget_value
5959161irisSupervised Classificationactive10-fold Crossvalidationpredictive_accuracy61class...51500041NaNNaNNaNNaN
289289161irisSupervised Classificationactive33% Holdout setpredictive_accuracy61class...51500041NaNNaNNaNNaN
18231823161irisSupervised Classificationactive5 times 2-fold Crossvalidationpredictive_accuracy61class...51500041NaNNaNNaNNaN
19391939161irisSupervised Classificationactive10 times 10-fold Crossvalidationpredictive_accuracy61class...51500041NaNNaNNaNNaN
19921992161irisSupervised ClassificationactiveLeave one outpredictive_accuracy61class...51500041NaNNaNNaNNaN
+ +

5 rows × 24 columns

+
+
+
+
+
# Collecting all relevant task_ids
+tasks = df.query("task_type=='Supervised Classification'")['tid'].to_numpy()
+print(len(tasks))
+
+
13
+
+
+

That settles the task component too. Notice how for one dataset (61), we obtain 11 task IDs which are of interest to us. This should illustrate the one-to-many relationship that dataset-task components can have. We have 2 more components to explore - flows, runs. We could list out all possible flows and filter out the ones we want, i.e., Random Forest. However, let us instead fetch all the evaluations made on the Iris dataset using the 11 tasks we collected above.

+

We shall subsequently work with the scikit-learn based task which has been uploaded/used the most. We shall then further filter out the list of evaluations from the selected task (task_id=59 in this case), depending on if Random Forest was used.

+
+
# Listing all evaluations made on the 11 tasks collected above
+# with evaluation metric as 'predictive_accuracy'
+task_df = openml.evaluations.list_evaluations(function='predictive_accuracy', task=tasks, output_format='dataframe')
+task_df.head()
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
run_idtask_idsetup_idflow_idflow_namedata_iddata_namefunctionupload_timeuploaderuploader_namevaluevaluesarray_data
081591267weka.BayesNet_K2(1)61irispredictive_accuracy2014-04-07 00:05:111janvanrijn@gmail.com0.940000NoneNone
1161591370weka.SMO_PolyKernel(1)61irispredictive_accuracy2014-04-07 00:55:321janvanrijn@gmail.com0.960000NoneNone
223459156weka.ZeroR(1)61irispredictive_accuracy2014-04-07 01:33:241janvanrijn@gmail.com0.333333NoneNone
344759661weka.REPTree(1)61irispredictive_accuracy2014-04-07 06:26:271janvanrijn@gmail.com0.926667NoneNone
4473591877weka.LogitBoost_DecisionStump(1)61irispredictive_accuracy2014-04-07 06:39:271janvanrijn@gmail.com0.946667NoneNone
+ +
+
+
+
+
# Filtering based on sklearn (scikit-learn)
+task_df = task_df[task_df['flow_name'].str.contains("sklearn")]
+task_df.head()
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
run_idtask_idsetup_idflow_idflow_namedata_iddata_namefunctionupload_timeuploaderuploader_namevaluevaluesarray_data
144184904359290155500sklearn.ensemble.forest.RandomForestClassifier...61irispredictive_accuracy2017-03-03 17:10:121janvanrijn@gmail.com0.946667NoneNone
145185340959309505873sklearn.pipeline.Pipeline(Imputer=openml.utils...61irispredictive_accuracy2017-03-21 22:08:011janvanrijn@gmail.com0.960000NoneNone
14661301265941636337108sklearn.model_selection._search.RandomizedSear...61irispredictive_accuracy2017-08-21 11:07:401janvanrijn@gmail.com0.960000NoneNone
14761301285941636347108sklearn.model_selection._search.RandomizedSear...61irispredictive_accuracy2017-08-21 11:08:061janvanrijn@gmail.com0.946667NoneNone
14867153835947472897117sklearn.model_selection._search.RandomizedSear...61irispredictive_accuracy2017-09-01 02:56:441janvanrijn@gmail.com0.960000NoneNone
+ +
+
+
+
+
# Counting frequency of the different tasks used to
+# solve Iris as a supervised classification using scikit-learn
+task_df['task_id'].value_counts()
+
+
59       1985
+10107      25
+289         1
+Name: task_id, dtype: int64
+
+
+
+
# Retrieving the most used task
+t = openml.tasks.get_task(59)
+t
+
+
OpenML Classification Task
+==========================
+Task Type Description: https://www.openml.org/tt/1
+Task ID..............: 59
+Task URL.............: https://www.openml.org/t/59
+Estimation Procedure.: crossvalidation
+Evaluation Measure...: predictive_accuracy
+Target Feature.......: class
+# of Classes.........: 3
+Cost Matrix..........: Available
+
+
+
+
# Filtering for only task_id=59
+task_df = task_df.query("task_id==59")
+
+
+
# Filtering based on Random Forest
+task_rf =  task_df[task_df['flow_name'].str.contains("RandomForest")]
+task_rf.head()
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
run_idtask_idsetup_idflow_idflow_namedata_iddata_namefunctionupload_timeuploaderuploader_namevaluevaluesarray_data
144184904359290155500sklearn.ensemble.forest.RandomForestClassifier...61irispredictive_accuracy2017-03-03 17:10:121janvanrijn@gmail.com0.946667NoneNone
145185340959309505873sklearn.pipeline.Pipeline(Imputer=openml.utils...61irispredictive_accuracy2017-03-21 22:08:011janvanrijn@gmail.com0.960000NoneNone
14661301265941636337108sklearn.model_selection._search.RandomizedSear...61irispredictive_accuracy2017-08-21 11:07:401janvanrijn@gmail.com0.960000NoneNone
14761301285941636347108sklearn.model_selection._search.RandomizedSear...61irispredictive_accuracy2017-08-21 11:08:061janvanrijn@gmail.com0.946667NoneNone
19069464995949783977109sklearn.pipeline.Pipeline(imputation=openmlstu...61irispredictive_accuracy2017-09-02 22:06:321janvanrijn@gmail.com0.920000NoneNone
+ +
+
+
+
+
+

Retrieving top-performing models from OpenML

+

Since we are an ambitious bunch of ML practitioners who settle for nothing but the best, and also since most results will not be considered worth the effort if not matching or beating state-of-the-art, we shall aim for the best scores. We’ll sort the filtered results we obtained based on the score or ‘value’ and then extract the components from that run - task and flow.

+
+
task_rf.sort_values(by='value', ascending=False).head()
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
run_idtask_idsetup_idflow_idflow_namedata_iddata_namefunctionupload_timeuploaderuploader_namevaluevaluesarray_data
35495239265935262629sklearn.ensemble.forest.RandomForestClassifier(8)61irispredictive_accuracy2016-02-11 22:05:23869p.gijsbers@student.tue.nl0.966667NoneNone
435389553705968909887257sklearn.ensemble.forest.RandomForestClassifier...61irispredictive_accuracy2018-04-06 16:32:223964clear.tsai@gmail.com0.960000NoneNone
3587185268259292635500sklearn.ensemble.forest.RandomForestClassifier...61irispredictive_accuracy2017-03-15 22:55:181022rso@randalolson.com0.960000NoneNone
437588866085968351397961sklearn.pipeline.Pipeline(Imputer=sklearn.prep...61irispredictive_accuracy2018-03-17 16:46:275032rashmi.kamath01@gmail.com0.960000NoneNone
3107184327259240714830sklearn.ensemble.forest.RandomForestClassifier...61irispredictive_accuracy2016-12-08 20:10:032joaquin.vanschoren@gmail.com0.960000NoneNone
+ +
+
+
+
+
# Fetching the Random Forest flow with the best score
+f = openml.flows.get_flow(2629)
+f
+
+
OpenML Flow
+===========
+Flow ID.........: 2629 (version 8)
+Flow URL........: https://www.openml.org/f/2629
+Flow Name.......: sklearn.ensemble.forest.RandomForestClassifier
+Flow Description: Flow generated by openml_run
+Upload Date.....: 2016-02-11 21:17:08
+Dependencies....: None
+
+
+
+
# Fetching the run with the best score for
+# Random Forest on Iris
+r = openml.runs.get_run(523926)
+r
+
+
OpenML Run
+==========
+Uploader Name...: Pieter Gijsbers
+Uploader Profile: https://www.openml.org/u/869
+Metric..........: predictive_accuracy
+Result..........: 0.966667
+Run ID..........: 523926
+Run URL.........: https://www.openml.org/r/523926
+Task ID.........: 59
+Task Type.......: Supervised Classification
+Task URL........: https://www.openml.org/t/59
+Flow ID.........: 2629
+Flow Name.......: sklearn.ensemble.forest.RandomForestClassifier(8)
+Flow URL........: https://www.openml.org/f/2629
+Setup ID........: 3526
+Setup String....: None
+Dataset ID......: 61
+Dataset URL.....: https://www.openml.org/d/61
+
+
+

Okay, let’s take a pause and re-assess. From multiple users across the globe, who had uploaded runs to OpenML, for a Random Forest run on the Iris, the best score seen till now is 96.67%. That is certainly better than the naive model we built at the beginning to achieve 95.33%. We had used a basic 10-fold cross-validation to evaluate a Random Forest of 10 trees with a max depth of 2. Let us see, what the best run uses and if it differs from our approach.

+
+
# The scoring metric used
+t.evaluation_measure
+
+
'predictive_accuracy'
+
+
+
+
# The methodology used for estimations
+t.estimation_procedure
+
+
{'type': 'crossvalidation',
+ 'parameters': {'number_repeats': '1',
+  'number_folds': '10',
+  'percentage': '',
+  'stratified_sampling': 'true'},
+ 'data_splits_url': 'https://www.openml.org/api_splits/get/59/Task_59_splits.arff'}
+
+
+
+
# The model used
+f.name
+
+
'sklearn.ensemble.forest.RandomForestClassifier'
+
+
+
+
# The model parameters
+for param in r.parameter_settings:
+    name, value = param['oml:name'], param['oml:value']
+    print("{:<25} : {:<10}".format(name, value))
+
+
warm_start                : False     
+oob_score                 : False     
+n_jobs                    : 1         
+verbose                   : 0         
+max_leaf_nodes            : None      
+bootstrap                 : True      
+min_samples_leaf          : 1         
+n_estimators              : 10        
+min_samples_split         : 2         
+min_weight_fraction_leaf  : 0.0       
+criterion                 : gini      
+random_state              : None      
+max_features              : auto      
+max_depth                 : None      
+class_weight              : None      
+
+
+

As evident, our initial approach is different on two fronts. We didn’t explicitly use stratified sampling for our cross-validation. While the Random Forest hyperparameters are slightly different too (max_depth=None). That definitely sounds like a to-do, however, there is no reason why we should restrict ourselves to Random Forests. Remember, we are aiming big here. Given the number of OpenML users, there must be somebody who got a better score on Iris with some other model. Let us then retrieve that information. Programmatically, of course.

+

In summary, we are now going to sort the performance of all scikit-learn based models on Iris dataset as per the task definition with task_id=59.

+
+
# Fetching top performances
+task_df.sort_values(by='value', ascending=False).head()
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
run_idtask_idsetup_idflow_idflow_namedata_iddata_namefunctionupload_timeuploaderuploader_namevaluevaluesarray_data
36302039748591809226048sklearn.pipeline.Pipeline(dualimputer=helper.d...61irispredictive_accuracy2017-04-09 01:09:011104jmapvhoof@gmail.com0.986667NoneNone
36312039750591809246048sklearn.pipeline.Pipeline(dualimputer=helper.d...61irispredictive_accuracy2017-04-09 01:17:391104jmapvhoof@gmail.com0.986667NoneNone
36242012939591576226048sklearn.pipeline.Pipeline(dualimputer=helper.d...61irispredictive_accuracy2017-04-06 23:29:281104jmapvhoof@gmail.com0.986667NoneNone
36182012930591576136048sklearn.pipeline.Pipeline(dualimputer=helper.d...61irispredictive_accuracy2017-04-06 23:00:241104jmapvhoof@gmail.com0.986667NoneNone
36262012941591576246048sklearn.pipeline.Pipeline(dualimputer=helper.d...61irispredictive_accuracy2017-04-07 01:36:001104jmapvhoof@gmail.com0.986667NoneNone
+ +
+
+
+
+
# Fetching best performing flow
+f = openml.flows.get_flow(6048)
+f
+
+
OpenML Flow
+===========
+Flow ID.........: 6048 (version 1)
+Flow URL........: https://www.openml.org/f/6048
+Flow Name.......: sklearn.pipeline.Pipeline(dualimputer=helper.dual_imputer.DualImputer,nusvc=sklearn.svm.classes.NuSVC)
+Flow Description: Automatically created scikit-learn flow.
+Upload Date.....: 2017-04-06 22:42:59
+Dependencies....: sklearn==0.18.1
+numpy>=1.6.1
+scipy>=0.9
+
+
+
+
# Fetching best performing run
+r = openml.runs.get_run(2012943)
+
+# The model parameters
+for param in r.parameter_settings:
+    name, value = param['oml:name'], param['oml:value']
+    print("{:<25} : {:<10}".format(name, value))
+
+
steps                     : [('DualImputer', <helper.dual_imputer.DualImputer object at 0x7ff618e4d908>), ('nusvc', NuSVC(cache_size=200, class_weight=None, coef0=0.0,
+   decision_function_shape=None, degree=3, gamma='auto', kernel='linear',
+   max_iter=-1, nu=0.3, probability=True, random_state=3, shrinking=True,
+   tol=3.2419092644286417e-05, verbose=False))]
+cache_size                : 200       
+class_weight              : None      
+coef0                     : 0.0       
+decision_function_shape   : None      
+degree                    : 3         
+gamma                     : auto      
+kernel                    : linear    
+max_iter                  : -1        
+nu                        : 0.3       
+probability               : True      
+random_state              : 3         
+shrinking                 : True      
+tol                       : 3.24190926443e-05
+verbose                   : False     
+
+
+

The highest score obtained among the uploaded results is 98.67% using a variant of SVM. However, if we check the corresponding flow description, we see that it is using an old scikit-learn version (0.18.1) and therefore may not be possible to replicate the exact results. However, in order to improve from our score of 95.33%, we should try running a nu-SVC on the same problem and see where we stand. Let’s go for it. Via OpenML, of course.

+
+
+

Running best performing flow on the required task

+
+
import openml
+import numpy as np
+from sklearn.svm import NuSVC
+
+
+
# Building the NuSVC model object with parameters found
+clf = NuSVC(cache_size=200, class_weight=None, coef0=0.0,
+   decision_function_shape=None, degree=3, gamma='auto', kernel='linear',
+   max_iter=-1, nu=0.3, probability=True, random_state=3, shrinking=True,
+   tol=3.2419092644286417e-05, verbose=False)
+
+
+
# Obtaining task used earlier
+t = openml.tasks.get_task(59)
+t
+
+
OpenML Classification Task
+==========================
+Task Type Description: https://www.openml.org/tt/1
+Task ID..............: 59
+Task URL.............: https://www.openml.org/t/59
+Estimation Procedure.: crossvalidation
+Evaluation Measure...: predictive_accuracy
+Target Feature.......: class
+# of Classes.........: 3
+Cost Matrix..........: Available
+
+
+
+
# Running the model on the task
+# Internally, the model will be made into 
+# an OpenML flow and we can choose to retrieve it
+r, f = openml.runs.run_model_on_task(model=clf, task=t, upload_flow=False, return_flow=True)
+f
+
+
OpenML Flow
+===========
+Flow Name.......: sklearn.svm.classes.NuSVC
+Flow Description: Nu-Support Vector Classification.
+
+Similar to SVC but uses a parameter to control the number of support
+vectors.
+
+The implementation is based on libsvm.
+Dependencies....: sklearn==0.21.3
+numpy>=1.6.1
+scipy>=0.9
+
+
+
+
# To obtain the score (without uploading)
+## r.publish() can be used to upload these results
+## need to sign-in to https://www.openml.org/
+score = []
+evaluations = r.fold_evaluations['predictive_accuracy'][0]
+for key in evaluations:
+    score.append(evaluations[key])
+print(np.mean(score))
+
+
0.9866666666666667
+
+
+

Lo and behold! We hit the magic number. I personally would have never tried out NuSVC and would have stuck around tweaking hyperparameters of the Random Forest. This is a new discovery of sorts for sure. I wonder though if anybody has tried XGBoost on Iris?

+

In any case, we can now upload the results of this run to OpenML using:

+
+
r.publish()
+
+
OpenML Run
+==========
+Uploader Name: None
+Metric.......: None
+Run ID.......: 10464835
+Run URL......: https://www.openml.org/r/10464835
+Task ID......: 59
+Task Type....: None
+Task URL.....: https://www.openml.org/t/59
+Flow ID......: 18579
+Flow Name....: sklearn.svm.classes.NuSVC
+Flow URL.....: https://www.openml.org/f/18579
+Setup ID.....: None
+Setup String.: Python_3.6.9. Sklearn_0.21.3. NumPy_1.16.4. SciPy_1.4.1. NuSVC(cache_size=200, class_weight=None, coef0=0.0,
+      decision_function_shape=None, degree=3, gamma='auto', kernel='linear',
+      max_iter=-1, nu=0.3, probability=True, random_state=3, shrinking=True,
+      tol=3.241909264428642e-05, verbose=False)
+Dataset ID...: 61
+Dataset URL..: https://www.openml.org/d/61
+
+
+

One would need to sign-in to https://www.openml.org/ and generate their respective apikey. The results would then be available for everyone to view and who knows, you can have your name against the best-ever performance measured on the Iris dataset!

+
+

This post was in no ways intended to be a be-all-end-all guide to OpenML. The primary goal was to help form an acquaintance with the OpenML terminologies, introduce the API, establish connections with the general ML practices, and give a sneak-peek into the potential benefits of working together as a community. For a better understanding of OpenML, please explore the documentation. If one desires to continue from the examples given in this post and explore further, kindly refer to the API.

+

OpenML-Python is an open-source project and contributions from everyone in the form of Issues and Pull Requests are most welcome. Contribution to the OpenML community is in fact not limited to code contribution. Every single user can make the community richer by sharing data, experiments, results, using OpenML.

+

As ML practitioners, we may be dependent on tools for our tasks. However, as a collective, we can juice out its potential to a larger extent. Let us together, make ML more transparent, more democratic!

+
+

Special thanks to Heidi, Bilge, Sahithya, Matthias, Ashwin for the ideas, feedback, and support.

+
+

Related readings: * To get started with OpenML-Python * OpenML-Python Github * The OpenML website * Miscellaneous reading on OpenML * To get in touch!

+ + +
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/blog/docs/posts/2019-10-26-OpenML-Machine-Learning-as-a-community/openml.png b/blog/docs/posts/2019-10-26-OpenML-Machine-Learning-as-a-community/openml.png new file mode 100644 index 0000000..82ef4bb Binary files /dev/null and b/blog/docs/posts/2019-10-26-OpenML-Machine-Learning-as-a-community/openml.png differ diff --git a/blog/docs/posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/2020-03-23-Finding a-standard-dataset-format-for-machine-learning.html b/blog/docs/posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/2020-03-23-Finding a-standard-dataset-format-for-machine-learning.html new file mode 100644 index 0000000..b1057bc --- /dev/null +++ b/blog/docs/posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/2020-03-23-Finding a-standard-dataset-format-for-machine-learning.html @@ -0,0 +1,803 @@ + + + + + + + + + + + + +Finding a standard dataset format for machine learning – OpenML Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+

Finding a standard dataset format for machine learning

+
+
+ Exploring new dataset format options for OpenML.org +
+
+
+
OpenML
+
Data
+
+
+
+ + +
+ +
+
Author
+
+

Pieter Gijsbers, Mitar Milutinovic, Prabhant Singh, Joaquin Vanschoren

+
+
+ +
+
Published
+
+

March 23, 2020

+
+
+ + +
+ + +
+ + + + +
+ + + + + +

Machine learning data is commonly shared in whatever form it comes in (e.g. images, logs, tables) without being able to make strict assumptions on what it contains or how it is formatted. This makes machine learning hard because you need to spend a lot of time figuring out how to parse and deal with it. Some datasets are accompanied with loading scripts, which are language-specific and may break, and some come with their own server to query the dataset. These do help, but are often not available, and still require us to handle every dataset individually.

+

With OpenML, we aim to take a stress-free, 'zen'-like approach to working with machine learning datasets. To make training data easy to use, OpenML serves thousands of datasets in the same format, with the same rich meta-data, so that you can directly load it (e.g. in numpy,pandas,…) and start building models without manual intervention. For instance, you can benchmark algorithms across hundreds of datasets in a simple loop.

+

For historical reasons, we have done this by internally storing all data in the ARFF data format, a CSV-like text-based format that includes meta-data such as the correct feature data types. However, this format is loosely defined, causing different parsers to behave differently, and the current parsers are memory-inefficient which inhibits the use of large datasets. A more popular format these days is Parquet, a binary single-table format. However, many current machine learning tasks require multi-table data. For instance, image segmentation or object detection tasks have both images and varying amounts of annotations per image.

+

In short, we are looking the best format to internally store machine learning datasets in the foreseeable future, to extend OpenML towards all kinds of modern machine learning datasets and serve them in a uniform way. This blog post presents out process and insights. We would love to hear your thoughts and experiences before we make any decision on how to move forward.

+

Scope

+

We first define the general scope of the usage of the format:

+ +

Impact on OpenML (simplicity, maintenance)

+

Since OpenML is a community project, we want to keep it as easy as possible to use and maintain:

+ +

When no agreed upon schema exists, we could offer a forum for the community to discuss and agree on a standard schema, in collaboration with other initiatives (e.g. frictionlessdata). For instance, new schemas could be created in a github repo to allow people to do create pull requests. They could be effectively used once they are merged.

+

Requirements

+

To draw up a shortlist of data formats, we used the following (soft) requirements:

+ +

Shortlist

+

We decided to investigate the following formats in more detail:

+

Arrow / Feather

+

Benefits:

+ +

Drawbacks:

+ +

Parquet

+

Benefits:

+ +

Drawbacks:

+ +

SQLite

+

Benefits:

+ +

Drawback:

+ +

HDF5

+

Benefits:

+ +

Drawbacks:

+ +

CSV

+

Benefits:

+ +

Drawbacks:

+ +

Overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParquetHDF5SQLiteCSV
Consistency across
different platforms
?✅ (dialect)
Support and documentation
Read/write speedso-so
Incremental
reads/writes
Yes, but not
supported by current
Python libs
Yes (but not
random access)
Supports very large and high-dimensional datasets❌ (limited nr. columns
per table)
✅ Storing tensors
requires flattening.
Simplicity❌ (basically full
file system)
✅ (it’s a database)
Metadata supportOnly minimal❌ (requires separate
metadata file)
MaintenanceApache project, open
and quite active
Closed group,
but active community on
Jira and conferences
Run by a company.
Uses an email list.
Available examples of
usage in ML
FlexibilityOnly tabularVery flexible,
maybe too flexible
Relational multi-tableOnly tabular
Versioning/DiffOnly via S3 or delta lake
Different length vectorsAs blob❌ ?
+

Performance benchmarks

+

There exist some prior benchmarks (here and here) on storing dataframes. These only consider single-table datasets. For reading/writing, CSV is clearly slower and Parquet is clearly faster. For storage, Parquet is most efficient but zipped CSV as well. HDF requires a lot more disk space. We also ran our own benchmark to compare the writing performance of those data formats for very large and complex machine learning datasets, but could not find a way to store these in one file in Parquet.

+

Version control

+

Version control for large datasets is tricky. For text-based formats (CSV), we could use git LFS store the datasets and have automated versioning of datasets. We found it quite easy to export all current OpenML dataset to GitLab: https://gitlab.com/data/d/openml.

+

The binary formats do not allow us to track changes in the data, only to recover the exact versions of the datasets you want (and their metadata). Potentially, extra tools could still be used to export the data to dataframes or text and then compare them. Delta Lake has version history support, but seemingly only for Spark operations done on the datasets.

+

We need your help! If we have missed any format we should investigate, or misunderstood those we have investigated, or missed some best practice, please tell us. You are welcome to comment below, or send us an email at openmlhq@googlegroups.com

+

Contributors to this blog post: Mitar Milutinovic, Prabhant Singh, Joaquin Vanschoren, Pieter Gijsbers, Andreas Mueller, Matthias Feurer, Jan van Rijn, Marcus Weimer, Marcel Wever, Gertjan van den Burg, Nick Poorman

+ + + +
+ +
+ + + + + \ No newline at end of file diff --git a/blog/docs/posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/format.jpg b/blog/docs/posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/format.jpg new file mode 100644 index 0000000..a604427 Binary files /dev/null and b/blog/docs/posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/format.jpg differ diff --git a/blog/docs/posts/2020-05-06-Reproducible-deep-learning-with-OpenML/2020-05-06-Reproducible-deep-learning-with-OpenML.html b/blog/docs/posts/2020-05-06-Reproducible-deep-learning-with-OpenML/2020-05-06-Reproducible-deep-learning-with-OpenML.html new file mode 100644 index 0000000..41e8f50 --- /dev/null +++ b/blog/docs/posts/2020-05-06-Reproducible-deep-learning-with-OpenML/2020-05-06-Reproducible-deep-learning-with-OpenML.html @@ -0,0 +1,813 @@ + + + + + + + + + + + +Reproducible deep learning with OpenML – OpenML Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+

Reproducible deep learning with OpenML

+
+
+ Releasing OpenML Deep learning libraries compatible with keras, pytorch and mxnet. +
+
+
+
openml
+
deep learning
+
+
+
+ + +
+ + +
+
Published
+
+

May 6, 2020

+
+
+ + +
+ + +
+ + + + +
+ + + + + +

Deep learning is facing a reproducibility crisis right now[1]. The scale of experiments and there are numerous hyperparameters that affect performance, which makes it hard for the author to write a reproducibility document. The current best way to make an experiment reproducible is to upload the code. However, that’s not optimal in a lot of situations where we have a huge undocumented codebase and someone would like to just reproduce the model. OpenML[2] is an online machine learning platform for sharing and organizing data, machine learning algorithms and experiments. Until now we only provided support for classical machine learning and libraries like Sklearn and MLR. We see there is a huge need for reproducible deep learning now. To solve this issue OpenML is launching its deep learning plugins for popular deep learning libraries like Keras, MXNet, and Pytorch.

+

Here we have a small tutorial on how to use our pytorch extension with MNIST dataset.

+

Setup
To install openml and openml pytorch extension execute this instruction in your terminal
pip install openml openml_pytorch

+
+
!pip install openml openml_pytorch
+
+
Collecting openml
+  Downloading https://files.pythonhosted.org/packages/68/5b/cd32bb85651eccebfb489cc6ef7f060ce0f62350a6239127e398313090cc/openml-0.10.2.tar.gz (158kB)
+
+     |██                              | 10kB 28.5MB/s eta 0:00:01
+     |████▏                           | 20kB 6.1MB/s eta 0:00:01
+     |██████▏                         | 30kB 8.6MB/s eta 0:00:01
+     |████████▎                       | 40kB 10.9MB/s eta 0:00:01
+     |██████████▎                     | 51kB 7.2MB/s eta 0:00:01
+     |████████████▍                   | 61kB 8.4MB/s eta 0:00:01
+     |██████████████▍                 | 71kB 9.6MB/s eta 0:00:01
+     |████████████████▌               | 81kB 10.7MB/s eta 0:00:01
+     |██████████████████▌             | 92kB 8.5MB/s eta 0:00:01
+     |████████████████████▋           | 102kB 9.3MB/s eta 0:00:01
+     |██████████████████████▊         | 112kB 9.3MB/s eta 0:00:01
+     |████████████████████████▊       | 122kB 9.3MB/s eta 0:00:01
+     |██████████████████████████▉     | 133kB 9.3MB/s eta 0:00:01
+     |████████████████████████████▉   | 143kB 9.3MB/s eta 0:00:01
+     |███████████████████████████████ | 153kB 9.3MB/s eta 0:00:01
+     |████████████████████████████████| 163kB 9.3MB/s 
+Collecting openml_pytorch
+  Downloading https://files.pythonhosted.org/packages/5b/a4/8c69a041e7929d93460db17cf276abfb7b49af9c3d5077bee1c52101ba4c/openml_pytorch-0.0.1-py3-none-any.whl
+Collecting liac-arff>=2.4.0
+  Downloading https://files.pythonhosted.org/packages/e9/35/fbc9217cfa91d98888b43e1a19c03a50d716108c58494c558c65e308f372/liac-arff-2.4.0.tar.gz
+Collecting xmltodict
+  Downloading https://files.pythonhosted.org/packages/28/fd/30d5c1d3ac29ce229f6bdc40bbc20b28f716e8b363140c26eff19122d8a5/xmltodict-0.12.0-py2.py3-none-any.whl
+Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from openml) (2.21.0)
+Requirement already satisfied: scikit-learn>=0.18 in /usr/local/lib/python3.6/dist-packages (from openml) (0.22.2.post1)
+Requirement already satisfied: python-dateutil in /usr/local/lib/python3.6/dist-packages (from openml) (2.8.1)
+Requirement already satisfied: pandas>=0.19.2 in /usr/local/lib/python3.6/dist-packages (from openml) (1.0.3)
+Requirement already satisfied: scipy>=0.13.3 in /usr/local/lib/python3.6/dist-packages (from openml) (1.4.1)
+Requirement already satisfied: numpy>=1.6.2 in /usr/local/lib/python3.6/dist-packages (from openml) (1.18.2)
+Collecting torch==1.2.0
+  Downloading https://files.pythonhosted.org/packages/30/57/d5cceb0799c06733eefce80c395459f28970ebb9e896846ce96ab579a3f1/torch-1.2.0-cp36-cp36m-manylinux1_x86_64.whl (748.8MB)
+     |████████████████████████████████| 748.9MB 14kB/s 
+Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->openml) (3.0.4)
+Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->openml) (1.24.3)
+Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->openml) (2020.4.5.1)
+Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->openml) (2.8)
+Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.6/dist-packages (from scikit-learn>=0.18->openml) (0.14.1)
+Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil->openml) (1.12.0)
+Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.19.2->openml) (2018.9)
+Building wheels for collected packages: openml, liac-arff
+  Building wheel for openml (setup.py) ... done
+  Created wheel for openml: filename=openml-0.10.2-cp36-none-any.whl size=190318 sha256=50c2fd823d13904f246bf30997a2464379c393377cfd77f74b5dace4935db99c
+  Stored in directory: /root/.cache/pip/wheels/71/ec/5f/aaad9e184680b0b8f1a02ff0ec640cace5adf5bff7bb0af1b4
+  Building wheel for liac-arff (setup.py) ... done
+  Created wheel for liac-arff: filename=liac_arff-2.4.0-cp36-none-any.whl size=13335 sha256=fca5bc5e07e3fe4f591cbe79968a42e43f535b3bd3e4be77b62c901d46feaaa9
+  Stored in directory: /root/.cache/pip/wheels/d1/6a/e7/529dc54d76ecede4346164a09ae3168df358945612710f5203
+Successfully built openml liac-arff
+ERROR: torchvision 0.5.0 has requirement torch==1.4.0, but you'll have torch 1.2.0 which is incompatible.
+Installing collected packages: liac-arff, xmltodict, openml, torch, openml-pytorch
+  Found existing installation: torch 1.4.0
+    Uninstalling torch-1.4.0:
+      Successfully uninstalled torch-1.4.0
+Successfully installed liac-arff-2.4.0 openml-0.10.2 openml-pytorch-0.0.1 torch-1.2.0 xmltodict-0.12.0
+
+
+

Let’s import the necessary libraries

+
+
import torch.nn
+import torch.optim
+import openml
+import openml_pytorch
+
+import logging
+
+

Set the apikey for openml python library, you can find your api key in your openml.org account

+
+
openml.config.apikey = 'key'
+
+

Define a sequential network that does initial image reshaping and normalization model

+
+
processing_net = torch.nn.Sequential(
+    openml_pytorch.layers.Functional(function=torch.Tensor.reshape,
+                                                shape=(-1, 1, 28, 28)),
+    torch.nn.BatchNorm2d(num_features=1)
+)
+print(processing_net)
+
+
Sequential(
+  (0): Functional()
+  (1): BatchNorm2d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+)
+
+
+

Define a sequential network that does the extracts the features from the image.

+
+
features_net = torch.nn.Sequential(
+    torch.nn.Conv2d(in_channels=1, out_channels=32, kernel_size=5),
+    torch.nn.LeakyReLU(),
+    torch.nn.MaxPool2d(kernel_size=2),
+    torch.nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5),
+    torch.nn.LeakyReLU(),
+    torch.nn.MaxPool2d(kernel_size=2),
+)
+print(features_net)
+
+
Sequential(
+  (0): Conv2d(1, 32, kernel_size=(5, 5), stride=(1, 1))
+  (1): LeakyReLU(negative_slope=0.01)
+  (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
+  (3): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1))
+  (4): LeakyReLU(negative_slope=0.01)
+  (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
+)
+
+
+

Define a sequential network that flattens the features and compiles the results into probabilities for each digit.

+
+
results_net = torch.nn.Sequential(
+    openml_pytorch.layers.Functional(function=torch.Tensor.reshape,
+                                                shape=(-1, 4 * 4 * 64)),
+    torch.nn.Linear(in_features=4 * 4 * 64, out_features=256),
+    torch.nn.LeakyReLU(),
+    torch.nn.Dropout(),
+    torch.nn.Linear(in_features=256, out_features=10),
+)
+print(results_net)
+
+
Sequential(
+  (0): Functional()
+  (1): Linear(in_features=1024, out_features=256, bias=True)
+  (2): LeakyReLU(negative_slope=0.01)
+  (3): Dropout(p=0.5, inplace=False)
+  (4): Linear(in_features=256, out_features=10, bias=True)
+)
+
+
+

The main network, composed of the above specified networks.

+
+
model = torch.nn.Sequential(
+    processing_net,
+    features_net,
+    results_net
+)
+print(model)
+
+
Sequential(
+  (0): Sequential(
+    (0): Functional()
+    (1): BatchNorm2d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
+  )
+  (1): Sequential(
+    (0): Conv2d(1, 32, kernel_size=(5, 5), stride=(1, 1))
+    (1): LeakyReLU(negative_slope=0.01)
+    (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
+    (3): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1))
+    (4): LeakyReLU(negative_slope=0.01)
+    (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
+  )
+  (2): Sequential(
+    (0): Functional()
+    (1): Linear(in_features=1024, out_features=256, bias=True)
+    (2): LeakyReLU(negative_slope=0.01)
+    (3): Dropout(p=0.5, inplace=False)
+    (4): Linear(in_features=256, out_features=10, bias=True)
+  )
+)
+
+
+

Download the OpenML task for the mnist 784 dataset.

+
+
task = openml.tasks.get_task(3573)
+
+

Run the model on the task and publish the results on openml.org

+
+

+run = openml.runs.run_model_on_task(model, task, avoid_duplicate_runs=False)
+
+run.publish()
+
+print('URL for run: %s/run/%d' % (openml.config.server, run.run_id))
+
+
URL for run: https://www.openml.org/api/v1/xml/run/10452577
+
+
+

By going to the published URL you can check the model performance and other metadata

+

+

We hope that openml deep learning plugins can help in reproducing deep learning experiments and provide a universal reproducibility platform for the experiments. Here are the links of all supported deep learning plugins right now:

+ +

There are examples of how to use these libraries in the Github repos. These libraries are in the development stage right now so we would appreciate any feedback on Github issues of these libraries. Links:

+
    +
  1. https://www.wired.com/story/artificial-intelligence-confronts-reproducibility-crisis/
  2. +
  3. https://www.openml.org
  4. +
+ + + +
+ +
+ + + + + \ No newline at end of file diff --git a/blog/docs/posts/2020-05-06-Reproducible-deep-learning-with-OpenML/run.png b/blog/docs/posts/2020-05-06-Reproducible-deep-learning-with-OpenML/run.png new file mode 100644 index 0000000..b7fa23e Binary files /dev/null and b/blog/docs/posts/2020-05-06-Reproducible-deep-learning-with-OpenML/run.png differ diff --git a/blog/docs/posts/Experiments-with-temperature/experiments_with_temp.html b/blog/docs/posts/Experiments-with-temperature/experiments_with_temp.html new file mode 100644 index 0000000..56d7bbb --- /dev/null +++ b/blog/docs/posts/Experiments-with-temperature/experiments_with_temp.html @@ -0,0 +1,1015 @@ + + + + + + + + + + + + +Experiments with Temperature – OpenML Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+

Experiments with Temperature

+
+
+ Experimenting with LLM temperature and its effects on answer quality +
+
+
+
llm
+
+
+
+ + +
+ +
+
Author
+
+

Subhaditya Mukherjee

+
+
+ +
+
Published
+
+

July 8, 2024

+
+
+ + +
+ + +
+ + + + +
+ + + + + +

Over the past few months at OpenML, we have been experimenting with LLM models in an attempt to improve the search experience for our users. While our existing implementation uses ElasticSearch, we wanted to also have the option of having a more “semantic” search experience.

+

Aside from the usual RAG pipeline that everyone and their grandparents seems to be using these days, we also wanted to experiment with using an LLM to semi-automatically generate filters for our search queries. While it may not seem like a big feature, it is something that has always been a bit of an annoyance for some of our users.

+

So what does this entail? Consider the interface we have at the moment. We have a search bar at the top, and subsequently a bunch of filters that users can use to narrow down their search. While this works pretty well as is, how about trying to automate it a bit.

+

In summary, we want a query like “find me a large dataset with multiple classes of flowers” to automatically generate filters like “classification”, “multiclass”, “sort by size of dataset” etc.

+

+
+

Temperature

+

Think about the first time you used ChatGPT. What stood out to you? Was it how well it could elaborate on a topic? Or was it how creative it could be? The temperature parameter in LLMs is what controls this.

+

How can we control creativity? Well, saying that we can directly control creativity is a bit of a stretch. We can however use a workaround.

+

Do you remember the softmax function? The function that takes a vector of arbitrary real-valued scores and squashes it into a vector of probabilities that sum to 1. The inputs to the softmax function are the unnormalized log likelikhoods or the raw per class score assigned by the model.

+

The softmax function is defined as: \[ \text{softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{k} e^{x_j}} \]

+

If we want more control over the distribution of the probabilities, we can use a temperature parameter. This would look like: \[ \text{softmax}(x_i) = \frac{e^{x_i/T}}{\sum_{j=1}^{k} e^{x_j/T}} \] where \(T\) is the temperature parameter.

+
    +
  • If \(T = 1\), the softmax function is the same as the original softmax function.

  • +
  • If \(T > 1\), the probabilities will become “flatter”. Since the difference between the probabilities will be less, the model can be more exploratory aka more creative.

  • +
  • If \(T < 1\), the distribution of the probabilities are “peakier”. There will be a higher difference between the probabilities, leading to the model being more confident in its predictions, but also less creative.

  • +
+
+

Visualizing Temperature using Softmax

+
+
from tqdm import tqdm
+import regex as re
+# LangChain supports many other chat models. Here, we're using Ollama
+from langchain_community.chat_models import ChatOllama
+from langchain_core.output_parsers import StrOutputParser
+from langchain_core.prompts import ChatPromptTemplate
+from typing import List, Dict, Any
+import numpy as np  
+import seaborn as sns
+import matplotlib.pyplot as plt
+import pandas as pd 
+sns.set_theme(style="white")
+
+
+
def softmax(input, t=1.0):
+  ex = np.exp(input/t)
+  sum = np.sum(ex, axis=0)
+  return ex / sum
+
+
+
# plot softmax over a range of inputs
+x = np.arange(0,1.0, 0.01)
+t = np.array([0.1,.5, .8, 1.0])
+y = np.array([softmax(x, ti) for ti in t])
+
+# Create a DataFrame for Seaborn
+data = pd.DataFrame({
+    'x': np.tile(x, len(t)),
+    'softmax': np.concatenate(y),
+    't': np.repeat(t, len(x))
+})
+
+# Plotting with Seaborn
+plt.figure(figsize=(8, 6))
+sns.lineplot(data=data, x='x', y='softmax', hue='t', palette='viridis')
+plt.xlabel('x')
+plt.ylabel('softmax(x)')
+plt.title('Softmax Function for Different Values of t')
+plt.legend(title='t')
+plt.show()
+
+
+
+

+
+
+
+
+
+
+
+

Creating the Experimental Setup

+

Now, we can focus on testing the effects of temperature for our use case. We are using the llama3 model for our experiments. The experiments are being run on a 2023 MacBook Pro with an M3 chip and 18GB memory.

+
+

Defining a Prompt

+

We need to first think of a prompt that we can use for our experiments. This prompt can be thought of as an instruction that the model uses along with the query to generate answers. To make it easier for us to use, we only want one/two word answers and for now we are only focusing on a small subset of the filters that we want our model to understand.

+
+
prompt = """User Query : {query}
+Based on the query, answer the following questions one by one in one or two words only and a maximum of two with commas only if asked for. Use only the information given and do not make up answers - 
+Does the user care about the size of the dataset? Yes/No and if yes, ascending/descending.
+Does the user want to sort by number of downloads? Yes/No.
+Does the user care about missing values? Yes/No.
+If it seems like the user wants a classification dataset, is it binary/multi-class/multi-label? If not, say none.
+"""
+
+
+
query = "Find me a big classification dataset about mushrooms"
+
+
+
+

Creating a Chain

+

Since we are using the langchain and ollama libraries for our experiments, we follow their API and create a chain. The template uses string formatting to insert the prompt and the query into the chain.

+
+
def create_chain(prompt , temperature, llm_model = "llama3"):
+    prompt = ChatPromptTemplate.from_template(prompt)
+    llm = ChatOllama(model=llm_model, temperature=temperature)
+    chain = prompt | llm | StrOutputParser()
+    return chain
+
+
+
+

Parsing the Results

+

To make it easier for us to analyze the results, we generate an example answer and then see see if any further processing is needed.

+
+
# functiont to parse responses like this to a list of yes/no/none/yes,aescending/no etc
+def parse_response(response):
+    # split by new line and remove first two lines (here are the answers:)
+    response = response.split('\n')[2::]
+    # if response has a question mark, split by question mark and remove empty strings
+    for i in range(len(response)):
+        if '?' in response[i]:
+            response[i] = response[i].split('?')[1].strip()
+    # replace full stops with empty strings
+    response = [x.replace('.','') for x in response]
+    response = [x for x in response if x]
+    return response
+
+
+
chain = create_chain(prompt, 0.5)
+response = chain.invoke({"query": query})
+print(response)
+
+
Here are the answers:
+
+1. Does the user care about the size of the dataset?
+Yes, ascending.
+
+2. Does the user want to sort by number of downloads?
+No
+
+3. Does the user care about missing values?
+No
+
+4. Is it a classification dataset? If so, is it binary/multi-class/multi-label?
+Yes, multi-class
+
+
+

Yay, it works. We now write a function to generate results for different temperatures.

+
+
def generate_results_for_temp(query:str, range_of_temps : np.ndarray) -> List[List[str]]:
+    results = []
+    for temperature in tqdm(range_of_temps):
+        chain = create_chain(prompt, temperature)
+        response = chain.invoke({"query": query})
+        results.append(parse_response(response))
+    return results
+        
+
+
+
+
+

Running the Experiments and Plotting Results

+

It is time to run the experiments and plot the results. We write a function to plot the results in a stripplot to see the distribution of the answers for different temperatures.

+
+
def plot_yes_no(df: pd.DataFrame, title:str) -> None:
+    fig, axs = plt.subplots(2, 2, figsize=(15, 15))
+    fig.suptitle(title)
+    sns.stripplot(data=df, x='size', y='temperature', ax=axs[0, 0], hue='size')
+    sns.stripplot(data=df, x='sort_by_downloads', y='temperature', ax=axs[0, 1], hue='sort_by_downloads')
+    sns.stripplot(data=df, x='missing_values', y='temperature', ax=axs[1, 0], hue='missing_values')
+    sns.stripplot(data=df, x='classification_type', y='temperature', ax=axs[1, 1], hue='classification_type')
+    # tilt x axis labels
+    for ax in axs.flat:
+        ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+    plt.show()
+
+

Sometimes, the model returns an extra field, we combine the last two fields to plot the results. (This is a bit of a hack, but it works for now and is ONLY used for plotting)

+
+
def combine_last_two_elements(lst):
+    # Check if the list has at least two elements
+    if len(lst) > 4:
+        # Combine the last two elements with a space separator
+        combined_element = lst[-2] + ' ' + lst[-1]
+
+        # Create a new list with combined element instead of the last two
+        return lst[:-2] + [combined_element]
+    else:
+        return lst
+
+
+

Experiment 1

+

Out first experiment is a rather simple query, “Find me a big classification dataset about mushrooms”. As you can probably guess, we are looking for a dataset that is large, is a classification dataset and is about mushrooms.

+
+
range_of_temps = np.linspace(0, 1, 20)
+query = "Find me a big classification dataset about mushrooms"
+results1 = generate_results_for_temp(query, range_of_temps)
+
+
100%|██████████| 20/20 [00:49<00:00,  2.49s/it]
+
+
+
+
results1 = [[y for y in x if all(sub not in y for sub in ["If", ":"])] for x in results1]
+
+
+
df = pd.DataFrame(results1, columns = ['size', 'sort_by_downloads', 'missing_values', 'classification_type'])
+df['temperature'] = range_of_temps
+plot_yes_no(df, title = query)
+
+
/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+
+
+
+
+

+
+
+
+
+

Rather interesting don’t you think? At higher temperatures, the model gets the answers wrong. Even at a temperature slightly above 0.1, the model starts adding extra information to it’s answers.

+

Did you notice that I tried to remove sentences that started with “If”? There are more examples of this later, but this is because at higher temperatures, the model tends to add random sentences to the answers and this makes it quite hard to plot them.

+
+
+

Experiment 2

+

Our second experiment is super easy. “Find me a dataset that has a lot of missing values and order by number of downloads”. As you can obviously guess, we are looking for a dataset that has a lot of missing values and we want to order the results by the number of downloads.

+
+
range_of_temps = np.linspace(0, 1, 20)
+query = "Find me a dataset that has a lot of missing values and order by number of downloads"
+results2 = generate_results_for_temp(query, range_of_temps)
+results2 = [[y for y in x if "so" not in y] for x in results2]
+
+
100%|██████████| 20/20 [00:34<00:00,  1.74s/it]
+
+
+
+
df = pd.DataFrame(results2, columns = ['size', 'sort_by_downloads', 'missing_values', 'classification_type'])
+df['temperature'] = range_of_temps
+plot_yes_no(df, title = query)
+
+
/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+
+
+
+
+

+
+
+
+
+

Hmm, same as before. The model starts adding extra information at higher temperatures and starts getting the answers wrong. (Yes, No?? ) What kind of answer is that?

+
+
+
+

Experiment 3

+
    +
  • Now a slightly more complex query. “Find me a dataset that has 10 classes and sort by number of downloads”. We want it to understand that we want a multiclass classification dataset and we want to sort the results by the number of downloads.
  • +
+
+
range_of_temps = np.linspace(0, 1, 20)
+query = "Find me a dataset that has 10 classes and sort by number of downloads"
+results3 = generate_results_for_temp(query, range_of_temps)
+
+
100%|██████████| 20/20 [00:55<00:00,  2.80s/it]
+
+
+
+
results3 = [combine_last_two_elements(x) for x in results3]
+
+
+
df = pd.DataFrame(results3, columns = ['size', 'sort_by_downloads', 'missing_values', 'classification_type'])
+df['temperature'] = range_of_temps
+plot_yes_no(df, title = query)
+
+
/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+
+
+
+
+

+
+
+
+
+

This seems to have been very easy for the model. But as always, the model starts adding extra information at higher temperatures. A lot of extra information in fact. Even though the prompt says to ONLY answer with one or two words

+
+
+

Experiment 4

+
    +
  • “Find me a dataset that 2 classes and is a big dataset”. You know the drill by now. We want a binary classification dataset that is large.
  • +
+
+
range_of_temps = np.linspace(0, 1, 20)
+query = "Find me a dataset that 2 classes and is a big dataset"
+results4 = generate_results_for_temp(query, range_of_temps)
+
+
100%|██████████| 20/20 [00:42<00:00,  2.14s/it]
+
+
+
+
results4 = [combine_last_two_elements(x) for x in results4]
+
+
+
df = pd.DataFrame(results4, columns = ['size', 'sort_by_downloads', 'missing_values', 'classification_type'])
+df['temperature'] = range_of_temps
+plot_yes_no(df, title = query)
+
+
/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
+  ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')
+
+
+
+
+

+
+
+
+
+

Notice how some things changed? At higher temperatures, we get extended answers.

+
+
+

Conclusion

+

In conclusion, we can see that we should probably stick to lower temperatures for our use case. As we go higher, the model starts being more “creative” and either adds extra information to the answers or gets them wrong. While this behaviour might be useful in cases like creative writing, it is not something we want in our search.

+

Using LLMs can sometimes be a bit of a hit or miss. But of course, learning to control it’s parameters can help us get the most out of it. This blog post was just a simple experiment, but in the deluge of content made by people who have no idea what Softmax is, I hope this was helpful.

+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-15-output-2.png b/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-15-output-2.png new file mode 100644 index 0000000..1bc8357 Binary files /dev/null and b/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-15-output-2.png differ diff --git a/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-17-output-2.png b/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-17-output-2.png new file mode 100644 index 0000000..077501e Binary files /dev/null and b/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-17-output-2.png differ diff --git a/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-20-output-2.png b/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-20-output-2.png new file mode 100644 index 0000000..9cfec00 Binary files /dev/null and b/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-20-output-2.png differ diff --git a/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-23-output-2.png b/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-23-output-2.png new file mode 100644 index 0000000..0886fd8 Binary files /dev/null and b/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-23-output-2.png differ diff --git a/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-4-output-1.png b/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-4-output-1.png new file mode 100644 index 0000000..ac9d8c3 Binary files /dev/null and b/blog/docs/posts/Experiments-with-temperature/experiments_with_temp_files/figure-html/cell-4-output-1.png differ diff --git a/blog/docs/posts/Experiments-with-temperature/search.png b/blog/docs/posts/Experiments-with-temperature/search.png new file mode 100644 index 0000000..89193ec Binary files /dev/null and b/blog/docs/posts/Experiments-with-temperature/search.png differ diff --git a/blog/docs/posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html b/blog/docs/posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html new file mode 100644 index 0000000..92bb9e8 --- /dev/null +++ b/blog/docs/posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html @@ -0,0 +1,646 @@ + + + + + + + + + + + + +Participate in the OpenML Hacktoberfest Workshop! – OpenML Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+

Participate in the OpenML Hacktoberfest Workshop!

+
+
+ Join us at the 2020 Fall Workshop on gather.town! +
+
+
+
OpenML
+
Hacktoberfest
+
Workshop
+
+
+
+ + +
+ +
+
Author
+
+

Pieter Gijsbers, Prabhant Singh

+
+
+ +
+
Published
+
+

October 23, 2020

+
+
+ + +
+ + +
+ + + + +
+ + + + + +

Twice a year the OpenML community organizes an OpenML workshop. Next week we will kick off our fall workshop, which will be hosted virtually and is open to everyone! At the workshop we work on the development and maintenance of the OpenML platform (website, APIs and extensions), but also encourage discussions on a broad range of topics, from using the platform to building the platform to building the community. If you are already sure you want to join, please register and we will see you next week!

+

The workshops are the perfect time to get involved with the OpenML community. We welcome first time contributors to the project. You can contribute in many ways, such as giving feedback, cleaning data, or helping with design, planning, or content. If you are looking to contribute to the software projects, we are there to help you get started on beginner issues. Even better, the workshop coincides with Hacktoberfest, which means you can earn a shirt through your open source software contributions! To get an even better idea of what happens at an OpenML workshop, read the write-up of last year’s fall workshop and look at the workshop agenda.

+

In this blog post we will go over the basics on how you can participate in the workshop. This includes pointers to our code repositories, the platform we will use (gather.town), and participating in Hacktoberfest.

+
+

Overview

+

Where? openml at gather.town
+When? 26th through 30th of October 2020, 09.00-17.00 CET.
+What? Discussions about OpenML, contributing to any OpenML project, or experimenting with OpenML.

+

Please register if you plan to join. It is not required to attend the workshop in full. You are free to join only for a day or specific discussions.
+However, it is helpful to indicate which meetings you want to attend, so we know who to expect.

+

The workshop agenda is public. If you see a meeting which you would like to join, just add your name to the list. Feel free to propose a new meeting by adding a proposal to the meeting list!

+
+
+

Gather Town

+

This fall, we will host the OpenML Hackathon at our gather.town space. Gather.town is a web-based platform that allows you to video conference with other people, but with a twist. Rather than the conventional conference call, in gather.town you control an avatar that can navigate a virtual world. You will automatically be connected to anyone that is within the vicinity of your avatar. This means you can more organically join groups of people, or walk from one meeting room to the next. Here is a preview of our OpenML map:

+

At a glance you see two types of areas: those marked with purple and those that are not marked. Areas that are not marked (e.g. the main lobby) function exactly as described above. However, whenever you are in a purple area you will automatically be connected to everyone else in the same purple area. So whenever you are interested in joining people discussing the new openml website, you just head over to that room!

+
+
+

Breakout Sessions

+

In the workshop agenda you will find various breakout sessions. These cover a wide range of topics, and we will briefly cover a few of them to give you an impression.

+
    +
  1. The Dataset Quality break-out session discusses what quality standards we want to uphold for datasets on OpenML. Ideally, we would like all our datasets perfectly annotated with a description of how the data was collected, what each features means, and what the feature types are. In reality, datasets are collected from different sources and often uploaded by someone other than the original creator. This leads to issues such as incomplete data, badly annotated columns, or multiple uploads of the same data.How can we ensure that despite these practical issues, it remains easy to find datasets of interest on OpenML? How can we improve the dataset quality of datasets uploaded to OpenML? How can we set these new standards and guidelines in a maintainable way? How can we automate annotation of attribute types to the dataset? How can we detect corrupt datasets before uploading it to server?

  2. +
  3. The Website Feedback break-out session is to discuss the newly designed OpenML website. We will appreciate any feedback on frontend, functionalities and limitations of the new openml website.

  4. +
  5. We recently discussed that OpenML wants to improve support for a wider range of datasets. For this reason we are moving away from the ARFF format. The Dataset Format break-out session discusses this transition. Our current plan is to migrate to parquet format, we will be discussing about limitations and advantages of new format and how can we integrate parquet to OpenML.

  6. +
+

We welcome your participation in any these sessions.
+And if you have an interesting topic we should discuss, feel free to submit your own breakout proposal!

+
+
+

Hacktoberfest

+

Hacktoberfest is a global event to support open source software. If you contribute “enough” to open source projects, you will also be eligible to receive a free t-shirt and some other swag! Our repositories welcome Hacktoberfest participation, so whenever you contribute to our repositories, you are working towards your Hacktoberfest goal. The rules are simple: - Sign up at Hacktoberfest with Github credentials - Find an issue you can help with (more on that below) - Submit a pull request resolving the issue - To be eligible for the t-shirt and swag, you must open four pull requests (this is the “enough” part)

+

+

You can browse our repositories and identify issues which you would like to work on. To make things easier, here are the list of openml repositories that are extra prepared for Hacktoberfest. These repositories have core developers registered to attend the workshop, and have marked issues which are suitable for newcomers with the hacktoberfest label.

+
    +
  • openml.org The front-end for the new OpenML! (python, React.js)
  • +
  • OpenML The back-end for OpenML. (php)
  • +
  • openml-python The Python API for interacting with the OpenML server. Please read this welcome message to get started. (python)
  • +
  • docs Documentation for OpenML.
  • +
+

Please be sure to check the respective repositories contribution guidelines, and don’t be afraid to ask questions! We were all new to open source once and are happy to help you get started too. If you are just getting your feet wet with open source contribution, a great way to get started it to just try and use the packages/website. If you see documentation which needs clarification, or perhaps even just a simple typo, we appreciate your help in fixing it!

+
+
+

We hope to see you at our workshop!

+

If you have any questions about the workshop, feel free to leave a comment.

+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/blog/docs/posts/OpenML-Hacktoberfest/gathertown-openml.png b/blog/docs/posts/OpenML-Hacktoberfest/gathertown-openml.png new file mode 100644 index 0000000..a94e007 Binary files /dev/null and b/blog/docs/posts/OpenML-Hacktoberfest/gathertown-openml.png differ diff --git a/blog/docs/posts/OpenML-Hacktoberfest/hackathon.png b/blog/docs/posts/OpenML-Hacktoberfest/hackathon.png new file mode 100644 index 0000000..6e10107 Binary files /dev/null and b/blog/docs/posts/OpenML-Hacktoberfest/hackathon.png differ diff --git a/blog/docs/posts/OpenML-Hacktoberfest/hacktoberfest-2020.png b/blog/docs/posts/OpenML-Hacktoberfest/hacktoberfest-2020.png new file mode 100644 index 0000000..e2b0a5d Binary files /dev/null and b/blog/docs/posts/OpenML-Hacktoberfest/hacktoberfest-2020.png differ diff --git a/blog/docs/search.json b/blog/docs/search.json new file mode 100644 index 0000000..7d71c6f --- /dev/null +++ b/blog/docs/search.json @@ -0,0 +1,156 @@ +[ + { + "objectID": "about.html", + "href": "about.html", + "title": "About", + "section": "", + "text": "Welcome to the Open Machine Learning blog\nThis blog brings you stories about OpenML: why we want to streamline machine learning research, how you can use it, and what we are doing. We are also open to your stories about anything related to open machine learning research, education, and applications. Join the conversation :)." + }, + { + "objectID": "posts/Experiments-with-temperature/experiments_with_temp.html", + "href": "posts/Experiments-with-temperature/experiments_with_temp.html", + "title": "Experiments with Temperature", + "section": "", + "text": "Over the past few months at OpenML, we have been experimenting with LLM models in an attempt to improve the search experience for our users. While our existing implementation uses ElasticSearch, we wanted to also have the option of having a more “semantic” search experience.\nAside from the usual RAG pipeline that everyone and their grandparents seems to be using these days, we also wanted to experiment with using an LLM to semi-automatically generate filters for our search queries. While it may not seem like a big feature, it is something that has always been a bit of an annoyance for some of our users.\nSo what does this entail? Consider the interface we have at the moment. We have a search bar at the top, and subsequently a bunch of filters that users can use to narrow down their search. While this works pretty well as is, how about trying to automate it a bit.\nIn summary, we want a query like “find me a large dataset with multiple classes of flowers” to automatically generate filters like “classification”, “multiclass”, “sort by size of dataset” etc." + }, + { + "objectID": "posts/Experiments-with-temperature/experiments_with_temp.html#temperature", + "href": "posts/Experiments-with-temperature/experiments_with_temp.html#temperature", + "title": "Experiments with Temperature", + "section": "Temperature", + "text": "Temperature\nThink about the first time you used ChatGPT. What stood out to you? Was it how well it could elaborate on a topic? Or was it how creative it could be? The temperature parameter in LLMs is what controls this.\nHow can we control creativity? Well, saying that we can directly control creativity is a bit of a stretch. We can however use a workaround.\nDo you remember the softmax function? The function that takes a vector of arbitrary real-valued scores and squashes it into a vector of probabilities that sum to 1. The inputs to the softmax function are the unnormalized log likelikhoods or the raw per class score assigned by the model.\nThe softmax function is defined as: \\[ \\text{softmax}(x_i) = \\frac{e^{x_i}}{\\sum_{j=1}^{k} e^{x_j}} \\]\nIf we want more control over the distribution of the probabilities, we can use a temperature parameter. This would look like: \\[ \\text{softmax}(x_i) = \\frac{e^{x_i/T}}{\\sum_{j=1}^{k} e^{x_j/T}} \\] where \\(T\\) is the temperature parameter.\n\nIf \\(T = 1\\), the softmax function is the same as the original softmax function.\nIf \\(T > 1\\), the probabilities will become “flatter”. Since the difference between the probabilities will be less, the model can be more exploratory aka more creative.\nIf \\(T < 1\\), the distribution of the probabilities are “peakier”. There will be a higher difference between the probabilities, leading to the model being more confident in its predictions, but also less creative.\n\n\nVisualizing Temperature using Softmax\n\nfrom tqdm import tqdm\nimport regex as re\n# LangChain supports many other chat models. Here, we're using Ollama\nfrom langchain_community.chat_models import ChatOllama\nfrom langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.prompts import ChatPromptTemplate\nfrom typing import List, Dict, Any\nimport numpy as np \nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport pandas as pd \nsns.set_theme(style=\"white\")\n\n\ndef softmax(input, t=1.0):\n ex = np.exp(input/t)\n sum = np.sum(ex, axis=0)\n return ex / sum\n\n\n# plot softmax over a range of inputs\nx = np.arange(0,1.0, 0.01)\nt = np.array([0.1,.5, .8, 1.0])\ny = np.array([softmax(x, ti) for ti in t])\n\n# Create a DataFrame for Seaborn\ndata = pd.DataFrame({\n 'x': np.tile(x, len(t)),\n 'softmax': np.concatenate(y),\n 't': np.repeat(t, len(x))\n})\n\n# Plotting with Seaborn\nplt.figure(figsize=(8, 6))\nsns.lineplot(data=data, x='x', y='softmax', hue='t', palette='viridis')\nplt.xlabel('x')\nplt.ylabel('softmax(x)')\nplt.title('Softmax Function for Different Values of t')\nplt.legend(title='t')\nplt.show()" + }, + { + "objectID": "posts/Experiments-with-temperature/experiments_with_temp.html#creating-the-experimental-setup", + "href": "posts/Experiments-with-temperature/experiments_with_temp.html#creating-the-experimental-setup", + "title": "Experiments with Temperature", + "section": "Creating the Experimental Setup", + "text": "Creating the Experimental Setup\nNow, we can focus on testing the effects of temperature for our use case. We are using the llama3 model for our experiments. The experiments are being run on a 2023 MacBook Pro with an M3 chip and 18GB memory.\n\nDefining a Prompt\nWe need to first think of a prompt that we can use for our experiments. This prompt can be thought of as an instruction that the model uses along with the query to generate answers. To make it easier for us to use, we only want one/two word answers and for now we are only focusing on a small subset of the filters that we want our model to understand.\n\nprompt = \"\"\"User Query : {query}\nBased on the query, answer the following questions one by one in one or two words only and a maximum of two with commas only if asked for. Use only the information given and do not make up answers - \nDoes the user care about the size of the dataset? Yes/No and if yes, ascending/descending.\nDoes the user want to sort by number of downloads? Yes/No.\nDoes the user care about missing values? Yes/No.\nIf it seems like the user wants a classification dataset, is it binary/multi-class/multi-label? If not, say none.\n\"\"\"\n\n\nquery = \"Find me a big classification dataset about mushrooms\"\n\n\n\nCreating a Chain\nSince we are using the langchain and ollama libraries for our experiments, we follow their API and create a chain. The template uses string formatting to insert the prompt and the query into the chain.\n\ndef create_chain(prompt , temperature, llm_model = \"llama3\"):\n prompt = ChatPromptTemplate.from_template(prompt)\n llm = ChatOllama(model=llm_model, temperature=temperature)\n chain = prompt | llm | StrOutputParser()\n return chain\n\n\n\nParsing the Results\nTo make it easier for us to analyze the results, we generate an example answer and then see see if any further processing is needed.\n\n# functiont to parse responses like this to a list of yes/no/none/yes,aescending/no etc\ndef parse_response(response):\n # split by new line and remove first two lines (here are the answers:)\n response = response.split('\\n')[2::]\n # if response has a question mark, split by question mark and remove empty strings\n for i in range(len(response)):\n if '?' in response[i]:\n response[i] = response[i].split('?')[1].strip()\n # replace full stops with empty strings\n response = [x.replace('.','') for x in response]\n response = [x for x in response if x]\n return response\n\n\nchain = create_chain(prompt, 0.5)\nresponse = chain.invoke({\"query\": query})\nprint(response)\n\nHere are the answers:\n\n1. Does the user care about the size of the dataset?\nYes, ascending.\n\n2. Does the user want to sort by number of downloads?\nNo\n\n3. Does the user care about missing values?\nNo\n\n4. Is it a classification dataset? If so, is it binary/multi-class/multi-label?\nYes, multi-class\n\n\nYay, it works. We now write a function to generate results for different temperatures.\n\ndef generate_results_for_temp(query:str, range_of_temps : np.ndarray) -> List[List[str]]:\n results = []\n for temperature in tqdm(range_of_temps):\n chain = create_chain(prompt, temperature)\n response = chain.invoke({\"query\": query})\n results.append(parse_response(response))\n return results" + }, + { + "objectID": "posts/Experiments-with-temperature/experiments_with_temp.html#running-the-experiments-and-plotting-results", + "href": "posts/Experiments-with-temperature/experiments_with_temp.html#running-the-experiments-and-plotting-results", + "title": "Experiments with Temperature", + "section": "Running the Experiments and Plotting Results", + "text": "Running the Experiments and Plotting Results\nIt is time to run the experiments and plot the results. We write a function to plot the results in a stripplot to see the distribution of the answers for different temperatures.\n\ndef plot_yes_no(df: pd.DataFrame, title:str) -> None:\n fig, axs = plt.subplots(2, 2, figsize=(15, 15))\n fig.suptitle(title)\n sns.stripplot(data=df, x='size', y='temperature', ax=axs[0, 0], hue='size')\n sns.stripplot(data=df, x='sort_by_downloads', y='temperature', ax=axs[0, 1], hue='sort_by_downloads')\n sns.stripplot(data=df, x='missing_values', y='temperature', ax=axs[1, 0], hue='missing_values')\n sns.stripplot(data=df, x='classification_type', y='temperature', ax=axs[1, 1], hue='classification_type')\n # tilt x axis labels\n for ax in axs.flat:\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n plt.show()\n\nSometimes, the model returns an extra field, we combine the last two fields to plot the results. (This is a bit of a hack, but it works for now and is ONLY used for plotting)\n\ndef combine_last_two_elements(lst):\n # Check if the list has at least two elements\n if len(lst) > 4:\n # Combine the last two elements with a space separator\n combined_element = lst[-2] + ' ' + lst[-1]\n\n # Create a new list with combined element instead of the last two\n return lst[:-2] + [combined_element]\n else:\n return lst\n\n\nExperiment 1\nOut first experiment is a rather simple query, “Find me a big classification dataset about mushrooms”. As you can probably guess, we are looking for a dataset that is large, is a classification dataset and is about mushrooms.\n\nrange_of_temps = np.linspace(0, 1, 20)\nquery = \"Find me a big classification dataset about mushrooms\"\nresults1 = generate_results_for_temp(query, range_of_temps)\n\n100%|██████████| 20/20 [00:49<00:00, 2.49s/it]\n\n\n\nresults1 = [[y for y in x if all(sub not in y for sub in [\"If\", \":\"])] for x in results1]\n\n\ndf = pd.DataFrame(results1, columns = ['size', 'sort_by_downloads', 'missing_values', 'classification_type'])\ndf['temperature'] = range_of_temps\nplot_yes_no(df, title = query)\n\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n\n\n\n\n\n\n\n\n\nRather interesting don’t you think? At higher temperatures, the model gets the answers wrong. Even at a temperature slightly above 0.1, the model starts adding extra information to it’s answers.\nDid you notice that I tried to remove sentences that started with “If”? There are more examples of this later, but this is because at higher temperatures, the model tends to add random sentences to the answers and this makes it quite hard to plot them.\n\n\nExperiment 2\nOur second experiment is super easy. “Find me a dataset that has a lot of missing values and order by number of downloads”. As you can obviously guess, we are looking for a dataset that has a lot of missing values and we want to order the results by the number of downloads.\n\nrange_of_temps = np.linspace(0, 1, 20)\nquery = \"Find me a dataset that has a lot of missing values and order by number of downloads\"\nresults2 = generate_results_for_temp(query, range_of_temps)\nresults2 = [[y for y in x if \"so\" not in y] for x in results2]\n\n100%|██████████| 20/20 [00:34<00:00, 1.74s/it]\n\n\n\ndf = pd.DataFrame(results2, columns = ['size', 'sort_by_downloads', 'missing_values', 'classification_type'])\ndf['temperature'] = range_of_temps\nplot_yes_no(df, title = query)\n\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n\n\n\n\n\n\n\n\n\nHmm, same as before. The model starts adding extra information at higher temperatures and starts getting the answers wrong. (Yes, No?? ) What kind of answer is that?" + }, + { + "objectID": "posts/Experiments-with-temperature/experiments_with_temp.html#experiment-3", + "href": "posts/Experiments-with-temperature/experiments_with_temp.html#experiment-3", + "title": "Experiments with Temperature", + "section": "Experiment 3", + "text": "Experiment 3\n\nNow a slightly more complex query. “Find me a dataset that has 10 classes and sort by number of downloads”. We want it to understand that we want a multiclass classification dataset and we want to sort the results by the number of downloads.\n\n\nrange_of_temps = np.linspace(0, 1, 20)\nquery = \"Find me a dataset that has 10 classes and sort by number of downloads\"\nresults3 = generate_results_for_temp(query, range_of_temps)\n\n100%|██████████| 20/20 [00:55<00:00, 2.80s/it]\n\n\n\nresults3 = [combine_last_two_elements(x) for x in results3]\n\n\ndf = pd.DataFrame(results3, columns = ['size', 'sort_by_downloads', 'missing_values', 'classification_type'])\ndf['temperature'] = range_of_temps\nplot_yes_no(df, title = query)\n\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n\n\n\n\n\n\n\n\n\nThis seems to have been very easy for the model. But as always, the model starts adding extra information at higher temperatures. A lot of extra information in fact. Even though the prompt says to ONLY answer with one or two words" + }, + { + "objectID": "posts/Experiments-with-temperature/experiments_with_temp.html#experiment-4", + "href": "posts/Experiments-with-temperature/experiments_with_temp.html#experiment-4", + "title": "Experiments with Temperature", + "section": "Experiment 4", + "text": "Experiment 4\n\n“Find me a dataset that 2 classes and is a big dataset”. You know the drill by now. We want a binary classification dataset that is large.\n\n\nrange_of_temps = np.linspace(0, 1, 20)\nquery = \"Find me a dataset that 2 classes and is a big dataset\"\nresults4 = generate_results_for_temp(query, range_of_temps)\n\n100%|██████████| 20/20 [00:42<00:00, 2.14s/it]\n\n\n\nresults4 = [combine_last_two_elements(x) for x in results4]\n\n\ndf = pd.DataFrame(results4, columns = ['size', 'sort_by_downloads', 'missing_values', 'classification_type'])\ndf['temperature'] = range_of_temps\nplot_yes_no(df, title = query)\n\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n\n\n\n\n\n\n\n\n\nNotice how some things changed? At higher temperatures, we get extended answers." + }, + { + "objectID": "posts/Experiments-with-temperature/experiments_with_temp.html#conclusion", + "href": "posts/Experiments-with-temperature/experiments_with_temp.html#conclusion", + "title": "Experiments with Temperature", + "section": "Conclusion", + "text": "Conclusion\nIn conclusion, we can see that we should probably stick to lower temperatures for our use case. As we go higher, the model starts being more “creative” and either adds extra information to the answers or gets them wrong. While this behaviour might be useful in cases like creative writing, it is not something we want in our search.\nUsing LLMs can sometimes be a bit of a hit or miss. But of course, learning to control it’s parameters can help us get the most out of it. This blog post was just a simple experiment, but in the deluge of content made by people who have no idea what Softmax is, I hope this was helpful." + }, + { + "objectID": "posts/2019-10-24-OpenML-workshop-at-Dagstuhl/2019-10-24-OpenML-workshop-at-Dagstuhl.html", + "href": "posts/2019-10-24-OpenML-workshop-at-Dagstuhl/2019-10-24-OpenML-workshop-at-Dagstuhl.html", + "title": "OpenML workshop at Dagstuhl", + "section": "", + "text": "October 2019\nTwice a year the OpenML community meets for a workshop/hackathon/unconference. We improve the platform, discuss and learn for 5 days. If that sounds interesting to you, get in touch or follow updates on meet.openml.org.\nThis time the workshop took place at Dagstuhl, a great place for Seminars.\n\n\n\n\nGroup pictures\n\n\nWe had several breakouts where workshop attendees can join to learn, discuss and progress OpenML. In the following we discuss some of the topics we touched.\nScience projects\nBrainstorm on scientific projects to do with OpenML. Prioritize impactful, well-defined research ideas. We came up with quite a long list of very promising research questions that should actually be quite easy to answer based on OpenML. Many of these are along the lines of empirically providing evidence to verify or bust commonly-held beliefs in the community. Frank would gladly hire a strong postdoc (or quite independent PhD student) and maybe a research engineer, to work on these scientific questions under the umbrella of “evidence-based machine learning with OpenML”.\nBenchmarking using OpenML\nDefine guidelines on how to define world-class benchmarks and how to run them.\nDiverse datasets\nNew and more diverse datasets.\nDataset quality\nHow to measure data quality and how to improve the quality of datasets on OpenML.\nOpenML use cases for novices\nShortlist common use cases and start writing accessible blog posts for novice users. If you are a OpenML newbie we need your help with this topic.\nThe output of this breakout will be at least one blog post. Keep an eye out for them here :)\nRunning a competition using OpenML\nWe assessed the current issues with running in-class competitions for teaching purposes using OpenML (biggest one: easy use for non-developers) and brainstormed on a new competition format with related competitions, one for each component of a solution, such as HPO, creating good meta-features, creating a good search space, etc.\nPlanning future workshops\nDecide on location and timing for the next couple of workshops. The next OpenML workshop will be in Spring (week of March 30th or week of April 14th) close to Munich. For updates check http://meet.openml.org. The workshop will be cohosted with some other Open Source Machine Learning projects.\nFurthermore a workshop in Austin is being planned for next summer and a datathon is in planning. We are planning to organize dev sprints at various PyCons next year.\nNew frontend\nFeedback session on new frontend, Additional visualization for datasets\nFuture of client APIs\nCurrently, a lot of resources are bound developing different client APIs, such as the Python API, R API and Java API. We discussed how we can better share work and code between the different APIs and the server. For now we are working on automatically generating the Swagger API documentation from the PHP function documentation, which in turn will allow us to generate (documented) parts of the APIs, reduce the need for maintenance and will help to spread updates on the API faster.\nFlow 2.0 design\nCurrent flow design used in OpenML was inspired by Weka, but through time many limitations have been identified, primarily that existing flow does not allow duplicate use of same component and that it cannot express DAG-based ML programs. We started working on a new specification building on insights from mlr3 and d3m projects, centered around DAG representation. Current plan is to prepare a draft specification and implement prototype converters between other systems and this new specification. Once we do that we will re-evaluate the amount of work it took to build those prototypes and how well the specification satisfied those other systems.\nRandom Bot\nThe LRZ in Munich provided us with CPU time during the SuperMUC-NG supercomputer test phase, which we used to perform experiments of popular machine learning algorithms with random hyperparameter configurations. This resulted in millions of data points on more than a hundred datasets that we will analyse and publish. The data can be used to learn about typical behaviour of different learners across different datasets, and to construct surrogate models for tuning algorithm benchmarks.\nAutoML Benchmark (Janek)\nA study was created containing 76 binary and multiclass tasks of reasonable difficulty.\nThese can be used as a more difficult version of OpenML-100 or in amlb a platform for reproducible benchmarking of AutoML systems.\nR API\nShort session on how the R api will (need to) change. The main issue discussed was that the OpenML R package runs with mlr and breaks when the new package (mlr3) is loaded. We will update the current OpenML R package to work with mlr3. At the same time we are thinking about a vision for a rewrite of the OpenML R package.\nPython API\nWe made a lot of improvements to the Python API over the week, with over 20 PRs merged! We’ve added more examples on how to use the package, fixed bugs, improved documentation and refactored code. In the coming days we’re going to make all these improvements available in a new PyPI release. For those looking for a higher level overview of the package, we will publish a paper next week which highlights use-cases, its software design, and project structure.\nBenchmarking paper\nWe are working on a comprehensive paper using sklearn, mlr and WEKA, which should demonstrate how OpenML can be used for proper benchmarking and analysis.\nGuidelines / Overfitting / Comparable Metalearning\nThere are plans for writing a guidelines and pitfalls paper on benchmarking, meta-overfitting and statistical analysis of results on OpenML.\nData Formats\nCurrently OpenML supports only tabular data in ARFF data format. This is very limiting for many ML tasks. We discussed and explored other data formats we could use as the future next data format. We will post a separate blog post about our process and insights.\nFunding\nOpenML is looking for funding (developers). New ideas on obtaining funding are very welcome. We discussed some ideas: American funding (we need a collaboration partner); ALICE / CLAIRE; Companies. We are a foundation now, which might make it easier.\nSome of the PIs (in particular Bernd Bischl, Frank Hutter and Dawn Song) in the project offer positions with a mix of ML research and development. Contact them if you are interested!\n\n\n\n\nSketch of the OpenML infrastructure (left), Breakout overview of Tuesday (right)\n\n\nWe had some talks at the workshop as well:\n\nMitar Milutinovic: A short introduction to Data Driven Discovery (D3M)\nYiwen Zhu and Markus Weimer: Large-scale analysis of Jupyter notebooks\nMartin Binder, Michel Lang, Florian Pfisterer, Bernd Bischl: Pipelining with mlr3\n\n… and lots of fun…\n\n\n\nOn the hike\n\n\nWanna join the OpenML community? Get in touch!" + }, + { + "objectID": "posts/2019-10-26-OpenML-Machine-Learning-as-a-community/2019-10-26-OpenML-Machine-Learning-as-a-community.html", + "href": "posts/2019-10-26-OpenML-Machine-Learning-as-a-community/2019-10-26-OpenML-Machine-Learning-as-a-community.html", + "title": "OpenML - Machine Learning as a community", + "section": "", + "text": "OpenML is an online Machine Learning (ML) experiments database accessible to everyone for free. The core idea is to have a single repository of datasets and results of ML experiments on them. Despite having gained a lot of popularity in recent years, with a plethora of tools now available, the numerous ML experimentations continue to happen in silos and not necessarily as one whole shared community. In this post, we shall try to get a brief glimpse of what OpenML offers and how it can fit our current Machine Learning practices.\nLet us jump straight at getting our hands dirty by building a simple machine learning model. If it is simplicity we are looking for, it has to be the Iris dataset that we shall work with. In the example script below, we are going to load the Iris dataset available with scikit-learn, use 10-fold cross-validation to evaluate a Random Forest of 10 trees. Sounds trivial enough and is indeed less than 10 lines of code.\n\nfrom sklearn import datasets\nfrom sklearn.svm import SVC\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.model_selection import cross_val_score\n\n\n# Loading Iris dataset\nX, y = datasets.load_iris(return_X_y=True)\nprint(X.shape, y.shape)\n\n(150, 4) (150,)\n\n\n\n# Initializing a Random Forest with \n# arbitrary hyperparameters\n# max_depth kept as 2 since Iris has\n# only 4 features\nclf = RandomForestClassifier(n_estimators=10, max_depth=2)\n\n\nscores = cross_val_score(clf, X, y, cv=5, scoring='accuracy')\nprint(\"Mean score : {:.5f}\".format(scores.mean()))\n\nMean score : 0.94000\n\n\nA simple script and we achieve a mean accuracy of 95.33%. That was easy. It is really amazing how far we have come with ML tools that make it easy to get started. As a result, we have hundreds of thousands of people working with these tools every day. That inevitably leads to the reinvention of the wheel. The tasks that each individual ML practitioner performs often have significant overlaps and can be omitted by reusing what someone from the community has done already. At the end of the day, we didn’t build a Random Forest model all the way from scratch. We gladly reused code written by generous folks from the community. The special attribute of our species is the ability to work as a collective wherein our combined intellect becomes larger than the individual sum of parts. Why not do the same for ML? I mean, can I see what other ML practitioners have done to get better scores on the Iris dataset?\nAnswering this is one of the targets of this post. We shall subsequently explore if this can be done, with the help of OpenML. However, first, we shall briefly familiarize ourselves with few terminologies and see how we can split the earlier example we saw into modular components.\n\nOpenML Components\n\nImage source: https://medium.com/open-machine-learning/openml-1e0d43f0ae13\nDataset: OpenML houses over 2k+ active datasets for various regression, classification, clustering, survival analysis, stream processing tasks and more. Any user can upload a dataset. Once uploaded, the server computes certain meta-features on the dataset - Number of classes, Number of missing values, Number of features, etc. With respect to our earlier example, the following line is the equivalent of fetching a dataset from OpenML.\n\nX, y = datasets.load_iris(return_X_y=True)\n\nTask: A task is linked to a specific dataset, defining what the target/dependent variable is. Also specifies evaluation measures such as - accuracy, precision, area under curve, etc. or the kind of estimation procedure to be used such as - 10-fold cross-validation, n% holdout set, etc. With respect to our earlier example, the parameters to the following function call capture the idea of a task.\n\nscores = cross_val_score(clf, X, y, cv=5, scoring='accuracy')\n\nFlow: Describes the kind of modelling to be performed. It could be a flow or a series of steps, i.e., a scikit-learn pipeline. For now, we have used a simple Random Forest model which is the flow component here.\n\nclf = RandomForestClassifier(n_estimators=10, max_depth=2)\n\nRun: Pairs a flow and task together which results in a run. The run has the predictions which are turned into evaluations by the server. This is effectively captured by the execution of the line:\n\nscores = cross_val_score(clf, X, y, cv=5, scoring='accuracy')\n\nNow, this may appear a little obfuscating given that we are trying to compartmentalize a simple 10-line code which works just fine. However, if we take a few seconds to go through the 4 components explained above, we can see that it makes our training of a Random Forest on Iris a series of modular tasks. Modules are such a fundamental concept in Computer Science. They are like Lego blocks. Once we have modules, it means we can plug and play at ease. The code snippet below attempts to rewrite the earlier example using the ideas of the OpenML components described, to give a glimpse of what we can potentially gain during experimentations.\n\nfrom sklearn import datasets\nfrom sklearn.svm import SVC\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.model_selection import cross_val_score\n\n\nDATASET component\n\n# To load IRIS dataset as a dataset module/component\ndef dataset():\n X, y = datasets.load_iris(return_X_y=True)\n return X, y\n\n\n\nTASK component\n\n# Tasks here define the number of cross-validation folds\n# and the scoring metric to be used for evaluation\ndef task_1(f):\n X, y = dataset() # loads IRIS\n return cross_val_score(f, X, y, cv=5, \n scoring='accuracy')\n\ndef task_2(f):\n X, y = dataset() # loads IRIS\n return cross_val_score(f, X, y, cv=15, \n scoring='balanced_accuracy')\n\n\n\nFLOW component\n\n# Flows determine the modelling technique to be applied\n# Helps define a model irrespective of dataset or tasks\ndef flow_1():\n clf = RandomForestClassifier(n_estimators=10, max_depth=2)\n return clf\n\ndef flow_2():\n clf = SVC(gamma='auto', kernel='linear')\n return clf \n\n\n\nRUN component\n\n# Runs essentially evaluates a task-flow pairing \n# and therefore in effect executs the modelling \n# of a dataset as per the task task definition\ndef run(task, flow):\n return task(flow)\n\n\n# Results for Random Forest\nrf_task_1 = run(task_1, flow_1())\nrf_task_2 = run(task_2, flow_1())\nprint(\"RF using task 1: {:<.5}; task 2: {:<.5}\".format(rf_task_1.mean(), rf_task_2.mean()))\n\n# Results for SVM\nsvm_task_1 = run(task_1, flow_2())\nsvm_task_2 = run(task_2, flow_2())\nprint(\"SVM using task 1: {:<.5}; task 2: {:<.5}\".format(svm_task_1.mean(), svm_task_2.mean()))\n\nRF using task 1: 0.95333; task 2: 0.94444\nSVM using task 1: 0.98; task 2: 0.97222\n\n\nWe can, therefore, compose various different tasks, flows, which are independent operations. Runs can then pair any such task and flow to construct an ML workflow and return the evaluated scores. This approach can help us define such components one-time, and we can extend this for any combination of a dataset, model, and for any number of evaluations in the future. Imagine if the entire ML community defines such tasks and various simple to complicated flows that they use in their daily practice. We can build custom working ML pipeline and even get to compare performances of our techniques on the same task with others! OpenML aims exactly for that. In the next section of this post, we shall scratch the surface of OpenML to see if we can actually do with OpenML what it promises.\n\n\n\nUsing OpenML\nOpenML-Python can be installed using pip or by cloning the git repo and installing the current development version. So shall we then install OpenML? ;) It will be beneficial if the code snippets are tried out as this post is read. A consolidated Jupyter notebook with all the code can be found here.\nNow that we have OpenML, let us jump straight into figuring out how we can get the Iris dataset from there. We can always browse theOpenML website and search for Iris. That is the easy route. Let us get familiar with the programmatic approach and learn how to fish instead. The OpenML-Python API can be found here.\n\nRetrieving Iris from OpenML\nIn the example below, we will list out all possible datasets available in OpenML. We can choose the output format. I’ll go with dataframe so that we obtain a pandas DataFrame and can get a neat tabular representation to search and sort specific entries.\n\nimport openml\n\nimport numpy as np\nimport pandas as pd\n\n\n# Fetching the list of all available datasets on OpenML\nd = openml.datasets.list_datasets(output_format='dataframe')\nprint(d.shape)\n\n# Listing column names or attributes that OpenML offers\nfor name in d.columns:\n print(name)\n\n(3073, 16)\ndid\nname\nversion\nuploader\nstatus\nformat\nMajorityClassSize\nMaxNominalAttDistinctValues\nMinorityClassSize\nNumberOfClasses\nNumberOfFeatures\nNumberOfInstances\nNumberOfInstancesWithMissingValues\nNumberOfMissingValues\nNumberOfNumericFeatures\nNumberOfSymbolicFeatures\n\n\n\nprint(d.head())\n\n did name version uploader status format MajorityClassSize \\\n2 2 anneal 1 1 active ARFF 684.0 \n3 3 kr-vs-kp 1 1 active ARFF 1669.0 \n4 4 labor 1 1 active ARFF 37.0 \n5 5 arrhythmia 1 1 active ARFF 245.0 \n6 6 letter 1 1 active ARFF 813.0 \n\n MaxNominalAttDistinctValues MinorityClassSize NumberOfClasses \\\n2 7.0 8.0 5.0 \n3 3.0 1527.0 2.0 \n4 3.0 20.0 2.0 \n5 13.0 2.0 13.0 \n6 26.0 734.0 26.0 \n\n NumberOfFeatures NumberOfInstances NumberOfInstancesWithMissingValues \\\n2 39.0 898.0 898.0 \n3 37.0 3196.0 0.0 \n4 17.0 57.0 56.0 \n5 280.0 452.0 384.0 \n6 17.0 20000.0 0.0 \n\n NumberOfMissingValues NumberOfNumericFeatures NumberOfSymbolicFeatures \n2 22175.0 6.0 33.0 \n3 0.0 0.0 37.0 \n4 326.0 8.0 9.0 \n5 408.0 206.0 74.0 \n6 0.0 16.0 1.0 \n\n\nThe column names indicate that they contain the meta-information about each of the datasets, and at this instance, we have access to 2958 datasets as indicated by the shape of the dataframe. We shall try searching for ‘iris’ in the column name and also use the version column to sort the results.\n\n# Filtering dataset list to have 'iris' in the 'name' column\n# then sorting the list based on the 'version'\nd[d['name'].str.contains('iris')].sort_values(by='version').head()\n\n\n\n\n\n\n\n\ndid\nname\nversion\nuploader\nstatus\nformat\nMajorityClassSize\nMaxNominalAttDistinctValues\nMinorityClassSize\nNumberOfClasses\nNumberOfFeatures\nNumberOfInstances\nNumberOfInstancesWithMissingValues\nNumberOfMissingValues\nNumberOfNumericFeatures\nNumberOfSymbolicFeatures\n\n\n\n\n61\n61\niris\n1\n1\nactive\nARFF\n50.0\n3.0\n50.0\n3.0\n5.0\n150.0\n0.0\n0.0\n4.0\n1.0\n\n\n41950\n41950\niris_test_upload\n1\n4030\nactive\nARFF\n50.0\n3.0\n50.0\n3.0\n5.0\n150.0\n0.0\n0.0\n4.0\n1.0\n\n\n42261\n42261\niris-example\n1\n348\nactive\nARFF\n50.0\nNaN\n50.0\n3.0\n5.0\n150.0\n0.0\n0.0\n4.0\n1.0\n\n\n451\n451\nirish\n1\n2\nactive\nARFF\n278.0\n10.0\n222.0\n2.0\n6.0\n500.0\n32.0\n32.0\n2.0\n4.0\n\n\n969\n969\niris\n3\n2\nactive\nARFF\n100.0\n2.0\n50.0\n2.0\n5.0\n150.0\n0.0\n0.0\n4.0\n1.0\n\n\n\n\n\n\n\nOkay, so the iris dataset with the version as 1 has an ID of 61. For verification, we can check the website for dataset ID 61. We can see that it is the original Iris dataset which is of interest to us - 3 classes of 50 instances, with 4 numeric features. However, we shall retrieve the same information, as promised, programmatically.\n\niris = openml.datasets.get_dataset(61)\niris\n\nOpenML Dataset\n==============\nName..........: iris\nVersion.......: 1\nFormat........: ARFF\nUpload Date...: 2014-04-06 23:23:39\nLicence.......: Public\nDownload URL..: https://www.openml.org/data/v1/download/61/iris.arff\nOpenML URL....: https://www.openml.org/d/61\n# of features.: 5\n# of instances: 150\n\n\n\niris.features\n\n{0: [0 - sepallength (numeric)],\n 1: [1 - sepalwidth (numeric)],\n 2: [2 - petallength (numeric)],\n 3: [3 - petalwidth (numeric)],\n 4: [4 - class (nominal)]}\n\n\n\nprint(iris.description)\n\n**Author**: R.A. Fisher \n**Source**: [UCI](https://archive.ics.uci.edu/ml/datasets/Iris) - 1936 - Donated by Michael Marshall \n**Please cite**: \n\n**Iris Plants Database** \nThis is perhaps the best known database to be found in the pattern recognition literature. Fisher's paper is a classic in the field and is referenced frequently to this day. (See Duda & Hart, for example.) The data set contains 3 classes of 50 instances each, where each class refers to a type of iris plant. One class is linearly separable from the other 2; the latter are NOT linearly separable from each other.\n\nPredicted attribute: class of iris plant. \nThis is an exceedingly simple domain. \n \n### Attribute Information:\n 1. sepal length in cm\n 2. sepal width in cm\n 3. petal length in cm\n 4. petal width in cm\n 5. class: \n -- Iris Setosa\n -- Iris Versicolour\n -- Iris Virginica\n\n\nWith the appropriate dataset available, let us briefly go back to the terminologies we discussed earlier. We have only used the dataset component so far. The dataset component is closely tied with the task component. To reiterate, the task would describe how the dataset will be used.\n\n\nRetrieving relevant tasks from OpenML\nWe shall firstly list all available tasks that work with the Iris dataset. However, we are only treating Iris as a supervised classification problem and hence will filter accordingly. Following which, we will collect only the task IDs of the tasks relevant to us.\n\ndf = openml.tasks.list_tasks(data_id=61, output_format='dataframe')\ndf.head()\n\n\n\n\n\n\n\n\ntid\nttid\ndid\nname\ntask_type\nstatus\nestimation_procedure\nevaluation_measures\nsource_data\ntarget_feature\n...\nNumberOfFeatures\nNumberOfInstances\nNumberOfInstancesWithMissingValues\nNumberOfMissingValues\nNumberOfNumericFeatures\nNumberOfSymbolicFeatures\nnumber_samples\ncost_matrix\nquality_measure\ntarget_value\n\n\n\n\n59\n59\n1\n61\niris\nSupervised Classification\nactive\n10-fold Crossvalidation\npredictive_accuracy\n61\nclass\n...\n5\n150\n0\n0\n4\n1\nNaN\nNaN\nNaN\nNaN\n\n\n118\n118\n3\n61\niris\nLearning Curve\nactive\n10 times 10-fold Learning Curve\npredictive_accuracy\n61\nclass\n...\n5\n150\n0\n0\n4\n1\n4\nNaN\nNaN\nNaN\n\n\n289\n289\n1\n61\niris\nSupervised Classification\nactive\n33% Holdout set\npredictive_accuracy\n61\nclass\n...\n5\n150\n0\n0\n4\n1\nNaN\nNaN\nNaN\nNaN\n\n\n1758\n1758\n3\n61\niris\nLearning Curve\nactive\n10-fold Learning Curve\npredictive_accuracy\n61\nclass\n...\n5\n150\n0\n0\n4\n1\n4\nNaN\nNaN\nNaN\n\n\n1823\n1823\n1\n61\niris\nSupervised Classification\nactive\n5 times 2-fold Crossvalidation\npredictive_accuracy\n61\nclass\n...\n5\n150\n0\n0\n4\n1\nNaN\nNaN\nNaN\nNaN\n\n\n\n\n5 rows × 24 columns\n\n\n\n\n# Filtering only the Supervised Classification tasks on Iris\ndf.query(\"task_type=='Supervised Classification'\").head()\n\n\n\n\n\n\n\n\ntid\nttid\ndid\nname\ntask_type\nstatus\nestimation_procedure\nevaluation_measures\nsource_data\ntarget_feature\n...\nNumberOfFeatures\nNumberOfInstances\nNumberOfInstancesWithMissingValues\nNumberOfMissingValues\nNumberOfNumericFeatures\nNumberOfSymbolicFeatures\nnumber_samples\ncost_matrix\nquality_measure\ntarget_value\n\n\n\n\n59\n59\n1\n61\niris\nSupervised Classification\nactive\n10-fold Crossvalidation\npredictive_accuracy\n61\nclass\n...\n5\n150\n0\n0\n4\n1\nNaN\nNaN\nNaN\nNaN\n\n\n289\n289\n1\n61\niris\nSupervised Classification\nactive\n33% Holdout set\npredictive_accuracy\n61\nclass\n...\n5\n150\n0\n0\n4\n1\nNaN\nNaN\nNaN\nNaN\n\n\n1823\n1823\n1\n61\niris\nSupervised Classification\nactive\n5 times 2-fold Crossvalidation\npredictive_accuracy\n61\nclass\n...\n5\n150\n0\n0\n4\n1\nNaN\nNaN\nNaN\nNaN\n\n\n1939\n1939\n1\n61\niris\nSupervised Classification\nactive\n10 times 10-fold Crossvalidation\npredictive_accuracy\n61\nclass\n...\n5\n150\n0\n0\n4\n1\nNaN\nNaN\nNaN\nNaN\n\n\n1992\n1992\n1\n61\niris\nSupervised Classification\nactive\nLeave one out\npredictive_accuracy\n61\nclass\n...\n5\n150\n0\n0\n4\n1\nNaN\nNaN\nNaN\nNaN\n\n\n\n\n5 rows × 24 columns\n\n\n\n\n# Collecting all relevant task_ids\ntasks = df.query(\"task_type=='Supervised Classification'\")['tid'].to_numpy()\nprint(len(tasks))\n\n13\n\n\nThat settles the task component too. Notice how for one dataset (61), we obtain 11 task IDs which are of interest to us. This should illustrate the one-to-many relationship that dataset-task components can have. We have 2 more components to explore - flows, runs. We could list out all possible flows and filter out the ones we want, i.e., Random Forest. However, let us instead fetch all the evaluations made on the Iris dataset using the 11 tasks we collected above.\nWe shall subsequently work with the scikit-learn based task which has been uploaded/used the most. We shall then further filter out the list of evaluations from the selected task (task_id=59 in this case), depending on if Random Forest was used.\n\n# Listing all evaluations made on the 11 tasks collected above\n# with evaluation metric as 'predictive_accuracy'\ntask_df = openml.evaluations.list_evaluations(function='predictive_accuracy', task=tasks, output_format='dataframe')\ntask_df.head()\n\n\n\n\n\n\n\n\nrun_id\ntask_id\nsetup_id\nflow_id\nflow_name\ndata_id\ndata_name\nfunction\nupload_time\nuploader\nuploader_name\nvalue\nvalues\narray_data\n\n\n\n\n0\n81\n59\n12\n67\nweka.BayesNet_K2(1)\n61\niris\npredictive_accuracy\n2014-04-07 00:05:11\n1\njanvanrijn@gmail.com\n0.940000\nNone\nNone\n\n\n1\n161\n59\n13\n70\nweka.SMO_PolyKernel(1)\n61\niris\npredictive_accuracy\n2014-04-07 00:55:32\n1\njanvanrijn@gmail.com\n0.960000\nNone\nNone\n\n\n2\n234\n59\n1\n56\nweka.ZeroR(1)\n61\niris\npredictive_accuracy\n2014-04-07 01:33:24\n1\njanvanrijn@gmail.com\n0.333333\nNone\nNone\n\n\n3\n447\n59\n6\n61\nweka.REPTree(1)\n61\niris\npredictive_accuracy\n2014-04-07 06:26:27\n1\njanvanrijn@gmail.com\n0.926667\nNone\nNone\n\n\n4\n473\n59\n18\n77\nweka.LogitBoost_DecisionStump(1)\n61\niris\npredictive_accuracy\n2014-04-07 06:39:27\n1\njanvanrijn@gmail.com\n0.946667\nNone\nNone\n\n\n\n\n\n\n\n\n# Filtering based on sklearn (scikit-learn)\ntask_df = task_df[task_df['flow_name'].str.contains(\"sklearn\")]\ntask_df.head()\n\n\n\n\n\n\n\n\nrun_id\ntask_id\nsetup_id\nflow_id\nflow_name\ndata_id\ndata_name\nfunction\nupload_time\nuploader\nuploader_name\nvalue\nvalues\narray_data\n\n\n\n\n144\n1849043\n59\n29015\n5500\nsklearn.ensemble.forest.RandomForestClassifier...\n61\niris\npredictive_accuracy\n2017-03-03 17:10:12\n1\njanvanrijn@gmail.com\n0.946667\nNone\nNone\n\n\n145\n1853409\n59\n30950\n5873\nsklearn.pipeline.Pipeline(Imputer=openml.utils...\n61\niris\npredictive_accuracy\n2017-03-21 22:08:01\n1\njanvanrijn@gmail.com\n0.960000\nNone\nNone\n\n\n146\n6130126\n59\n4163633\n7108\nsklearn.model_selection._search.RandomizedSear...\n61\niris\npredictive_accuracy\n2017-08-21 11:07:40\n1\njanvanrijn@gmail.com\n0.960000\nNone\nNone\n\n\n147\n6130128\n59\n4163634\n7108\nsklearn.model_selection._search.RandomizedSear...\n61\niris\npredictive_accuracy\n2017-08-21 11:08:06\n1\njanvanrijn@gmail.com\n0.946667\nNone\nNone\n\n\n148\n6715383\n59\n4747289\n7117\nsklearn.model_selection._search.RandomizedSear...\n61\niris\npredictive_accuracy\n2017-09-01 02:56:44\n1\njanvanrijn@gmail.com\n0.960000\nNone\nNone\n\n\n\n\n\n\n\n\n# Counting frequency of the different tasks used to\n# solve Iris as a supervised classification using scikit-learn\ntask_df['task_id'].value_counts()\n\n59 1985\n10107 25\n289 1\nName: task_id, dtype: int64\n\n\n\n# Retrieving the most used task\nt = openml.tasks.get_task(59)\nt\n\nOpenML Classification Task\n==========================\nTask Type Description: https://www.openml.org/tt/1\nTask ID..............: 59\nTask URL.............: https://www.openml.org/t/59\nEstimation Procedure.: crossvalidation\nEvaluation Measure...: predictive_accuracy\nTarget Feature.......: class\n# of Classes.........: 3\nCost Matrix..........: Available\n\n\n\n# Filtering for only task_id=59\ntask_df = task_df.query(\"task_id==59\")\n\n\n# Filtering based on Random Forest\ntask_rf = task_df[task_df['flow_name'].str.contains(\"RandomForest\")]\ntask_rf.head()\n\n\n\n\n\n\n\n\nrun_id\ntask_id\nsetup_id\nflow_id\nflow_name\ndata_id\ndata_name\nfunction\nupload_time\nuploader\nuploader_name\nvalue\nvalues\narray_data\n\n\n\n\n144\n1849043\n59\n29015\n5500\nsklearn.ensemble.forest.RandomForestClassifier...\n61\niris\npredictive_accuracy\n2017-03-03 17:10:12\n1\njanvanrijn@gmail.com\n0.946667\nNone\nNone\n\n\n145\n1853409\n59\n30950\n5873\nsklearn.pipeline.Pipeline(Imputer=openml.utils...\n61\niris\npredictive_accuracy\n2017-03-21 22:08:01\n1\njanvanrijn@gmail.com\n0.960000\nNone\nNone\n\n\n146\n6130126\n59\n4163633\n7108\nsklearn.model_selection._search.RandomizedSear...\n61\niris\npredictive_accuracy\n2017-08-21 11:07:40\n1\njanvanrijn@gmail.com\n0.960000\nNone\nNone\n\n\n147\n6130128\n59\n4163634\n7108\nsklearn.model_selection._search.RandomizedSear...\n61\niris\npredictive_accuracy\n2017-08-21 11:08:06\n1\njanvanrijn@gmail.com\n0.946667\nNone\nNone\n\n\n190\n6946499\n59\n4978397\n7109\nsklearn.pipeline.Pipeline(imputation=openmlstu...\n61\niris\npredictive_accuracy\n2017-09-02 22:06:32\n1\njanvanrijn@gmail.com\n0.920000\nNone\nNone\n\n\n\n\n\n\n\n\n\nRetrieving top-performing models from OpenML\nSince we are an ambitious bunch of ML practitioners who settle for nothing but the best, and also since most results will not be considered worth the effort if not matching or beating state-of-the-art, we shall aim for the best scores. We’ll sort the filtered results we obtained based on the score or ‘value’ and then extract the components from that run - task and flow.\n\ntask_rf.sort_values(by='value', ascending=False).head()\n\n\n\n\n\n\n\n\nrun_id\ntask_id\nsetup_id\nflow_id\nflow_name\ndata_id\ndata_name\nfunction\nupload_time\nuploader\nuploader_name\nvalue\nvalues\narray_data\n\n\n\n\n3549\n523926\n59\n3526\n2629\nsklearn.ensemble.forest.RandomForestClassifier(8)\n61\niris\npredictive_accuracy\n2016-02-11 22:05:23\n869\np.gijsbers@student.tue.nl\n0.966667\nNone\nNone\n\n\n4353\n8955370\n59\n6890988\n7257\nsklearn.ensemble.forest.RandomForestClassifier...\n61\niris\npredictive_accuracy\n2018-04-06 16:32:22\n3964\nclear.tsai@gmail.com\n0.960000\nNone\nNone\n\n\n3587\n1852682\n59\n29263\n5500\nsklearn.ensemble.forest.RandomForestClassifier...\n61\niris\npredictive_accuracy\n2017-03-15 22:55:18\n1022\nrso@randalolson.com\n0.960000\nNone\nNone\n\n\n4375\n8886608\n59\n6835139\n7961\nsklearn.pipeline.Pipeline(Imputer=sklearn.prep...\n61\niris\npredictive_accuracy\n2018-03-17 16:46:27\n5032\nrashmi.kamath01@gmail.com\n0.960000\nNone\nNone\n\n\n3107\n1843272\n59\n24071\n4830\nsklearn.ensemble.forest.RandomForestClassifier...\n61\niris\npredictive_accuracy\n2016-12-08 20:10:03\n2\njoaquin.vanschoren@gmail.com\n0.960000\nNone\nNone\n\n\n\n\n\n\n\n\n# Fetching the Random Forest flow with the best score\nf = openml.flows.get_flow(2629)\nf\n\nOpenML Flow\n===========\nFlow ID.........: 2629 (version 8)\nFlow URL........: https://www.openml.org/f/2629\nFlow Name.......: sklearn.ensemble.forest.RandomForestClassifier\nFlow Description: Flow generated by openml_run\nUpload Date.....: 2016-02-11 21:17:08\nDependencies....: None\n\n\n\n# Fetching the run with the best score for\n# Random Forest on Iris\nr = openml.runs.get_run(523926)\nr\n\nOpenML Run\n==========\nUploader Name...: Pieter Gijsbers\nUploader Profile: https://www.openml.org/u/869\nMetric..........: predictive_accuracy\nResult..........: 0.966667\nRun ID..........: 523926\nRun URL.........: https://www.openml.org/r/523926\nTask ID.........: 59\nTask Type.......: Supervised Classification\nTask URL........: https://www.openml.org/t/59\nFlow ID.........: 2629\nFlow Name.......: sklearn.ensemble.forest.RandomForestClassifier(8)\nFlow URL........: https://www.openml.org/f/2629\nSetup ID........: 3526\nSetup String....: None\nDataset ID......: 61\nDataset URL.....: https://www.openml.org/d/61\n\n\nOkay, let’s take a pause and re-assess. From multiple users across the globe, who had uploaded runs to OpenML, for a Random Forest run on the Iris, the best score seen till now is 96.67%. That is certainly better than the naive model we built at the beginning to achieve 95.33%. We had used a basic 10-fold cross-validation to evaluate a Random Forest of 10 trees with a max depth of 2. Let us see, what the best run uses and if it differs from our approach.\n\n# The scoring metric used\nt.evaluation_measure\n\n'predictive_accuracy'\n\n\n\n# The methodology used for estimations\nt.estimation_procedure\n\n{'type': 'crossvalidation',\n 'parameters': {'number_repeats': '1',\n 'number_folds': '10',\n 'percentage': '',\n 'stratified_sampling': 'true'},\n 'data_splits_url': 'https://www.openml.org/api_splits/get/59/Task_59_splits.arff'}\n\n\n\n# The model used\nf.name\n\n'sklearn.ensemble.forest.RandomForestClassifier'\n\n\n\n# The model parameters\nfor param in r.parameter_settings:\n name, value = param['oml:name'], param['oml:value']\n print(\"{:<25} : {:<10}\".format(name, value))\n\nwarm_start : False \noob_score : False \nn_jobs : 1 \nverbose : 0 \nmax_leaf_nodes : None \nbootstrap : True \nmin_samples_leaf : 1 \nn_estimators : 10 \nmin_samples_split : 2 \nmin_weight_fraction_leaf : 0.0 \ncriterion : gini \nrandom_state : None \nmax_features : auto \nmax_depth : None \nclass_weight : None \n\n\nAs evident, our initial approach is different on two fronts. We didn’t explicitly use stratified sampling for our cross-validation. While the Random Forest hyperparameters are slightly different too (max_depth=None). That definitely sounds like a to-do, however, there is no reason why we should restrict ourselves to Random Forests. Remember, we are aiming big here. Given the number of OpenML users, there must be somebody who got a better score on Iris with some other model. Let us then retrieve that information. Programmatically, of course.\nIn summary, we are now going to sort the performance of all scikit-learn based models on Iris dataset as per the task definition with task_id=59.\n\n# Fetching top performances\ntask_df.sort_values(by='value', ascending=False).head()\n\n\n\n\n\n\n\n\nrun_id\ntask_id\nsetup_id\nflow_id\nflow_name\ndata_id\ndata_name\nfunction\nupload_time\nuploader\nuploader_name\nvalue\nvalues\narray_data\n\n\n\n\n3630\n2039748\n59\n180922\n6048\nsklearn.pipeline.Pipeline(dualimputer=helper.d...\n61\niris\npredictive_accuracy\n2017-04-09 01:09:01\n1104\njmapvhoof@gmail.com\n0.986667\nNone\nNone\n\n\n3631\n2039750\n59\n180924\n6048\nsklearn.pipeline.Pipeline(dualimputer=helper.d...\n61\niris\npredictive_accuracy\n2017-04-09 01:17:39\n1104\njmapvhoof@gmail.com\n0.986667\nNone\nNone\n\n\n3624\n2012939\n59\n157622\n6048\nsklearn.pipeline.Pipeline(dualimputer=helper.d...\n61\niris\npredictive_accuracy\n2017-04-06 23:29:28\n1104\njmapvhoof@gmail.com\n0.986667\nNone\nNone\n\n\n3618\n2012930\n59\n157613\n6048\nsklearn.pipeline.Pipeline(dualimputer=helper.d...\n61\niris\npredictive_accuracy\n2017-04-06 23:00:24\n1104\njmapvhoof@gmail.com\n0.986667\nNone\nNone\n\n\n3626\n2012941\n59\n157624\n6048\nsklearn.pipeline.Pipeline(dualimputer=helper.d...\n61\niris\npredictive_accuracy\n2017-04-07 01:36:00\n1104\njmapvhoof@gmail.com\n0.986667\nNone\nNone\n\n\n\n\n\n\n\n\n# Fetching best performing flow\nf = openml.flows.get_flow(6048)\nf\n\nOpenML Flow\n===========\nFlow ID.........: 6048 (version 1)\nFlow URL........: https://www.openml.org/f/6048\nFlow Name.......: sklearn.pipeline.Pipeline(dualimputer=helper.dual_imputer.DualImputer,nusvc=sklearn.svm.classes.NuSVC)\nFlow Description: Automatically created scikit-learn flow.\nUpload Date.....: 2017-04-06 22:42:59\nDependencies....: sklearn==0.18.1\nnumpy>=1.6.1\nscipy>=0.9\n\n\n\n# Fetching best performing run\nr = openml.runs.get_run(2012943)\n\n# The model parameters\nfor param in r.parameter_settings:\n name, value = param['oml:name'], param['oml:value']\n print(\"{:<25} : {:<10}\".format(name, value))\n\nsteps : [('DualImputer', <helper.dual_imputer.DualImputer object at 0x7ff618e4d908>), ('nusvc', NuSVC(cache_size=200, class_weight=None, coef0=0.0,\n decision_function_shape=None, degree=3, gamma='auto', kernel='linear',\n max_iter=-1, nu=0.3, probability=True, random_state=3, shrinking=True,\n tol=3.2419092644286417e-05, verbose=False))]\ncache_size : 200 \nclass_weight : None \ncoef0 : 0.0 \ndecision_function_shape : None \ndegree : 3 \ngamma : auto \nkernel : linear \nmax_iter : -1 \nnu : 0.3 \nprobability : True \nrandom_state : 3 \nshrinking : True \ntol : 3.24190926443e-05\nverbose : False \n\n\nThe highest score obtained among the uploaded results is 98.67% using a variant of SVM. However, if we check the corresponding flow description, we see that it is using an old scikit-learn version (0.18.1) and therefore may not be possible to replicate the exact results. However, in order to improve from our score of 95.33%, we should try running a nu-SVC on the same problem and see where we stand. Let’s go for it. Via OpenML, of course.\n\n\nRunning best performing flow on the required task\n\nimport openml\nimport numpy as np\nfrom sklearn.svm import NuSVC\n\n\n# Building the NuSVC model object with parameters found\nclf = NuSVC(cache_size=200, class_weight=None, coef0=0.0,\n decision_function_shape=None, degree=3, gamma='auto', kernel='linear',\n max_iter=-1, nu=0.3, probability=True, random_state=3, shrinking=True,\n tol=3.2419092644286417e-05, verbose=False)\n\n\n# Obtaining task used earlier\nt = openml.tasks.get_task(59)\nt\n\nOpenML Classification Task\n==========================\nTask Type Description: https://www.openml.org/tt/1\nTask ID..............: 59\nTask URL.............: https://www.openml.org/t/59\nEstimation Procedure.: crossvalidation\nEvaluation Measure...: predictive_accuracy\nTarget Feature.......: class\n# of Classes.........: 3\nCost Matrix..........: Available\n\n\n\n# Running the model on the task\n# Internally, the model will be made into \n# an OpenML flow and we can choose to retrieve it\nr, f = openml.runs.run_model_on_task(model=clf, task=t, upload_flow=False, return_flow=True)\nf\n\nOpenML Flow\n===========\nFlow Name.......: sklearn.svm.classes.NuSVC\nFlow Description: Nu-Support Vector Classification.\n\nSimilar to SVC but uses a parameter to control the number of support\nvectors.\n\nThe implementation is based on libsvm.\nDependencies....: sklearn==0.21.3\nnumpy>=1.6.1\nscipy>=0.9\n\n\n\n# To obtain the score (without uploading)\n## r.publish() can be used to upload these results\n## need to sign-in to https://www.openml.org/\nscore = []\nevaluations = r.fold_evaluations['predictive_accuracy'][0]\nfor key in evaluations:\n score.append(evaluations[key])\nprint(np.mean(score))\n\n0.9866666666666667\n\n\nLo and behold! We hit the magic number. I personally would have never tried out NuSVC and would have stuck around tweaking hyperparameters of the Random Forest. This is a new discovery of sorts for sure. I wonder though if anybody has tried XGBoost on Iris?\nIn any case, we can now upload the results of this run to OpenML using:\n\nr.publish()\n\nOpenML Run\n==========\nUploader Name: None\nMetric.......: None\nRun ID.......: 10464835\nRun URL......: https://www.openml.org/r/10464835\nTask ID......: 59\nTask Type....: None\nTask URL.....: https://www.openml.org/t/59\nFlow ID......: 18579\nFlow Name....: sklearn.svm.classes.NuSVC\nFlow URL.....: https://www.openml.org/f/18579\nSetup ID.....: None\nSetup String.: Python_3.6.9. Sklearn_0.21.3. NumPy_1.16.4. SciPy_1.4.1. NuSVC(cache_size=200, class_weight=None, coef0=0.0,\n decision_function_shape=None, degree=3, gamma='auto', kernel='linear',\n max_iter=-1, nu=0.3, probability=True, random_state=3, shrinking=True,\n tol=3.241909264428642e-05, verbose=False)\nDataset ID...: 61\nDataset URL..: https://www.openml.org/d/61\n\n\nOne would need to sign-in to https://www.openml.org/ and generate their respective apikey. The results would then be available for everyone to view and who knows, you can have your name against the best-ever performance measured on the Iris dataset!\n\nThis post was in no ways intended to be a be-all-end-all guide to OpenML. The primary goal was to help form an acquaintance with the OpenML terminologies, introduce the API, establish connections with the general ML practices, and give a sneak-peek into the potential benefits of working together as a community. For a better understanding of OpenML, please explore the documentation. If one desires to continue from the examples given in this post and explore further, kindly refer to the API.\nOpenML-Python is an open-source project and contributions from everyone in the form of Issues and Pull Requests are most welcome. Contribution to the OpenML community is in fact not limited to code contribution. Every single user can make the community richer by sharing data, experiments, results, using OpenML.\nAs ML practitioners, we may be dependent on tools for our tasks. However, as a collective, we can juice out its potential to a larger extent. Let us together, make ML more transparent, more democratic!\n\nSpecial thanks to Heidi, Bilge, Sahithya, Matthias, Ashwin for the ideas, feedback, and support.\n\nRelated readings: * To get started with OpenML-Python * OpenML-Python Github * The OpenML website * Miscellaneous reading on OpenML * To get in touch!" + }, + { + "objectID": "posts/2016-09-18-mlr-loves-OpenML/2016-09-18-mlr-loves-OpenML.html", + "href": "posts/2016-09-18-mlr-loves-OpenML/2016-09-18-mlr-loves-OpenML.html", + "title": "mlr loves OpenML", + "section": "", + "text": "OpenML stands for Open Machine Learning and is an online platform, which aims at supporting collaborative machine learning online. It is an Open Science project that allows its users to share data, code and machine learning experiments.\nAt the time of writing this blog post I am in Eindhoven at an OpenML workshop, where developers and scientists meet to work on improving the project. Some of these people are R users and they (we) are developing an R package that communicates with the OpenML platform.\n\n\nOpenML in R\nThe OpenML R package can list and download data sets and machine learning tasks (prediction challenges). In R one can run algorithms on the these data sets/tasks and then upload the results to OpenML. After successful uploading, the website shows how well the algorithm performs. To run the algorithm on a given task the OpenML R package builds on the mlr package. mlr understands what a task is and can run learners on that task. So all the OpenML package needs to do is convert the OpenML objects to objects mlr understands and then mlr deals with the learning.\n\n\nA small case study\nWe want to create a little study on the OpenML website, in which we compare different types of Support Vector Machines. The study gets an ID assigned to it, which in our case is 27. We use the function ksvm (with different settings of the function argument type) from package kernlab, which is integrated in mlr (“classif.ksvm”).\n\nFor details on installing and setting up the OpenML R package please see the guide on GitHub.\nLet’s start conducting the study:\n\nLoad the packages and list all tasks which have between 100 and 500 observations.\n\nlibrary(\"OpenML\") library(\"mlr\") library(\"farff\") library(\"BBmisc\")\n\ndsize = c(100, 500) taskinfo_all = listOMLTasks(number.of.instances = dsize)\n\nSelect all supervised classification tasks that do 10-fold cross-validation and choose only one task per data set. To keep the study simple and fast to compute, select only the first three tasks.\n\ntaskinfo_10cv = subset(taskinfo_all,\n task.type == \"Supervised Classification\" &\n estimation.procedure == \"10-fold Crossvalidation\" &\n evaluation.measures == \"predictive_accuracy\" &\n number.of.missing.values == 0 &\n number.of.classes %in% c(2, 4))\n\ntaskinfo = taskinfo_10cv[1:3, ]\n\nCreate the learners we want to compare.\n\nlrn.list = list(\n makeLearner(\"classif.ksvm\", type = \"C-svc\"),\n makeLearner(\"classif.ksvm\", type = \"kbb-svc\"),\n makeLearner(\"classif.ksvm\", type = \"spoc-svc\")\n)\n\nRun the learners on the three tasks.\n\ngrid = expand.grid(task.id = taskinfo$task.id,\n lrn.ind = seq_along(lrn.list))\n\nruns = lapply(seq_row(grid), function(i) {\n message(i)\n task = getOMLTask(grid$task.id[i])\n ind = grid$lrn.ind[i]\n runTaskMlr(task, lrn.list[[ind]])\n})\n\nAnd finally upload the runs to OpenML. The upload function (uploadOMLRun) returns the ID of the uploaded run object. When uploading runs that are part of a certain study, tag it with study_ and the study ID. After uploading the runs appear on the website and can be found using the tag or via the study homepage.\n\n## please do not spam the OpenML server by uploading these\n## tasks. I already did that.\nrun.id = lapply(runs, uploadOMLRun, tags = \"study_27\")\n\nTo show the results of our study, list the run evaluations and make a nice plot.\n\nevals = listOMLRunEvaluations(tag = \"study_27\")\n\nevals$task.id = as.factor(evals$task.id)\nevals$setup.id = as.factor(evals$setup.id)\n\nlibrary(\"ggplot2\")\nggplot(evals, aes(x = setup.id, y = predictive.accuracy,\n color = data.name, group = task.id)) +\n geom_point() + geom_line()\n\nNow you can go ahead and create a bigger study using the techniques you have learned.\n\n\nFurther infos\nIf you are interested in more, check out the OpenML blog, the paper and the GitHub repos.\n\nOriginally published at mlr-org.github.io." + }, + { + "objectID": "posts/2020-05-06-Reproducible-deep-learning-with-OpenML/2020-05-06-Reproducible-deep-learning-with-OpenML.html", + "href": "posts/2020-05-06-Reproducible-deep-learning-with-OpenML/2020-05-06-Reproducible-deep-learning-with-OpenML.html", + "title": "Reproducible deep learning with OpenML", + "section": "", + "text": "Deep learning is facing a reproducibility crisis right now[1]. The scale of experiments and there are numerous hyperparameters that affect performance, which makes it hard for the author to write a reproducibility document. The current best way to make an experiment reproducible is to upload the code. However, that’s not optimal in a lot of situations where we have a huge undocumented codebase and someone would like to just reproduce the model. OpenML[2] is an online machine learning platform for sharing and organizing data, machine learning algorithms and experiments. Until now we only provided support for classical machine learning and libraries like Sklearn and MLR. We see there is a huge need for reproducible deep learning now. To solve this issue OpenML is launching its deep learning plugins for popular deep learning libraries like Keras, MXNet, and Pytorch.\nHere we have a small tutorial on how to use our pytorch extension with MNIST dataset.\nSetup To install openml and openml pytorch extension execute this instruction in your terminal pip install openml openml_pytorch\n\n!pip install openml openml_pytorch\n\nCollecting openml\n Downloading https://files.pythonhosted.org/packages/68/5b/cd32bb85651eccebfb489cc6ef7f060ce0f62350a6239127e398313090cc/openml-0.10.2.tar.gz (158kB)\n\n |██ | 10kB 28.5MB/s eta 0:00:01\n |████▏ | 20kB 6.1MB/s eta 0:00:01\n |██████▏ | 30kB 8.6MB/s eta 0:00:01\n |████████▎ | 40kB 10.9MB/s eta 0:00:01\n |██████████▎ | 51kB 7.2MB/s eta 0:00:01\n |████████████▍ | 61kB 8.4MB/s eta 0:00:01\n |██████████████▍ | 71kB 9.6MB/s eta 0:00:01\n |████████████████▌ | 81kB 10.7MB/s eta 0:00:01\n |██████████████████▌ | 92kB 8.5MB/s eta 0:00:01\n |████████████████████▋ | 102kB 9.3MB/s eta 0:00:01\n |██████████████████████▊ | 112kB 9.3MB/s eta 0:00:01\n |████████████████████████▊ | 122kB 9.3MB/s eta 0:00:01\n |██████████████████████████▉ | 133kB 9.3MB/s eta 0:00:01\n |████████████████████████████▉ | 143kB 9.3MB/s eta 0:00:01\n |███████████████████████████████ | 153kB 9.3MB/s eta 0:00:01\n |████████████████████████████████| 163kB 9.3MB/s \nCollecting openml_pytorch\n Downloading https://files.pythonhosted.org/packages/5b/a4/8c69a041e7929d93460db17cf276abfb7b49af9c3d5077bee1c52101ba4c/openml_pytorch-0.0.1-py3-none-any.whl\nCollecting liac-arff>=2.4.0\n Downloading https://files.pythonhosted.org/packages/e9/35/fbc9217cfa91d98888b43e1a19c03a50d716108c58494c558c65e308f372/liac-arff-2.4.0.tar.gz\nCollecting xmltodict\n Downloading https://files.pythonhosted.org/packages/28/fd/30d5c1d3ac29ce229f6bdc40bbc20b28f716e8b363140c26eff19122d8a5/xmltodict-0.12.0-py2.py3-none-any.whl\nRequirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from openml) (2.21.0)\nRequirement already satisfied: scikit-learn>=0.18 in /usr/local/lib/python3.6/dist-packages (from openml) (0.22.2.post1)\nRequirement already satisfied: python-dateutil in /usr/local/lib/python3.6/dist-packages (from openml) (2.8.1)\nRequirement already satisfied: pandas>=0.19.2 in /usr/local/lib/python3.6/dist-packages (from openml) (1.0.3)\nRequirement already satisfied: scipy>=0.13.3 in /usr/local/lib/python3.6/dist-packages (from openml) (1.4.1)\nRequirement already satisfied: numpy>=1.6.2 in /usr/local/lib/python3.6/dist-packages (from openml) (1.18.2)\nCollecting torch==1.2.0\n Downloading https://files.pythonhosted.org/packages/30/57/d5cceb0799c06733eefce80c395459f28970ebb9e896846ce96ab579a3f1/torch-1.2.0-cp36-cp36m-manylinux1_x86_64.whl (748.8MB)\n |████████████████████████████████| 748.9MB 14kB/s \nRequirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->openml) (3.0.4)\nRequirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->openml) (1.24.3)\nRequirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->openml) (2020.4.5.1)\nRequirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->openml) (2.8)\nRequirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.6/dist-packages (from scikit-learn>=0.18->openml) (0.14.1)\nRequirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil->openml) (1.12.0)\nRequirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.19.2->openml) (2018.9)\nBuilding wheels for collected packages: openml, liac-arff\n Building wheel for openml (setup.py) ... done\n Created wheel for openml: filename=openml-0.10.2-cp36-none-any.whl size=190318 sha256=50c2fd823d13904f246bf30997a2464379c393377cfd77f74b5dace4935db99c\n Stored in directory: /root/.cache/pip/wheels/71/ec/5f/aaad9e184680b0b8f1a02ff0ec640cace5adf5bff7bb0af1b4\n Building wheel for liac-arff (setup.py) ... done\n Created wheel for liac-arff: filename=liac_arff-2.4.0-cp36-none-any.whl size=13335 sha256=fca5bc5e07e3fe4f591cbe79968a42e43f535b3bd3e4be77b62c901d46feaaa9\n Stored in directory: /root/.cache/pip/wheels/d1/6a/e7/529dc54d76ecede4346164a09ae3168df358945612710f5203\nSuccessfully built openml liac-arff\nERROR: torchvision 0.5.0 has requirement torch==1.4.0, but you'll have torch 1.2.0 which is incompatible.\nInstalling collected packages: liac-arff, xmltodict, openml, torch, openml-pytorch\n Found existing installation: torch 1.4.0\n Uninstalling torch-1.4.0:\n Successfully uninstalled torch-1.4.0\nSuccessfully installed liac-arff-2.4.0 openml-0.10.2 openml-pytorch-0.0.1 torch-1.2.0 xmltodict-0.12.0\n\n\nLet’s import the necessary libraries\n\nimport torch.nn\nimport torch.optim\nimport openml\nimport openml_pytorch\n\nimport logging\n\nSet the apikey for openml python library, you can find your api key in your openml.org account\n\nopenml.config.apikey = 'key'\n\nDefine a sequential network that does initial image reshaping and normalization model\n\nprocessing_net = torch.nn.Sequential(\n openml_pytorch.layers.Functional(function=torch.Tensor.reshape,\n shape=(-1, 1, 28, 28)),\n torch.nn.BatchNorm2d(num_features=1)\n)\nprint(processing_net)\n\nSequential(\n (0): Functional()\n (1): BatchNorm2d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n)\n\n\nDefine a sequential network that does the extracts the features from the image.\n\nfeatures_net = torch.nn.Sequential(\n torch.nn.Conv2d(in_channels=1, out_channels=32, kernel_size=5),\n torch.nn.LeakyReLU(),\n torch.nn.MaxPool2d(kernel_size=2),\n torch.nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5),\n torch.nn.LeakyReLU(),\n torch.nn.MaxPool2d(kernel_size=2),\n)\nprint(features_net)\n\nSequential(\n (0): Conv2d(1, 32, kernel_size=(5, 5), stride=(1, 1))\n (1): LeakyReLU(negative_slope=0.01)\n (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n (3): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1))\n (4): LeakyReLU(negative_slope=0.01)\n (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n)\n\n\nDefine a sequential network that flattens the features and compiles the results into probabilities for each digit.\n\nresults_net = torch.nn.Sequential(\n openml_pytorch.layers.Functional(function=torch.Tensor.reshape,\n shape=(-1, 4 * 4 * 64)),\n torch.nn.Linear(in_features=4 * 4 * 64, out_features=256),\n torch.nn.LeakyReLU(),\n torch.nn.Dropout(),\n torch.nn.Linear(in_features=256, out_features=10),\n)\nprint(results_net)\n\nSequential(\n (0): Functional()\n (1): Linear(in_features=1024, out_features=256, bias=True)\n (2): LeakyReLU(negative_slope=0.01)\n (3): Dropout(p=0.5, inplace=False)\n (4): Linear(in_features=256, out_features=10, bias=True)\n)\n\n\nThe main network, composed of the above specified networks.\n\nmodel = torch.nn.Sequential(\n processing_net,\n features_net,\n results_net\n)\nprint(model)\n\nSequential(\n (0): Sequential(\n (0): Functional()\n (1): BatchNorm2d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n )\n (1): Sequential(\n (0): Conv2d(1, 32, kernel_size=(5, 5), stride=(1, 1))\n (1): LeakyReLU(negative_slope=0.01)\n (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n (3): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1))\n (4): LeakyReLU(negative_slope=0.01)\n (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n )\n (2): Sequential(\n (0): Functional()\n (1): Linear(in_features=1024, out_features=256, bias=True)\n (2): LeakyReLU(negative_slope=0.01)\n (3): Dropout(p=0.5, inplace=False)\n (4): Linear(in_features=256, out_features=10, bias=True)\n )\n)\n\n\nDownload the OpenML task for the mnist 784 dataset.\n\ntask = openml.tasks.get_task(3573)\n\nRun the model on the task and publish the results on openml.org\n\n\nrun = openml.runs.run_model_on_task(model, task, avoid_duplicate_runs=False)\n\nrun.publish()\n\nprint('URL for run: %s/run/%d' % (openml.config.server, run.run_id))\n\nURL for run: https://www.openml.org/api/v1/xml/run/10452577\n\n\nBy going to the published URL you can check the model performance and other metadata\n\nWe hope that openml deep learning plugins can help in reproducing deep learning experiments and provide a universal reproducibility platform for the experiments. Here are the links of all supported deep learning plugins right now:\n\nMXNet: https://github.com/openml/openml-mxnet\nKeras: https://github.com/openml/openml-keras\nPytorch: https://github.com/openml/openml-pytorch\nONNX: https://github.com/openml/openml-onnx\n\nThere are examples of how to use these libraries in the Github repos. These libraries are in the development stage right now so we would appreciate any feedback on Github issues of these libraries. Links:\n\nhttps://www.wired.com/story/artificial-intelligence-confronts-reproducibility-crisis/\nhttps://www.openml.org" + }, + { + "objectID": "posts/2017-03-03-Basic-components-of-OpenML/2017-03-03-Basic-components-of-OpenML.html", + "href": "posts/2017-03-03-Basic-components-of-OpenML/2017-03-03-Basic-components-of-OpenML.html", + "title": "Basic components of OpenML", + "section": "", + "text": "During my PhD, we developed OpenML, an online experiment database for Machine Learning. Researchers are encouraged to upload their experimental results on it, so that these can be reused by anyone. Various high level papers have been published that overview the design goals, benefits and opportunities (for example, at ECML/PKDD 2013, SIGKDD Explorations and JLMR). However, there is no clear overview of the basic components upon which the platform is build. In this blog post I will review these, and discuss some best practises.\n\nData\nOne of the core components of OpenML are datasets. People can upload their datasets, and the system automatically organises these on line. An example of a dataset is the well-known Iris dataset. It shows all features, once of these is identified as the ‘default target attribute’, although this concept is flexible. It also shows some automatically computed data qualities (or, meta-features). Each dataset has it’s own unique ID. Information about the dataset, the data features and the data qualities can be obtained automatically by means of the following API functions:\n\nGet all available datasets\nGet dataset (required the data id)\nGet data features (requires the data id)\nGet data qualities (requires the data id)\n\n\n\nTask types and tasks\nA dataset alone does not constitute a scientific task. We must first agree on what types of results are expected to be shared. This is expressed in task types: they define what types of inputs are given, which types of output are expected to be returned, and what protocols should be used. For instance, classification tasks should include well-defined cross-validation procedures, labelled input data, and require predictions as outputs. The collection of all this information together is called a task. The Iris dataset has various tasks defined on it, for example this one. Although the web-interface does not show it, this task formally describes the target attribute that should be modelled (in this case the same as the default target attribute of the dataset, but this is flexible), the quality estimation procedure (10-fold cross-validation), the evaluation measure (predictive accuracy) and the cross-validation folds. Useful API operations include:\n\nGet all available tasks\nGet all available tasks of a given type (e.g. get all Classification tasks, requires the id of the task type)\nGet the details of a task (requires task id)\n\nCurrently, there are a wide range of task types defined on OpenML, including classification, regression, on line learning, clustering and subgroup discovery. Although this set can be extended, this is currently not a supported API operation (meaning that we will add them by hand). If you interested in task types that are currently not supported, please contact us.\n\n\nFlows\nTasks can be ‘solved’ by classifiers (or algorithms, workflows, flows). OpenML stores references to these flows. It is important to stress that flows are actually ran on the computer of the user, only meta-information about the flow is stored on OpenML. This information includes basic trivialities such as the creator, toolbox and compilation instructions, but also more formal description about hyper parameter. A flow can also contain subflows, for example, the flow Bagging can have a subflow ‘Decision Tree’ which would make the flow ‘Bagging of Decision Trees’. A flow is distinguished by it’s name and ‘external version’, which are both provided by the uploader. When uploading a flow, it is important to think about a good naming convention for the both, for example, the git commit number could be used as external version, as this uniquely identifies a state of the code. Ideally, when two persons are using the same flow, they will use the same name and external version, so that results of the flows can be compared across tasks. (This is ensured when using the toolboxed in which OpenML is integrated, such as Weka, Scikit Learn and MLR). Useful API functions are:\n\nList all flows\nList all my flows\nGive details about a given flow(requires flow id)\n\n\n\nRuns\nWhenever a flow executes a task, this is called a run. The existence of runs is actually the main contribution of OpenML. Some experiments take weeks to complete, and having the results stored on OpenML helps other researchers resuse the experiments. The task description specifies which information should be uploaded in order to have a valid run, in most cases, for each cross-validation fold the predictions on the test set. This allows OpenML to calculate basic evaluation measures, such as predictive accuracy, ROC curves and many more. Also information about the flow and hyper parameter settings should be provided. Some useful API functions:\n\nList all runs performed on a given task (requires task id, e.g., the iris task is 59)\nCompare two flows on all tasks (requires a comma separated list of flow ids, e.g., 1720, 1721 for comparing k-nn with a decision tree)\nAnd many more …\n\nUsually, the result is in some XML or JSON format (depending on the preference of the user), linking together various task ids, flow ids, etc. In order for this to become meaningful, the user needs to perform other API tasks to get information about what flows were executed, what tasks and datasets were used, etc. Details about this will be provided in another post.\n\n\nSetups\nEvery run that is executed by a flow, contains information about the hyper parameter settings of the flow. A setup is the combination of all parameter settings of a given flow. OpenML internally links the result of a given run to a setup id. This way, experiments can be done across hyper parameter settings. For example,\n\nCompare two setups on all tasks (requires a comma separated list of setup ids, e.g., 8994, 8995, 8996 for comparing multiple MLP configurations)\n\nAs setups constitute a complex concept, most of the operations concerning setups are hidden from the user. Hence, not all setup functions are properly documented yet. A later blogpost will detail on these." + }, + { + "objectID": "posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html", + "href": "posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html", + "title": "Participate in the OpenML Hacktoberfest Workshop!", + "section": "", + "text": "Twice a year the OpenML community organizes an OpenML workshop. Next week we will kick off our fall workshop, which will be hosted virtually and is open to everyone! At the workshop we work on the development and maintenance of the OpenML platform (website, APIs and extensions), but also encourage discussions on a broad range of topics, from using the platform to building the platform to building the community. If you are already sure you want to join, please register and we will see you next week!\nThe workshops are the perfect time to get involved with the OpenML community. We welcome first time contributors to the project. You can contribute in many ways, such as giving feedback, cleaning data, or helping with design, planning, or content. If you are looking to contribute to the software projects, we are there to help you get started on beginner issues. Even better, the workshop coincides with Hacktoberfest, which means you can earn a shirt through your open source software contributions! To get an even better idea of what happens at an OpenML workshop, read the write-up of last year’s fall workshop and look at the workshop agenda.\nIn this blog post we will go over the basics on how you can participate in the workshop. This includes pointers to our code repositories, the platform we will use (gather.town), and participating in Hacktoberfest." + }, + { + "objectID": "posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html#overview", + "href": "posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html#overview", + "title": "Participate in the OpenML Hacktoberfest Workshop!", + "section": "Overview", + "text": "Overview\nWhere? openml at gather.town\nWhen? 26th through 30th of October 2020, 09.00-17.00 CET.\nWhat? Discussions about OpenML, contributing to any OpenML project, or experimenting with OpenML.\nPlease register if you plan to join. It is not required to attend the workshop in full. You are free to join only for a day or specific discussions.\nHowever, it is helpful to indicate which meetings you want to attend, so we know who to expect.\nThe workshop agenda is public. If you see a meeting which you would like to join, just add your name to the list. Feel free to propose a new meeting by adding a proposal to the meeting list!" + }, + { + "objectID": "posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html#gather-town", + "href": "posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html#gather-town", + "title": "Participate in the OpenML Hacktoberfest Workshop!", + "section": "Gather Town", + "text": "Gather Town\nThis fall, we will host the OpenML Hackathon at our gather.town space. Gather.town is a web-based platform that allows you to video conference with other people, but with a twist. Rather than the conventional conference call, in gather.town you control an avatar that can navigate a virtual world. You will automatically be connected to anyone that is within the vicinity of your avatar. This means you can more organically join groups of people, or walk from one meeting room to the next. Here is a preview of our OpenML map: \nAt a glance you see two types of areas: those marked with purple and those that are not marked. Areas that are not marked (e.g. the main lobby) function exactly as described above. However, whenever you are in a purple area you will automatically be connected to everyone else in the same purple area. So whenever you are interested in joining people discussing the new openml website, you just head over to that room!" + }, + { + "objectID": "posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html#breakout-sessions", + "href": "posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html#breakout-sessions", + "title": "Participate in the OpenML Hacktoberfest Workshop!", + "section": "Breakout Sessions", + "text": "Breakout Sessions\nIn the workshop agenda you will find various breakout sessions. These cover a wide range of topics, and we will briefly cover a few of them to give you an impression.\n\nThe Dataset Quality break-out session discusses what quality standards we want to uphold for datasets on OpenML. Ideally, we would like all our datasets perfectly annotated with a description of how the data was collected, what each features means, and what the feature types are. In reality, datasets are collected from different sources and often uploaded by someone other than the original creator. This leads to issues such as incomplete data, badly annotated columns, or multiple uploads of the same data.How can we ensure that despite these practical issues, it remains easy to find datasets of interest on OpenML? How can we improve the dataset quality of datasets uploaded to OpenML? How can we set these new standards and guidelines in a maintainable way? How can we automate annotation of attribute types to the dataset? How can we detect corrupt datasets before uploading it to server?\nThe Website Feedback break-out session is to discuss the newly designed OpenML website. We will appreciate any feedback on frontend, functionalities and limitations of the new openml website.\nWe recently discussed that OpenML wants to improve support for a wider range of datasets. For this reason we are moving away from the ARFF format. The Dataset Format break-out session discusses this transition. Our current plan is to migrate to parquet format, we will be discussing about limitations and advantages of new format and how can we integrate parquet to OpenML.\n\nWe welcome your participation in any these sessions.\nAnd if you have an interesting topic we should discuss, feel free to submit your own breakout proposal!" + }, + { + "objectID": "posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html#hacktoberfest", + "href": "posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html#hacktoberfest", + "title": "Participate in the OpenML Hacktoberfest Workshop!", + "section": "Hacktoberfest", + "text": "Hacktoberfest\nHacktoberfest is a global event to support open source software. If you contribute “enough” to open source projects, you will also be eligible to receive a free t-shirt and some other swag! Our repositories welcome Hacktoberfest participation, so whenever you contribute to our repositories, you are working towards your Hacktoberfest goal. The rules are simple: - Sign up at Hacktoberfest with Github credentials - Find an issue you can help with (more on that below) - Submit a pull request resolving the issue - To be eligible for the t-shirt and swag, you must open four pull requests (this is the “enough” part)\n\nYou can browse our repositories and identify issues which you would like to work on. To make things easier, here are the list of openml repositories that are extra prepared for Hacktoberfest. These repositories have core developers registered to attend the workshop, and have marked issues which are suitable for newcomers with the hacktoberfest label.\n\nopenml.org The front-end for the new OpenML! (python, React.js)\nOpenML The back-end for OpenML. (php)\nopenml-python The Python API for interacting with the OpenML server. Please read this welcome message to get started. (python)\ndocs Documentation for OpenML.\n\nPlease be sure to check the respective repositories contribution guidelines, and don’t be afraid to ask questions! We were all new to open source once and are happy to help you get started too. If you are just getting your feet wet with open source contribution, a great way to get started it to just try and use the packages/website. If you see documentation which needs clarification, or perhaps even just a simple typo, we appreciate your help in fixing it!" + }, + { + "objectID": "posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html#we-hope-to-see-you-at-our-workshop", + "href": "posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.html#we-hope-to-see-you-at-our-workshop", + "title": "Participate in the OpenML Hacktoberfest Workshop!", + "section": "We hope to see you at our workshop!", + "text": "We hope to see you at our workshop!\nIf you have any questions about the workshop, feel free to leave a comment." + }, + { + "objectID": "posts/2016-05-02-OpenML/2016-05-02-OpenML.html", + "href": "posts/2016-05-02-OpenML/2016-05-02-OpenML.html", + "title": "OpenML", + "section": "", + "text": "OpenML is a very cool new online platform that aims at improving — as the name says — Open Machine Learning. It stands for Open Data, Open Algorithms and Open Research. OpenML is still in it’s beta phase, but already pretty awesome.\nWith this blog post I would like to introduce the main concepts, show who should be interested in the platform and I will go a little into a challenge it faces.\n\nConcepts\nThe following four concepts form the basis of the platform:\n\ndata\ntask\nflow\nrun\n\nThe figure shows how they are connected.\n\n\n\nWho can make use of OpenML?\n\nThe domain scientist\nYou have data that you do not know how to analyse best? Upload your data to OpenML and you will have the whole world helping you. Write a good data and task description to make sure people understand the problem.\n\n\nThe data analyst\nYou like taking part in challenges? Being the best solver of a task? Go to OpenML and check out the many tasks and go solve!\n\n\nThe algorithm developer\nYou developed a statistical method or a machine learning algorithm and want to try it out? You will find plenty of data sets and the possibility to make your algorithm public.\n\n\nThe student\nYou study statistics, data science, machine learning? You want to know what is out there? On OpenML you will find a wide variety of algorithms and, if the solvers do a good job, info on software and implementation.\n\n\nThe teacher\nYou teach a machine learning class and want the students to participate in a challenge? Make up your own task and let the students try solving it. The platform shows who uploaded what and when.\n\n\nThe unknown\nThere are possibly many other people who will benefit from the platform, like meta analysts, benchmarkers and people I can not think of right now.\n\n\n\nHow to use OpenML\nOther than just browsing the website you can access OpenML through quite some interfaces such as R or WEKA. For an example on how to use the R interface check out the tutorial.\nThe whole project is of course open source. Check out the different git repositories for all the code and in case you have any complaints.\n\n\nThe overfitting problem\nPlatforms like kaggle, crowdanalytics and innocentive host challenges and give people only part of the data so they can evaluate the performance of the algorithm on a separate data set to (try to) prevent overfitting. So far OpenML does not do that. It always shows all the data, and algorithms are evaluated via resampling procedures (on OpenML called estimation procedures). There are big discussions about how to solve the problem of overfitting on OpenML. They go from keeping part of the data hidden for a certain time in the beginning to doing repeated cross-validation on the (overly) good performing flows on a given task. If you have ideas here, please don’t hesitate to leave me a comment.\nThe platform is still in it’s childhood and may not be perfect yet (If you find issues, post them on the github page). But I think it can grow to be a great thing one day.\n\nOriginally published at heidiseibold.github.io on May 2, 2016." + }, + { + "objectID": "posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/2020-03-23-Finding a-standard-dataset-format-for-machine-learning.html", + "href": "posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/2020-03-23-Finding a-standard-dataset-format-for-machine-learning.html", + "title": "Finding a standard dataset format for machine learning", + "section": "", + "text": "Machine learning data is commonly shared in whatever form it comes in (e.g. images, logs, tables) without being able to make strict assumptions on what it contains or how it is formatted. This makes machine learning hard because you need to spend a lot of time figuring out how to parse and deal with it. Some datasets are accompanied with loading scripts, which are language-specific and may break, and some come with their own server to query the dataset. These do help, but are often not available, and still require us to handle every dataset individually.\nWith OpenML, we aim to take a stress-free, 'zen'-like approach to working with machine learning datasets. To make training data easy to use, OpenML serves thousands of datasets in the same format, with the same rich meta-data, so that you can directly load it (e.g. in numpy,pandas,…) and start building models without manual intervention. For instance, you can benchmark algorithms across hundreds of datasets in a simple loop.\nFor historical reasons, we have done this by internally storing all data in the ARFF data format, a CSV-like text-based format that includes meta-data such as the correct feature data types. However, this format is loosely defined, causing different parsers to behave differently, and the current parsers are memory-inefficient which inhibits the use of large datasets. A more popular format these days is Parquet, a binary single-table format. However, many current machine learning tasks require multi-table data. For instance, image segmentation or object detection tasks have both images and varying amounts of annotations per image.\nIn short, we are looking the best format to internally store machine learning datasets in the foreseeable future, to extend OpenML towards all kinds of modern machine learning datasets and serve them in a uniform way. This blog post presents out process and insights. We would love to hear your thoughts and experiences before we make any decision on how to move forward.\nScope\nWe first define the general scope of the usage of the format:\n\nIt should be useful for data storage and transmission. We can always convert data during upload or download in OpenML's client APIs. For instance, people may upload a Python pandas dataframe to OpenML, and later get the same dataframe back, without realizing or caring how the data was stored in the meantime. If people want to store the data locally, they can download it in the format they like (e.g. a memory-mapped format like Arrow/Feather for fast reading or TFRecords for people using TensorFlow). Additional code can facilitate such conversions.\nThere should be a standard way to represent specific types of data, i.e. a fixed schema that can be verified. For instance, all tabular data should be stored in a uniform way. Without it, we would need dataset-specific code for loading, which requires maintenance, and it will be harder to check quality and extract meta-data.\nThe format should allow storing most (processed) machine learning datasets, including images, video, audio, text, graphs, and multi-tabular data such as object recognition tasks and relational data. Data such as images can be converted to numeric formats (e.g. pixel values) for storage in this format (and usage in machine learning).\n\nImpact on OpenML (simplicity, maintenance)\nSince OpenML is a community project, we want to keep it as easy as possible to use and maintain:\n\nWe aim to host datasets in an S3 object store (min.io).\nWe prefer a single internal data format to reduce maintenance both server-side and client-side.\nWe need machine-readable schemas (in a specific language) that describe how a certain type of data is formatted. Examples would be a schema for tabular data, a schema for annotated image data, etc. Every dataset should specify the schema it satisfies, and we should be able to validate this. We aim to gradually roll out support form different types of data, starting with tabular, and including others only after schemas are defined.\nWe need to support batch data now, but ideally the format should allow data appending (streaming) in the future.\n\nWhen no agreed upon schema exists, we could offer a forum for the community to discuss and agree on a standard schema, in collaboration with other initiatives (e.g. frictionlessdata). For instance, new schemas could be created in a github repo to allow people to do create pull requests. They could be effectively used once they are merged.\nRequirements\nTo draw up a shortlist of data formats, we used the following (soft) requirements:\n\nThe format should be stable and fully maintained by an active community.\nParsers in various programming languages, including well-maintained and stable libraries.\nStreaming read/writes, for easy conversion and memory efficiency.\nVersion control, some way to see differences between versions.\nIdeally, there is a way to detect bitflip errors during storage or transmission.\nIdeally, fast read/writes and efficient storage.\nIdeally, there should be support for storing sparse data.\nSupport for storing binary blobs and vectors of different lengths.\nIf possible, support for multiple ‘resources’ (e.g. collections of files or multiple relational tables).\nPotentially, store some meta-data inside the file.\n\nShortlist\nWe decided to investigate the following formats in more detail:\nArrow / Feather\nBenefits:\n\nGreat for locally caching files after download\nMemory-mapped, so very fast reads\n\nDrawbacks:\n\nNot stable enough yet and not ideal for long-term storage. The authors also discourage it for long-term storage.\nLimited to one data structure per file, but that data structure can be complex (e.g. dict).\n\nParquet\nBenefits:\n\nUsed in industry a lot, active developer community. Good community of practice.\nWell-supported and maintained.\nHas parsers in different languages, but not all Parquet features are supported in every library (see below).\nBuilt-in compression (columnar storage), very efficient long-term data storage\nSimple structure\nSparse data\n\nDrawbacks:\n\nThe Python libraries (Arrow, fastparquet) do not support partial read/writes. The Java/Go implementations do. Splitting up parquet files into many small files can be cumbersome.\nNo version control, no meta-data storage, no schema enforcement. There are layers on top (e.g. delta lake) that do support this. Simple file versioning can also be done with S3.\nThe different parsers (e.g. Parquet support inside Arrow, fastparquet) implement different parts of the Parquet format and different set of compression algorithms. Hence, parquet files may not be compatible between parsers (see here and here.\nSupport limited to single-table storage. For instance, there doesn’t seem to be an apparent way to store an object detection dataset (with images and annotations) as a single parquet file.\n\nSQLite\nBenefits:\n\nEasy to use and comparably fast to HDF5 in our tests.\nVery good support in all languages. It is built-in in Python.\nVery flexible access to parts of the data. SQL queries can be used to select any subset of the data.\n\nDrawback:\n\nIt supports only 2000 columns, and we have quite a few datasets with more than 2000 features. Hence, storing large tabular data will require mapping data differently, which would add a lot of additional complexity.\nWriting SQL queries requires knowledge of the internal data structure (tables, keys,…).\n\nHDF5\nBenefits:\n\nVery good support in all languages. Has well-tested parsers, all using the same C implementation.\nWidely accepted format in the deep learning community to store data and models.\nWidely accepted format in many scientific domains (e.g. astronomy, bioinformatics,…)\nProvides built-in compression. Constructing and loading datasets was reasonably fast.\nVery flexible. Should allow to store any machine learning dataset as a single file.\nAllows easy inclusion of meta-data inside the file, creating a self-contained file.\nSelf-descriptive: the structure of the data can be easily read programmatically. For instance, ‘dump -H -A 0 mydata.hdf5’ will give you a lot of detail on the structure of the dataset.\n\nDrawbacks:\n\nComplexity. We cannot make any a priori assumptions about how the data is structured. We need to define schema and implement code that automatically validates that a dataset follows a specific schema (e.g. using h5dump to see whether it holds a single dataframe that we could load into pandas). We are unaware of any initiatives to define such schema.\nThe format has a very long and detailed specification. While parsers exist we don’t really know whether they are fully compatible with each other.\nCan become corrupt if not carefully used.\n\nCSV\nBenefits:\n\nVery good support in all languages.\nEasy to use, requires very little additional tooling\nText-based, so easy versioning with git LFS. Changes in different versions can be observed with a simple git diff.\nThe current standard used in frictionlessdata.\nThere exist schema to express certain types of data in CSV (see frictionlessdata).\n\nDrawbacks:\n\nNot very efficient for storing floating point numbers\nNot ideal for very large datasets (when data does not fit in memory/disk)\nMany different dialects exist. We need to decide on a standardized dialect and enforce that only that dialect is used on OpenML (https://frictionlessdata.io/specs/csv-dialect/). The dialect specified in RFC4180, which uses the comma as delimiter and the quotation mark as quote character, is often recommended.\n\nOverview\n\n\n\n\nParquet\nHDF5\nSQLite\nCSV\n\n\n\n\nConsistency across different platforms\n?\n✅\n✅\n✅ (dialect)\n\n\nSupport and documentation\n✅\n✅\n✅\n✅\n\n\nRead/write speed\n✅\nso-so\n❌\n❌\n\n\nIncremental reads/writes\nYes, but not supported by current Python libs\n✅\n✅\nYes (but not random access)\n\n\nSupports very large and high-dimensional datasets\n✅\n✅\n❌ (limited nr. columns per table)\n✅ Storing tensors requires flattening.\n\n\nSimplicity\n✅\n❌ (basically full file system)\n✅ (it’s a database)\n✅\n\n\nMetadata support\nOnly minimal\n✅\n✅\n❌ (requires separate metadata file)\n\n\nMaintenance\nApache project, open and quite active\nClosed group, but active community on Jira and conferences\nRun by a company. Uses an email list.\n✅\n\n\nAvailable examples of usage in ML\n✅\n✅\n❌\n✅\n\n\nFlexibility\nOnly tabular\nVery flexible, maybe too flexible\nRelational multi-table\nOnly tabular\n\n\nVersioning/Diff\nOnly via S3 or delta lake\n❌\n❌\n✅\n\n\nDifferent length vectors\nAs blob\n✅\n❌ ?\n✅\n\n\n\nPerformance benchmarks\nThere exist some prior benchmarks (here and here) on storing dataframes. These only consider single-table datasets. For reading/writing, CSV is clearly slower and Parquet is clearly faster. For storage, Parquet is most efficient but zipped CSV as well. HDF requires a lot more disk space. We also ran our own benchmark to compare the writing performance of those data formats for very large and complex machine learning datasets, but could not find a way to store these in one file in Parquet.\nVersion control\nVersion control for large datasets is tricky. For text-based formats (CSV), we could use git LFS store the datasets and have automated versioning of datasets. We found it quite easy to export all current OpenML dataset to GitLab: https://gitlab.com/data/d/openml.\nThe binary formats do not allow us to track changes in the data, only to recover the exact versions of the datasets you want (and their metadata). Potentially, extra tools could still be used to export the data to dataframes or text and then compare them. Delta Lake has version history support, but seemingly only for Spark operations done on the datasets.\nWe need your help! If we have missed any format we should investigate, or misunderstood those we have investigated, or missed some best practice, please tell us. You are welcome to comment below, or send us an email at openmlhq@googlegroups.com\nContributors to this blog post: Mitar Milutinovic, Prabhant Singh, Joaquin Vanschoren, Pieter Gijsbers, Andreas Mueller, Matthias Feurer, Jan van Rijn, Marcus Weimer, Marcel Wever, Gertjan van den Burg, Nick Poorman" + }, + { + "objectID": "index.html", + "href": "index.html", + "title": "Welcome to the Open Machine Learning blog", + "section": "", + "text": "Welcome to the Open Machine Learning blog\nThis blog brings you stories about OpenML: why we want to streamline machine learning research, how you can use it, and what we are doing. We are also open to your stories about anything related to open machine learning research, education, and applications. Join the conversation :).\n\n\n\n\n\n\n\n \n \n \n Order By\n Default\n \n Title\n \n \n Date - Oldest\n \n \n Date - Newest\n \n \n Author\n \n \n \n\n\n\n\n\n\n\n\n\n\nExperiments with Temperature\n\n\n\n\n\n\nllm\n\n\n\nExperimenting with LLM temperature and its effects on answer quality\n\n\n\n\n\nJul 8, 2024\n\n\nSubhaditya Mukherjee\n\n\n\n\n\n\n\n\n\n\n\n\nParticipate in the OpenML Hacktoberfest Workshop!\n\n\n\n\n\n\nOpenML\n\n\nHacktoberfest\n\n\nWorkshop\n\n\n\nJoin us at the 2020 Fall Workshop on gather.town!\n\n\n\n\n\nOct 23, 2020\n\n\nPieter Gijsbers, Prabhant Singh\n\n\n\n\n\n\n\n\n\n\n\n\nReproducible deep learning with OpenML\n\n\n\n\n\n\nopenml\n\n\ndeep learning\n\n\n\nReleasing OpenML Deep learning libraries compatible with keras, pytorch and mxnet.\n\n\n\n\n\nMay 6, 2020\n\n\n\n\n\n\n\n\n\n\n\n\nFinding a standard dataset format for machine learning\n\n\n\n\n\n\nOpenML\n\n\nData\n\n\n\nExploring new dataset format options for OpenML.org\n\n\n\n\n\nMar 23, 2020\n\n\nPieter Gijsbers, Mitar Milutinovic, Prabhant Singh, Joaquin Vanschoren\n\n\n\n\n\n\n\n\n\n\n\n\nOpenML - Machine Learning as a community\n\n\n\n\n\n\nOpenML\n\n\n\nA description of how OpenML fits into traditional ML practices\n\n\n\n\n\nOct 26, 2019\n\n\nNeeratyoy Mallik\n\n\n\n\n\n\n\n\n\n\n\n\nOpenML workshop at Dagstuhl\n\n\n\n\n\n\nOpenML\n\n\n\nOpenML workshop at Dagstuhl\n\n\n\n\n\nOct 24, 2019\n\n\nHeidi Seibold\n\n\n\n\n\n\n\n\n\n\n\n\nBasic components of OpenML\n\n\n\n\n\n\nOpenML\n\n\n\nUnderstanding the building blocks of OpenML\n\n\n\n\n\nMar 3, 2017\n\n\nJan van Rijn\n\n\n\n\n\n\n\n\n\n\n\n\nmlr loves OpenML\n\n\n\n\n\n\nOpenML\n\n\nmlr\n\n\nR\n\n\n\nOpenML with mlr\n\n\n\n\n\nSep 18, 2016\n\n\nHeidi Seibold\n\n\n\n\n\n\n\n\n\n\n\n\nOpenML\n\n\n\n\n\n\nOpenML\n\n\n\nIntroduction to OpenML\n\n\n\n\n\nMay 2, 2016\n\n\nHeidi Seibold\n\n\n\n\n\n\nNo matching items" + } +] \ No newline at end of file diff --git a/blog/docs/site_libs/bootstrap/bootstrap-icons.css b/blog/docs/site_libs/bootstrap/bootstrap-icons.css new file mode 100644 index 0000000..285e444 --- /dev/null +++ b/blog/docs/site_libs/bootstrap/bootstrap-icons.css @@ -0,0 +1,2078 @@ +/*! + * Bootstrap Icons v1.11.1 (https://icons.getbootstrap.com/) + * Copyright 2019-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */ + +@font-face { + font-display: block; + font-family: "bootstrap-icons"; + src: +url("./bootstrap-icons.woff?2820a3852bdb9a5832199cc61cec4e65") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } +.bi-1-circle-fill::before { content: "\f796"; } +.bi-1-circle::before { content: "\f797"; } +.bi-1-square-fill::before { content: "\f798"; } +.bi-1-square::before { content: "\f799"; } +.bi-2-circle-fill::before { content: "\f79c"; } +.bi-2-circle::before { content: "\f79d"; } +.bi-2-square-fill::before { content: "\f79e"; } +.bi-2-square::before { content: "\f79f"; } +.bi-3-circle-fill::before { content: "\f7a2"; } +.bi-3-circle::before { content: "\f7a3"; } +.bi-3-square-fill::before { content: "\f7a4"; } +.bi-3-square::before { content: "\f7a5"; } +.bi-4-circle-fill::before { content: "\f7a8"; } +.bi-4-circle::before { content: "\f7a9"; } +.bi-4-square-fill::before { content: "\f7aa"; } +.bi-4-square::before { content: "\f7ab"; } +.bi-5-circle-fill::before { content: "\f7ae"; } +.bi-5-circle::before { content: "\f7af"; } +.bi-5-square-fill::before { content: "\f7b0"; } +.bi-5-square::before { content: "\f7b1"; } +.bi-6-circle-fill::before { content: "\f7b4"; } +.bi-6-circle::before { content: "\f7b5"; } +.bi-6-square-fill::before { content: "\f7b6"; } +.bi-6-square::before { content: "\f7b7"; } +.bi-7-circle-fill::before { content: "\f7ba"; } +.bi-7-circle::before { content: "\f7bb"; } +.bi-7-square-fill::before { content: "\f7bc"; } +.bi-7-square::before { content: "\f7bd"; } +.bi-8-circle-fill::before { content: "\f7c0"; } +.bi-8-circle::before { content: "\f7c1"; } +.bi-8-square-fill::before { content: "\f7c2"; } +.bi-8-square::before { content: "\f7c3"; } +.bi-9-circle-fill::before { content: "\f7c6"; } +.bi-9-circle::before { content: "\f7c7"; } +.bi-9-square-fill::before { content: "\f7c8"; } +.bi-9-square::before { content: "\f7c9"; } +.bi-airplane-engines-fill::before { content: "\f7ca"; } +.bi-airplane-engines::before { content: "\f7cb"; } +.bi-airplane-fill::before { content: "\f7cc"; } +.bi-airplane::before { content: "\f7cd"; } +.bi-alexa::before { content: "\f7ce"; } +.bi-alipay::before { content: "\f7cf"; } +.bi-android::before { content: "\f7d0"; } +.bi-android2::before { content: "\f7d1"; } +.bi-box-fill::before { content: "\f7d2"; } +.bi-box-seam-fill::before { content: "\f7d3"; } +.bi-browser-chrome::before { content: "\f7d4"; } +.bi-browser-edge::before { content: "\f7d5"; } +.bi-browser-firefox::before { content: "\f7d6"; } +.bi-browser-safari::before { content: "\f7d7"; } +.bi-c-circle-fill::before { content: "\f7da"; } +.bi-c-circle::before { content: "\f7db"; } +.bi-c-square-fill::before { content: "\f7dc"; } +.bi-c-square::before { content: "\f7dd"; } +.bi-capsule-pill::before { content: "\f7de"; } +.bi-capsule::before { content: "\f7df"; } +.bi-car-front-fill::before { content: "\f7e0"; } +.bi-car-front::before { content: "\f7e1"; } +.bi-cassette-fill::before { content: "\f7e2"; } +.bi-cassette::before { content: "\f7e3"; } +.bi-cc-circle-fill::before { content: "\f7e6"; } +.bi-cc-circle::before { content: "\f7e7"; } +.bi-cc-square-fill::before { content: "\f7e8"; } +.bi-cc-square::before { content: "\f7e9"; } +.bi-cup-hot-fill::before { content: "\f7ea"; } +.bi-cup-hot::before { content: "\f7eb"; } +.bi-currency-rupee::before { content: "\f7ec"; } +.bi-dropbox::before { content: "\f7ed"; } +.bi-escape::before { content: "\f7ee"; } +.bi-fast-forward-btn-fill::before { content: "\f7ef"; } +.bi-fast-forward-btn::before { content: "\f7f0"; } +.bi-fast-forward-circle-fill::before { content: "\f7f1"; } +.bi-fast-forward-circle::before { content: "\f7f2"; } +.bi-fast-forward-fill::before { content: "\f7f3"; } +.bi-fast-forward::before { content: "\f7f4"; } +.bi-filetype-sql::before { content: "\f7f5"; } +.bi-fire::before { content: "\f7f6"; } +.bi-google-play::before { content: "\f7f7"; } +.bi-h-circle-fill::before { content: "\f7fa"; } +.bi-h-circle::before { content: "\f7fb"; } +.bi-h-square-fill::before { content: "\f7fc"; } +.bi-h-square::before { content: "\f7fd"; } +.bi-indent::before { content: "\f7fe"; } +.bi-lungs-fill::before { content: "\f7ff"; } +.bi-lungs::before { content: "\f800"; } +.bi-microsoft-teams::before { content: "\f801"; } +.bi-p-circle-fill::before { content: "\f804"; } +.bi-p-circle::before { content: "\f805"; } +.bi-p-square-fill::before { content: "\f806"; } +.bi-p-square::before { content: "\f807"; } +.bi-pass-fill::before { content: "\f808"; } +.bi-pass::before { content: "\f809"; } +.bi-prescription::before { content: "\f80a"; } +.bi-prescription2::before { content: "\f80b"; } +.bi-r-circle-fill::before { content: "\f80e"; } +.bi-r-circle::before { content: "\f80f"; } +.bi-r-square-fill::before { content: "\f810"; } +.bi-r-square::before { content: "\f811"; } +.bi-repeat-1::before { content: "\f812"; } +.bi-repeat::before { content: "\f813"; } +.bi-rewind-btn-fill::before { content: "\f814"; } +.bi-rewind-btn::before { content: "\f815"; } +.bi-rewind-circle-fill::before { content: "\f816"; } +.bi-rewind-circle::before { content: "\f817"; } +.bi-rewind-fill::before { content: "\f818"; } +.bi-rewind::before { content: "\f819"; } +.bi-train-freight-front-fill::before { content: "\f81a"; } +.bi-train-freight-front::before { content: "\f81b"; } +.bi-train-front-fill::before { content: "\f81c"; } +.bi-train-front::before { content: "\f81d"; } +.bi-train-lightrail-front-fill::before { content: "\f81e"; } +.bi-train-lightrail-front::before { content: "\f81f"; } +.bi-truck-front-fill::before { content: "\f820"; } +.bi-truck-front::before { content: "\f821"; } +.bi-ubuntu::before { content: "\f822"; } +.bi-unindent::before { content: "\f823"; } +.bi-unity::before { content: "\f824"; } +.bi-universal-access-circle::before { content: "\f825"; } +.bi-universal-access::before { content: "\f826"; } +.bi-virus::before { content: "\f827"; } +.bi-virus2::before { content: "\f828"; } +.bi-wechat::before { content: "\f829"; } +.bi-yelp::before { content: "\f82a"; } +.bi-sign-stop-fill::before { content: "\f82b"; } +.bi-sign-stop-lights-fill::before { content: "\f82c"; } +.bi-sign-stop-lights::before { content: "\f82d"; } +.bi-sign-stop::before { content: "\f82e"; } +.bi-sign-turn-left-fill::before { content: "\f82f"; } +.bi-sign-turn-left::before { content: "\f830"; } +.bi-sign-turn-right-fill::before { content: "\f831"; } +.bi-sign-turn-right::before { content: "\f832"; } +.bi-sign-turn-slight-left-fill::before { content: "\f833"; } +.bi-sign-turn-slight-left::before { content: "\f834"; } +.bi-sign-turn-slight-right-fill::before { content: "\f835"; } +.bi-sign-turn-slight-right::before { content: "\f836"; } +.bi-sign-yield-fill::before { content: "\f837"; } +.bi-sign-yield::before { content: "\f838"; } +.bi-ev-station-fill::before { content: "\f839"; } +.bi-ev-station::before { content: "\f83a"; } +.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } +.bi-fuel-pump-diesel::before { content: "\f83c"; } +.bi-fuel-pump-fill::before { content: "\f83d"; } +.bi-fuel-pump::before { content: "\f83e"; } +.bi-0-circle-fill::before { content: "\f83f"; } +.bi-0-circle::before { content: "\f840"; } +.bi-0-square-fill::before { content: "\f841"; } +.bi-0-square::before { content: "\f842"; } +.bi-rocket-fill::before { content: "\f843"; } +.bi-rocket-takeoff-fill::before { content: "\f844"; } +.bi-rocket-takeoff::before { content: "\f845"; } +.bi-rocket::before { content: "\f846"; } +.bi-stripe::before { content: "\f847"; } +.bi-subscript::before { content: "\f848"; } +.bi-superscript::before { content: "\f849"; } +.bi-trello::before { content: "\f84a"; } +.bi-envelope-at-fill::before { content: "\f84b"; } +.bi-envelope-at::before { content: "\f84c"; } +.bi-regex::before { content: "\f84d"; } +.bi-text-wrap::before { content: "\f84e"; } +.bi-sign-dead-end-fill::before { content: "\f84f"; } +.bi-sign-dead-end::before { content: "\f850"; } +.bi-sign-do-not-enter-fill::before { content: "\f851"; } +.bi-sign-do-not-enter::before { content: "\f852"; } +.bi-sign-intersection-fill::before { content: "\f853"; } +.bi-sign-intersection-side-fill::before { content: "\f854"; } +.bi-sign-intersection-side::before { content: "\f855"; } +.bi-sign-intersection-t-fill::before { content: "\f856"; } +.bi-sign-intersection-t::before { content: "\f857"; } +.bi-sign-intersection-y-fill::before { content: "\f858"; } +.bi-sign-intersection-y::before { content: "\f859"; } +.bi-sign-intersection::before { content: "\f85a"; } +.bi-sign-merge-left-fill::before { content: "\f85b"; } +.bi-sign-merge-left::before { content: "\f85c"; } +.bi-sign-merge-right-fill::before { content: "\f85d"; } +.bi-sign-merge-right::before { content: "\f85e"; } +.bi-sign-no-left-turn-fill::before { content: "\f85f"; } +.bi-sign-no-left-turn::before { content: "\f860"; } +.bi-sign-no-parking-fill::before { content: "\f861"; } +.bi-sign-no-parking::before { content: "\f862"; } +.bi-sign-no-right-turn-fill::before { content: "\f863"; } +.bi-sign-no-right-turn::before { content: "\f864"; } +.bi-sign-railroad-fill::before { content: "\f865"; } +.bi-sign-railroad::before { content: "\f866"; } +.bi-building-add::before { content: "\f867"; } +.bi-building-check::before { content: "\f868"; } +.bi-building-dash::before { content: "\f869"; } +.bi-building-down::before { content: "\f86a"; } +.bi-building-exclamation::before { content: "\f86b"; } +.bi-building-fill-add::before { content: "\f86c"; } +.bi-building-fill-check::before { content: "\f86d"; } +.bi-building-fill-dash::before { content: "\f86e"; } +.bi-building-fill-down::before { content: "\f86f"; } +.bi-building-fill-exclamation::before { content: "\f870"; } +.bi-building-fill-gear::before { content: "\f871"; } +.bi-building-fill-lock::before { content: "\f872"; } +.bi-building-fill-slash::before { content: "\f873"; } +.bi-building-fill-up::before { content: "\f874"; } +.bi-building-fill-x::before { content: "\f875"; } +.bi-building-fill::before { content: "\f876"; } +.bi-building-gear::before { content: "\f877"; } +.bi-building-lock::before { content: "\f878"; } +.bi-building-slash::before { content: "\f879"; } +.bi-building-up::before { content: "\f87a"; } +.bi-building-x::before { content: "\f87b"; } +.bi-buildings-fill::before { content: "\f87c"; } +.bi-buildings::before { content: "\f87d"; } +.bi-bus-front-fill::before { content: "\f87e"; } +.bi-bus-front::before { content: "\f87f"; } +.bi-ev-front-fill::before { content: "\f880"; } +.bi-ev-front::before { content: "\f881"; } +.bi-globe-americas::before { content: "\f882"; } +.bi-globe-asia-australia::before { content: "\f883"; } +.bi-globe-central-south-asia::before { content: "\f884"; } +.bi-globe-europe-africa::before { content: "\f885"; } +.bi-house-add-fill::before { content: "\f886"; } +.bi-house-add::before { content: "\f887"; } +.bi-house-check-fill::before { content: "\f888"; } +.bi-house-check::before { content: "\f889"; } +.bi-house-dash-fill::before { content: "\f88a"; } +.bi-house-dash::before { content: "\f88b"; } +.bi-house-down-fill::before { content: "\f88c"; } +.bi-house-down::before { content: "\f88d"; } +.bi-house-exclamation-fill::before { content: "\f88e"; } +.bi-house-exclamation::before { content: "\f88f"; } +.bi-house-gear-fill::before { content: "\f890"; } +.bi-house-gear::before { content: "\f891"; } +.bi-house-lock-fill::before { content: "\f892"; } +.bi-house-lock::before { content: "\f893"; } +.bi-house-slash-fill::before { content: "\f894"; } +.bi-house-slash::before { content: "\f895"; } +.bi-house-up-fill::before { content: "\f896"; } +.bi-house-up::before { content: "\f897"; } +.bi-house-x-fill::before { content: "\f898"; } +.bi-house-x::before { content: "\f899"; } +.bi-person-add::before { content: "\f89a"; } +.bi-person-down::before { content: "\f89b"; } +.bi-person-exclamation::before { content: "\f89c"; } +.bi-person-fill-add::before { content: "\f89d"; } +.bi-person-fill-check::before { content: "\f89e"; } +.bi-person-fill-dash::before { content: "\f89f"; } +.bi-person-fill-down::before { content: "\f8a0"; } +.bi-person-fill-exclamation::before { content: "\f8a1"; } +.bi-person-fill-gear::before { content: "\f8a2"; } +.bi-person-fill-lock::before { content: "\f8a3"; } +.bi-person-fill-slash::before { content: "\f8a4"; } +.bi-person-fill-up::before { content: "\f8a5"; } +.bi-person-fill-x::before { content: "\f8a6"; } +.bi-person-gear::before { content: "\f8a7"; } +.bi-person-lock::before { content: "\f8a8"; } +.bi-person-slash::before { content: "\f8a9"; } +.bi-person-up::before { content: "\f8aa"; } +.bi-scooter::before { content: "\f8ab"; } +.bi-taxi-front-fill::before { content: "\f8ac"; } +.bi-taxi-front::before { content: "\f8ad"; } +.bi-amd::before { content: "\f8ae"; } +.bi-database-add::before { content: "\f8af"; } +.bi-database-check::before { content: "\f8b0"; } +.bi-database-dash::before { content: "\f8b1"; } +.bi-database-down::before { content: "\f8b2"; } +.bi-database-exclamation::before { content: "\f8b3"; } +.bi-database-fill-add::before { content: "\f8b4"; } +.bi-database-fill-check::before { content: "\f8b5"; } +.bi-database-fill-dash::before { content: "\f8b6"; } +.bi-database-fill-down::before { content: "\f8b7"; } +.bi-database-fill-exclamation::before { content: "\f8b8"; } +.bi-database-fill-gear::before { content: "\f8b9"; } +.bi-database-fill-lock::before { content: "\f8ba"; } +.bi-database-fill-slash::before { content: "\f8bb"; } +.bi-database-fill-up::before { content: "\f8bc"; } +.bi-database-fill-x::before { content: "\f8bd"; } +.bi-database-fill::before { content: "\f8be"; } +.bi-database-gear::before { content: "\f8bf"; } +.bi-database-lock::before { content: "\f8c0"; } +.bi-database-slash::before { content: "\f8c1"; } +.bi-database-up::before { content: "\f8c2"; } +.bi-database-x::before { content: "\f8c3"; } +.bi-database::before { content: "\f8c4"; } +.bi-houses-fill::before { content: "\f8c5"; } +.bi-houses::before { content: "\f8c6"; } +.bi-nvidia::before { content: "\f8c7"; } +.bi-person-vcard-fill::before { content: "\f8c8"; } +.bi-person-vcard::before { content: "\f8c9"; } +.bi-sina-weibo::before { content: "\f8ca"; } +.bi-tencent-qq::before { content: "\f8cb"; } +.bi-wikipedia::before { content: "\f8cc"; } +.bi-alphabet-uppercase::before { content: "\f2a5"; } +.bi-alphabet::before { content: "\f68a"; } +.bi-amazon::before { content: "\f68d"; } +.bi-arrows-collapse-vertical::before { content: "\f690"; } +.bi-arrows-expand-vertical::before { content: "\f695"; } +.bi-arrows-vertical::before { content: "\f698"; } +.bi-arrows::before { content: "\f6a2"; } +.bi-ban-fill::before { content: "\f6a3"; } +.bi-ban::before { content: "\f6b6"; } +.bi-bing::before { content: "\f6c2"; } +.bi-cake::before { content: "\f6e0"; } +.bi-cake2::before { content: "\f6ed"; } +.bi-cookie::before { content: "\f6ee"; } +.bi-copy::before { content: "\f759"; } +.bi-crosshair::before { content: "\f769"; } +.bi-crosshair2::before { content: "\f794"; } +.bi-emoji-astonished-fill::before { content: "\f795"; } +.bi-emoji-astonished::before { content: "\f79a"; } +.bi-emoji-grimace-fill::before { content: "\f79b"; } +.bi-emoji-grimace::before { content: "\f7a0"; } +.bi-emoji-grin-fill::before { content: "\f7a1"; } +.bi-emoji-grin::before { content: "\f7a6"; } +.bi-emoji-surprise-fill::before { content: "\f7a7"; } +.bi-emoji-surprise::before { content: "\f7ac"; } +.bi-emoji-tear-fill::before { content: "\f7ad"; } +.bi-emoji-tear::before { content: "\f7b2"; } +.bi-envelope-arrow-down-fill::before { content: "\f7b3"; } +.bi-envelope-arrow-down::before { content: "\f7b8"; } +.bi-envelope-arrow-up-fill::before { content: "\f7b9"; } +.bi-envelope-arrow-up::before { content: "\f7be"; } +.bi-feather::before { content: "\f7bf"; } +.bi-feather2::before { content: "\f7c4"; } +.bi-floppy-fill::before { content: "\f7c5"; } +.bi-floppy::before { content: "\f7d8"; } +.bi-floppy2-fill::before { content: "\f7d9"; } +.bi-floppy2::before { content: "\f7e4"; } +.bi-gitlab::before { content: "\f7e5"; } +.bi-highlighter::before { content: "\f7f8"; } +.bi-marker-tip::before { content: "\f802"; } +.bi-nvme-fill::before { content: "\f803"; } +.bi-nvme::before { content: "\f80c"; } +.bi-opencollective::before { content: "\f80d"; } +.bi-pci-card-network::before { content: "\f8cd"; } +.bi-pci-card-sound::before { content: "\f8ce"; } +.bi-radar::before { content: "\f8cf"; } +.bi-send-arrow-down-fill::before { content: "\f8d0"; } +.bi-send-arrow-down::before { content: "\f8d1"; } +.bi-send-arrow-up-fill::before { content: "\f8d2"; } +.bi-send-arrow-up::before { content: "\f8d3"; } +.bi-sim-slash-fill::before { content: "\f8d4"; } +.bi-sim-slash::before { content: "\f8d5"; } +.bi-sourceforge::before { content: "\f8d6"; } +.bi-substack::before { content: "\f8d7"; } +.bi-threads-fill::before { content: "\f8d8"; } +.bi-threads::before { content: "\f8d9"; } +.bi-transparency::before { content: "\f8da"; } +.bi-twitter-x::before { content: "\f8db"; } +.bi-type-h4::before { content: "\f8dc"; } +.bi-type-h5::before { content: "\f8dd"; } +.bi-type-h6::before { content: "\f8de"; } +.bi-backpack-fill::before { content: "\f8df"; } +.bi-backpack::before { content: "\f8e0"; } +.bi-backpack2-fill::before { content: "\f8e1"; } +.bi-backpack2::before { content: "\f8e2"; } +.bi-backpack3-fill::before { content: "\f8e3"; } +.bi-backpack3::before { content: "\f8e4"; } +.bi-backpack4-fill::before { content: "\f8e5"; } +.bi-backpack4::before { content: "\f8e6"; } +.bi-brilliance::before { content: "\f8e7"; } +.bi-cake-fill::before { content: "\f8e8"; } +.bi-cake2-fill::before { content: "\f8e9"; } +.bi-duffle-fill::before { content: "\f8ea"; } +.bi-duffle::before { content: "\f8eb"; } +.bi-exposure::before { content: "\f8ec"; } +.bi-gender-neuter::before { content: "\f8ed"; } +.bi-highlights::before { content: "\f8ee"; } +.bi-luggage-fill::before { content: "\f8ef"; } +.bi-luggage::before { content: "\f8f0"; } +.bi-mailbox-flag::before { content: "\f8f1"; } +.bi-mailbox2-flag::before { content: "\f8f2"; } +.bi-noise-reduction::before { content: "\f8f3"; } +.bi-passport-fill::before { content: "\f8f4"; } +.bi-passport::before { content: "\f8f5"; } +.bi-person-arms-up::before { content: "\f8f6"; } +.bi-person-raised-hand::before { content: "\f8f7"; } +.bi-person-standing-dress::before { content: "\f8f8"; } +.bi-person-standing::before { content: "\f8f9"; } +.bi-person-walking::before { content: "\f8fa"; } +.bi-person-wheelchair::before { content: "\f8fb"; } +.bi-shadows::before { content: "\f8fc"; } +.bi-suitcase-fill::before { content: "\f8fd"; } +.bi-suitcase-lg-fill::before { content: "\f8fe"; } +.bi-suitcase-lg::before { content: "\f8ff"; } +.bi-suitcase::before { content: "\f900"; } +.bi-suitcase2-fill::before { content: "\f901"; } +.bi-suitcase2::before { content: "\f902"; } +.bi-vignette::before { content: "\f903"; } diff --git a/blog/docs/site_libs/bootstrap/bootstrap-icons.woff b/blog/docs/site_libs/bootstrap/bootstrap-icons.woff new file mode 100644 index 0000000..dbeeb05 Binary files /dev/null and b/blog/docs/site_libs/bootstrap/bootstrap-icons.woff differ diff --git a/blog/docs/site_libs/bootstrap/bootstrap.min.css b/blog/docs/site_libs/bootstrap/bootstrap.min.css new file mode 100644 index 0000000..04d66ed --- /dev/null +++ b/blog/docs/site_libs/bootstrap/bootstrap.min.css @@ -0,0 +1,12 @@ +/*! + * 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}}: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}: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%)}@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-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}}.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)}}.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)}.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)}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)}}: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}.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}}.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}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 +* +* we also add `bright-[color]-` synonyms for the `-[color]-intense` classes since +* that seems to be what ansi_up emits +* +*/.ansi-black-fg{color:#3e424d}.ansi-black-bg{background-color:#3e424d}.ansi-black-intense-black,.ansi-bright-black-fg{color:#282c36}.ansi-black-intense-black,.ansi-bright-black-bg{background-color:#282c36}.ansi-red-fg{color:#e75c58}.ansi-red-bg{background-color:#e75c58}.ansi-red-intense-red,.ansi-bright-red-fg{color:#b22b31}.ansi-red-intense-red,.ansi-bright-red-bg{background-color:#b22b31}.ansi-green-fg{color:#00a250}.ansi-green-bg{background-color:#00a250}.ansi-green-intense-green,.ansi-bright-green-fg{color:#007427}.ansi-green-intense-green,.ansi-bright-green-bg{background-color:#007427}.ansi-yellow-fg{color:#ddb62b}.ansi-yellow-bg{background-color:#ddb62b}.ansi-yellow-intense-yellow,.ansi-bright-yellow-fg{color:#b27d12}.ansi-yellow-intense-yellow,.ansi-bright-yellow-bg{background-color:#b27d12}.ansi-blue-fg{color:#208ffb}.ansi-blue-bg{background-color:#208ffb}.ansi-blue-intense-blue,.ansi-bright-blue-fg{color:#0065ca}.ansi-blue-intense-blue,.ansi-bright-blue-bg{background-color:#0065ca}.ansi-magenta-fg{color:#d160c4}.ansi-magenta-bg{background-color:#d160c4}.ansi-magenta-intense-magenta,.ansi-bright-magenta-fg{color:#a03196}.ansi-magenta-intense-magenta,.ansi-bright-magenta-bg{background-color:#a03196}.ansi-cyan-fg{color:#60c6c8}.ansi-cyan-bg{background-color:#60c6c8}.ansi-cyan-intense-cyan,.ansi-bright-cyan-fg{color:#258f8f}.ansi-cyan-intense-cyan,.ansi-bright-cyan-bg{background-color:#258f8f}.ansi-white-fg{color:#c5c1b4}.ansi-white-bg{background-color:#c5c1b4}.ansi-white-intense-white,.ansi-bright-white-fg{color:#a1a6b2}.ansi-white-intense-white,.ansi-bright-white-bg{background-color:#a1a6b2}.ansi-default-inverse-fg{color:#fff}.ansi-default-inverse-bg{background-color:#000}.ansi-bold{font-weight:bold}.ansi-underline{text-decoration:underline}:root{--quarto-body-bg: #fff;--quarto-body-color: #343a40;--quarto-text-muted: #6c757d;--quarto-border-color: #dee2e6;--quarto-border-width: 1px;--quarto-border-radius: 0.25rem}table.gt_table{color:var(--quarto-body-color);font-size:1em;width:100%;background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_column_spanner_outer{color:var(--quarto-body-color);background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_col_heading{color:var(--quarto-body-color);font-weight:bold;background-color:rgba(0,0,0,0)}table.gt_table thead.gt_col_headings{border-bottom:1px solid currentColor;border-top-width:inherit;border-top-color:var(--quarto-border-color)}table.gt_table thead.gt_col_headings:not(:first-child){border-top-width:1px;border-top-color:var(--quarto-border-color)}table.gt_table td.gt_row{border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-width:0px}table.gt_table tbody.gt_table_body{border-top-width:1px;border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-color:currentColor}div.columns{display:initial;gap:initial}div.column{display:inline-block;overflow-x:initial;vertical-align:top;width:50%}.code-annotation-tip-content{word-wrap:break-word}.code-annotation-container-hidden{display:none !important}dl.code-annotation-container-grid{display:grid;grid-template-columns:min-content auto}dl.code-annotation-container-grid dt{grid-column:1}dl.code-annotation-container-grid dd{grid-column:2}pre.sourceCode.code-annotation-code{padding-right:0}code.sourceCode .code-annotation-anchor{z-index:100;position:relative;float:right;background-color:rgba(0,0,0,0)}input[type=checkbox]{margin-right:.5ch}:root{--mermaid-bg-color: #fff;--mermaid-edge-color: #343a40;--mermaid-node-fg-color: #343a40;--mermaid-fg-color: #343a40;--mermaid-fg-color--lighter: #4b545c;--mermaid-fg-color--lightest: #626d78;--mermaid-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;--mermaid-label-bg-color: #fff;--mermaid-label-fg-color: #2780e3;--mermaid-node-bg-color: rgba(39, 128, 227, 0.1);--mermaid-node-fg-color: #343a40}@media print{:root{font-size:11pt}#quarto-sidebar,#TOC,.nav-page{display:none}.page-columns .content{grid-column-start:page-start}.fixed-top{position:relative}.panel-caption,.figure-caption,figcaption{color:#666}}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:rgba(0,0,0,0);z-index:3}.code-copy-button:focus{outline:none}.code-copy-button-tooltip{font-size:.75em}pre.sourceCode:hover>.code-copy-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}pre.sourceCode:hover>.code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button-checked:hover>.bi::before{background-image:url('data:image/svg+xml,')}main ol ol,main ul ul,main ol ul,main ul ol{margin-bottom:1em}ul>li:not(:has(>p))>ul,ol>li:not(:has(>p))>ul,ul>li:not(:has(>p))>ol,ol>li:not(:has(>p))>ol{margin-bottom:0}ul>li:not(:has(>p))>ul>li:has(>p),ol>li:not(:has(>p))>ul>li:has(>p),ul>li:not(:has(>p))>ol>li:has(>p),ol>li:not(:has(>p))>ol>li:has(>p){margin-top:1rem}body{margin:0}main.page-columns>header>h1.title,main.page-columns>header>.title.h1{margin-bottom:0}@media(min-width: 992px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] 35px [page-end-inset page-end] 5fr [screen-end-inset] 1.5em}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 3em [body-end] 50px [body-end-outset] minmax(0px, 250px) [page-end-inset] minmax(50px, 100px) [page-end] 1fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 150px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 991.98px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(1250px - 3em)) [body-content-end body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 767.98px){body .page-columns,body.fullcontent:not(.floating):not(.docked) .page-columns,body.slimcontent:not(.floating):not(.docked) .page-columns,body.docked .page-columns,body.docked.slimcontent .page-columns,body.docked.fullcontent .page-columns,body.floating .page-columns,body.floating.slimcontent .page-columns,body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}nav[role=doc-toc]{display:none}}body,.page-row-navigation{grid-template-rows:[page-top] max-content [contents-top] max-content [contents-bottom] max-content [page-bottom]}.page-rows-contents{grid-template-rows:[content-top] minmax(max-content, 1fr) [content-bottom] minmax(60px, max-content) [page-bottom]}.page-full{grid-column:screen-start/screen-end !important}.page-columns>*{grid-column:body-content-start/body-content-end}.page-columns.column-page>*{grid-column:page-start/page-end}.page-columns.column-page-left .page-columns.page-full>*,.page-columns.column-page-left>*{grid-column:page-start/body-content-end}.page-columns.column-page-right .page-columns.page-full>*,.page-columns.column-page-right>*{grid-column:body-content-start/page-end}.page-rows{grid-auto-rows:auto}.header{grid-column:screen-start/screen-end;grid-row:page-top/contents-top}#quarto-content{padding:0;grid-column:screen-start/screen-end;grid-row:contents-top/contents-bottom}body.floating .sidebar.sidebar-navigation{grid-column:page-start/body-start;grid-row:content-top/page-bottom}body.docked .sidebar.sidebar-navigation{grid-column:screen-start/body-start;grid-row:content-top/page-bottom}.sidebar.toc-left{grid-column:page-start/body-start;grid-row:content-top/page-bottom}.sidebar.margin-sidebar{grid-column:body-end/page-end;grid-row:content-top/page-bottom}.page-columns .content{grid-column:body-content-start/body-content-end;grid-row:content-top/content-bottom;align-content:flex-start}.page-columns .page-navigation{grid-column:body-content-start/body-content-end;grid-row:content-bottom/page-bottom}.page-columns .footer{grid-column:screen-start/screen-end;grid-row:contents-bottom/page-bottom}.page-columns .column-body{grid-column:body-content-start/body-content-end}.page-columns .column-body-fullbleed{grid-column:body-start/body-end}.page-columns .column-body-outset{grid-column:body-start-outset/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset table{background:#fff}.page-columns .column-body-outset-left{grid-column:body-start-outset/body-content-end;z-index:998;opacity:.999}.page-columns .column-body-outset-left table{background:#fff}.page-columns .column-body-outset-right{grid-column:body-content-start/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset-right table{background:#fff}.page-columns .column-page{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-page table{background:#fff}.page-columns .column-page-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset table{background:#fff}.page-columns .column-page-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-inset-left table{background:#fff}.page-columns .column-page-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset-right figcaption table{background:#fff}.page-columns .column-page-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-left table{background:#fff}.page-columns .column-page-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-page-right figcaption table{background:#fff}#quarto-content.page-columns #quarto-margin-sidebar,#quarto-content.page-columns #quarto-sidebar{z-index:1}@media(max-width: 991.98px){#quarto-content.page-columns #quarto-margin-sidebar.collapse,#quarto-content.page-columns #quarto-sidebar.collapse,#quarto-content.page-columns #quarto-margin-sidebar.collapsing,#quarto-content.page-columns #quarto-sidebar.collapsing{z-index:1055}}#quarto-content.page-columns main.column-page,#quarto-content.page-columns main.column-page-right,#quarto-content.page-columns main.column-page-left{z-index:0}.page-columns .column-screen-inset{grid-column:screen-start-inset/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:screen-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:screen-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:screen-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:screen-start/screen-end;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}.zindex-content{z-index:998;opacity:.999}.zindex-modal{z-index:1055;opacity:.999}.zindex-over-content{z-index:999;opacity:.999}img.img-fluid.column-screen,img.img-fluid.column-screen-inset-shaded,img.img-fluid.column-screen-inset,img.img-fluid.column-screen-inset-left,img.img-fluid.column-screen-inset-right,img.img-fluid.column-screen-left,img.img-fluid.column-screen-right{width:100%}@media(min-width: 992px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.column-sidebar{grid-column:page-start/body-start !important;z-index:998}.column-leftmargin{grid-column:screen-start-inset/body-start !important;z-index:998}.no-row-height{height:1em;overflow:visible}}@media(max-width: 991.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.no-row-height{height:1em;overflow:visible}.page-columns.page-full{overflow:visible}.page-columns.toc-left .margin-caption,.page-columns.toc-left div.aside,.page-columns.toc-left aside:not(.footnotes):not(.sidebar),.page-columns.toc-left .column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.page-columns.toc-left .no-row-height{height:initial;overflow:initial}}@media(max-width: 767.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.no-row-height{height:initial;overflow:initial}#quarto-margin-sidebar{display:none}#quarto-sidebar-toc-left{display:none}.hidden-sm{display:none}}.panel-grid{display:grid;grid-template-rows:repeat(1, 1fr);grid-template-columns:repeat(24, 1fr);gap:1em}.panel-grid .g-col-1{grid-column:auto/span 1}.panel-grid .g-col-2{grid-column:auto/span 2}.panel-grid .g-col-3{grid-column:auto/span 3}.panel-grid .g-col-4{grid-column:auto/span 4}.panel-grid .g-col-5{grid-column:auto/span 5}.panel-grid .g-col-6{grid-column:auto/span 6}.panel-grid .g-col-7{grid-column:auto/span 7}.panel-grid .g-col-8{grid-column:auto/span 8}.panel-grid .g-col-9{grid-column:auto/span 9}.panel-grid .g-col-10{grid-column:auto/span 10}.panel-grid .g-col-11{grid-column:auto/span 11}.panel-grid .g-col-12{grid-column:auto/span 12}.panel-grid .g-col-13{grid-column:auto/span 13}.panel-grid .g-col-14{grid-column:auto/span 14}.panel-grid .g-col-15{grid-column:auto/span 15}.panel-grid .g-col-16{grid-column:auto/span 16}.panel-grid .g-col-17{grid-column:auto/span 17}.panel-grid .g-col-18{grid-column:auto/span 18}.panel-grid .g-col-19{grid-column:auto/span 19}.panel-grid .g-col-20{grid-column:auto/span 20}.panel-grid .g-col-21{grid-column:auto/span 21}.panel-grid .g-col-22{grid-column:auto/span 22}.panel-grid .g-col-23{grid-column:auto/span 23}.panel-grid .g-col-24{grid-column:auto/span 24}.panel-grid .g-start-1{grid-column-start:1}.panel-grid .g-start-2{grid-column-start:2}.panel-grid .g-start-3{grid-column-start:3}.panel-grid .g-start-4{grid-column-start:4}.panel-grid .g-start-5{grid-column-start:5}.panel-grid .g-start-6{grid-column-start:6}.panel-grid .g-start-7{grid-column-start:7}.panel-grid .g-start-8{grid-column-start:8}.panel-grid .g-start-9{grid-column-start:9}.panel-grid .g-start-10{grid-column-start:10}.panel-grid .g-start-11{grid-column-start:11}.panel-grid .g-start-12{grid-column-start:12}.panel-grid .g-start-13{grid-column-start:13}.panel-grid .g-start-14{grid-column-start:14}.panel-grid .g-start-15{grid-column-start:15}.panel-grid .g-start-16{grid-column-start:16}.panel-grid .g-start-17{grid-column-start:17}.panel-grid .g-start-18{grid-column-start:18}.panel-grid .g-start-19{grid-column-start:19}.panel-grid .g-start-20{grid-column-start:20}.panel-grid .g-start-21{grid-column-start:21}.panel-grid .g-start-22{grid-column-start:22}.panel-grid .g-start-23{grid-column-start:23}@media(min-width: 576px){.panel-grid .g-col-sm-1{grid-column:auto/span 1}.panel-grid .g-col-sm-2{grid-column:auto/span 2}.panel-grid .g-col-sm-3{grid-column:auto/span 3}.panel-grid .g-col-sm-4{grid-column:auto/span 4}.panel-grid .g-col-sm-5{grid-column:auto/span 5}.panel-grid .g-col-sm-6{grid-column:auto/span 6}.panel-grid .g-col-sm-7{grid-column:auto/span 7}.panel-grid .g-col-sm-8{grid-column:auto/span 8}.panel-grid .g-col-sm-9{grid-column:auto/span 9}.panel-grid .g-col-sm-10{grid-column:auto/span 10}.panel-grid .g-col-sm-11{grid-column:auto/span 11}.panel-grid .g-col-sm-12{grid-column:auto/span 12}.panel-grid .g-col-sm-13{grid-column:auto/span 13}.panel-grid .g-col-sm-14{grid-column:auto/span 14}.panel-grid .g-col-sm-15{grid-column:auto/span 15}.panel-grid .g-col-sm-16{grid-column:auto/span 16}.panel-grid .g-col-sm-17{grid-column:auto/span 17}.panel-grid .g-col-sm-18{grid-column:auto/span 18}.panel-grid .g-col-sm-19{grid-column:auto/span 19}.panel-grid .g-col-sm-20{grid-column:auto/span 20}.panel-grid .g-col-sm-21{grid-column:auto/span 21}.panel-grid .g-col-sm-22{grid-column:auto/span 22}.panel-grid .g-col-sm-23{grid-column:auto/span 23}.panel-grid .g-col-sm-24{grid-column:auto/span 24}.panel-grid .g-start-sm-1{grid-column-start:1}.panel-grid .g-start-sm-2{grid-column-start:2}.panel-grid .g-start-sm-3{grid-column-start:3}.panel-grid .g-start-sm-4{grid-column-start:4}.panel-grid .g-start-sm-5{grid-column-start:5}.panel-grid .g-start-sm-6{grid-column-start:6}.panel-grid .g-start-sm-7{grid-column-start:7}.panel-grid .g-start-sm-8{grid-column-start:8}.panel-grid .g-start-sm-9{grid-column-start:9}.panel-grid .g-start-sm-10{grid-column-start:10}.panel-grid .g-start-sm-11{grid-column-start:11}.panel-grid .g-start-sm-12{grid-column-start:12}.panel-grid .g-start-sm-13{grid-column-start:13}.panel-grid .g-start-sm-14{grid-column-start:14}.panel-grid .g-start-sm-15{grid-column-start:15}.panel-grid .g-start-sm-16{grid-column-start:16}.panel-grid .g-start-sm-17{grid-column-start:17}.panel-grid .g-start-sm-18{grid-column-start:18}.panel-grid .g-start-sm-19{grid-column-start:19}.panel-grid .g-start-sm-20{grid-column-start:20}.panel-grid .g-start-sm-21{grid-column-start:21}.panel-grid .g-start-sm-22{grid-column-start:22}.panel-grid .g-start-sm-23{grid-column-start:23}}@media(min-width: 768px){.panel-grid .g-col-md-1{grid-column:auto/span 1}.panel-grid .g-col-md-2{grid-column:auto/span 2}.panel-grid .g-col-md-3{grid-column:auto/span 3}.panel-grid .g-col-md-4{grid-column:auto/span 4}.panel-grid .g-col-md-5{grid-column:auto/span 5}.panel-grid .g-col-md-6{grid-column:auto/span 6}.panel-grid .g-col-md-7{grid-column:auto/span 7}.panel-grid .g-col-md-8{grid-column:auto/span 8}.panel-grid .g-col-md-9{grid-column:auto/span 9}.panel-grid .g-col-md-10{grid-column:auto/span 10}.panel-grid .g-col-md-11{grid-column:auto/span 11}.panel-grid .g-col-md-12{grid-column:auto/span 12}.panel-grid .g-col-md-13{grid-column:auto/span 13}.panel-grid .g-col-md-14{grid-column:auto/span 14}.panel-grid .g-col-md-15{grid-column:auto/span 15}.panel-grid .g-col-md-16{grid-column:auto/span 16}.panel-grid .g-col-md-17{grid-column:auto/span 17}.panel-grid .g-col-md-18{grid-column:auto/span 18}.panel-grid .g-col-md-19{grid-column:auto/span 19}.panel-grid .g-col-md-20{grid-column:auto/span 20}.panel-grid .g-col-md-21{grid-column:auto/span 21}.panel-grid .g-col-md-22{grid-column:auto/span 22}.panel-grid .g-col-md-23{grid-column:auto/span 23}.panel-grid .g-col-md-24{grid-column:auto/span 24}.panel-grid .g-start-md-1{grid-column-start:1}.panel-grid .g-start-md-2{grid-column-start:2}.panel-grid .g-start-md-3{grid-column-start:3}.panel-grid .g-start-md-4{grid-column-start:4}.panel-grid .g-start-md-5{grid-column-start:5}.panel-grid .g-start-md-6{grid-column-start:6}.panel-grid .g-start-md-7{grid-column-start:7}.panel-grid .g-start-md-8{grid-column-start:8}.panel-grid .g-start-md-9{grid-column-start:9}.panel-grid .g-start-md-10{grid-column-start:10}.panel-grid .g-start-md-11{grid-column-start:11}.panel-grid .g-start-md-12{grid-column-start:12}.panel-grid .g-start-md-13{grid-column-start:13}.panel-grid .g-start-md-14{grid-column-start:14}.panel-grid .g-start-md-15{grid-column-start:15}.panel-grid .g-start-md-16{grid-column-start:16}.panel-grid .g-start-md-17{grid-column-start:17}.panel-grid .g-start-md-18{grid-column-start:18}.panel-grid .g-start-md-19{grid-column-start:19}.panel-grid .g-start-md-20{grid-column-start:20}.panel-grid .g-start-md-21{grid-column-start:21}.panel-grid .g-start-md-22{grid-column-start:22}.panel-grid .g-start-md-23{grid-column-start:23}}@media(min-width: 992px){.panel-grid .g-col-lg-1{grid-column:auto/span 1}.panel-grid .g-col-lg-2{grid-column:auto/span 2}.panel-grid .g-col-lg-3{grid-column:auto/span 3}.panel-grid .g-col-lg-4{grid-column:auto/span 4}.panel-grid .g-col-lg-5{grid-column:auto/span 5}.panel-grid .g-col-lg-6{grid-column:auto/span 6}.panel-grid .g-col-lg-7{grid-column:auto/span 7}.panel-grid .g-col-lg-8{grid-column:auto/span 8}.panel-grid .g-col-lg-9{grid-column:auto/span 9}.panel-grid .g-col-lg-10{grid-column:auto/span 10}.panel-grid .g-col-lg-11{grid-column:auto/span 11}.panel-grid .g-col-lg-12{grid-column:auto/span 12}.panel-grid .g-col-lg-13{grid-column:auto/span 13}.panel-grid .g-col-lg-14{grid-column:auto/span 14}.panel-grid .g-col-lg-15{grid-column:auto/span 15}.panel-grid .g-col-lg-16{grid-column:auto/span 16}.panel-grid .g-col-lg-17{grid-column:auto/span 17}.panel-grid .g-col-lg-18{grid-column:auto/span 18}.panel-grid .g-col-lg-19{grid-column:auto/span 19}.panel-grid .g-col-lg-20{grid-column:auto/span 20}.panel-grid .g-col-lg-21{grid-column:auto/span 21}.panel-grid .g-col-lg-22{grid-column:auto/span 22}.panel-grid .g-col-lg-23{grid-column:auto/span 23}.panel-grid .g-col-lg-24{grid-column:auto/span 24}.panel-grid .g-start-lg-1{grid-column-start:1}.panel-grid .g-start-lg-2{grid-column-start:2}.panel-grid .g-start-lg-3{grid-column-start:3}.panel-grid .g-start-lg-4{grid-column-start:4}.panel-grid .g-start-lg-5{grid-column-start:5}.panel-grid .g-start-lg-6{grid-column-start:6}.panel-grid .g-start-lg-7{grid-column-start:7}.panel-grid .g-start-lg-8{grid-column-start:8}.panel-grid .g-start-lg-9{grid-column-start:9}.panel-grid .g-start-lg-10{grid-column-start:10}.panel-grid .g-start-lg-11{grid-column-start:11}.panel-grid .g-start-lg-12{grid-column-start:12}.panel-grid .g-start-lg-13{grid-column-start:13}.panel-grid .g-start-lg-14{grid-column-start:14}.panel-grid .g-start-lg-15{grid-column-start:15}.panel-grid .g-start-lg-16{grid-column-start:16}.panel-grid .g-start-lg-17{grid-column-start:17}.panel-grid .g-start-lg-18{grid-column-start:18}.panel-grid .g-start-lg-19{grid-column-start:19}.panel-grid .g-start-lg-20{grid-column-start:20}.panel-grid .g-start-lg-21{grid-column-start:21}.panel-grid .g-start-lg-22{grid-column-start:22}.panel-grid .g-start-lg-23{grid-column-start:23}}@media(min-width: 1200px){.panel-grid .g-col-xl-1{grid-column:auto/span 1}.panel-grid .g-col-xl-2{grid-column:auto/span 2}.panel-grid .g-col-xl-3{grid-column:auto/span 3}.panel-grid .g-col-xl-4{grid-column:auto/span 4}.panel-grid .g-col-xl-5{grid-column:auto/span 5}.panel-grid .g-col-xl-6{grid-column:auto/span 6}.panel-grid .g-col-xl-7{grid-column:auto/span 7}.panel-grid .g-col-xl-8{grid-column:auto/span 8}.panel-grid .g-col-xl-9{grid-column:auto/span 9}.panel-grid .g-col-xl-10{grid-column:auto/span 10}.panel-grid .g-col-xl-11{grid-column:auto/span 11}.panel-grid .g-col-xl-12{grid-column:auto/span 12}.panel-grid .g-col-xl-13{grid-column:auto/span 13}.panel-grid .g-col-xl-14{grid-column:auto/span 14}.panel-grid .g-col-xl-15{grid-column:auto/span 15}.panel-grid .g-col-xl-16{grid-column:auto/span 16}.panel-grid .g-col-xl-17{grid-column:auto/span 17}.panel-grid .g-col-xl-18{grid-column:auto/span 18}.panel-grid .g-col-xl-19{grid-column:auto/span 19}.panel-grid .g-col-xl-20{grid-column:auto/span 20}.panel-grid .g-col-xl-21{grid-column:auto/span 21}.panel-grid .g-col-xl-22{grid-column:auto/span 22}.panel-grid .g-col-xl-23{grid-column:auto/span 23}.panel-grid .g-col-xl-24{grid-column:auto/span 24}.panel-grid .g-start-xl-1{grid-column-start:1}.panel-grid .g-start-xl-2{grid-column-start:2}.panel-grid .g-start-xl-3{grid-column-start:3}.panel-grid .g-start-xl-4{grid-column-start:4}.panel-grid .g-start-xl-5{grid-column-start:5}.panel-grid .g-start-xl-6{grid-column-start:6}.panel-grid .g-start-xl-7{grid-column-start:7}.panel-grid .g-start-xl-8{grid-column-start:8}.panel-grid .g-start-xl-9{grid-column-start:9}.panel-grid .g-start-xl-10{grid-column-start:10}.panel-grid .g-start-xl-11{grid-column-start:11}.panel-grid .g-start-xl-12{grid-column-start:12}.panel-grid .g-start-xl-13{grid-column-start:13}.panel-grid .g-start-xl-14{grid-column-start:14}.panel-grid .g-start-xl-15{grid-column-start:15}.panel-grid .g-start-xl-16{grid-column-start:16}.panel-grid .g-start-xl-17{grid-column-start:17}.panel-grid .g-start-xl-18{grid-column-start:18}.panel-grid .g-start-xl-19{grid-column-start:19}.panel-grid .g-start-xl-20{grid-column-start:20}.panel-grid .g-start-xl-21{grid-column-start:21}.panel-grid .g-start-xl-22{grid-column-start:22}.panel-grid .g-start-xl-23{grid-column-start:23}}@media(min-width: 1400px){.panel-grid .g-col-xxl-1{grid-column:auto/span 1}.panel-grid .g-col-xxl-2{grid-column:auto/span 2}.panel-grid .g-col-xxl-3{grid-column:auto/span 3}.panel-grid .g-col-xxl-4{grid-column:auto/span 4}.panel-grid .g-col-xxl-5{grid-column:auto/span 5}.panel-grid .g-col-xxl-6{grid-column:auto/span 6}.panel-grid .g-col-xxl-7{grid-column:auto/span 7}.panel-grid .g-col-xxl-8{grid-column:auto/span 8}.panel-grid .g-col-xxl-9{grid-column:auto/span 9}.panel-grid .g-col-xxl-10{grid-column:auto/span 10}.panel-grid .g-col-xxl-11{grid-column:auto/span 11}.panel-grid .g-col-xxl-12{grid-column:auto/span 12}.panel-grid .g-col-xxl-13{grid-column:auto/span 13}.panel-grid .g-col-xxl-14{grid-column:auto/span 14}.panel-grid .g-col-xxl-15{grid-column:auto/span 15}.panel-grid .g-col-xxl-16{grid-column:auto/span 16}.panel-grid .g-col-xxl-17{grid-column:auto/span 17}.panel-grid .g-col-xxl-18{grid-column:auto/span 18}.panel-grid .g-col-xxl-19{grid-column:auto/span 19}.panel-grid .g-col-xxl-20{grid-column:auto/span 20}.panel-grid .g-col-xxl-21{grid-column:auto/span 21}.panel-grid .g-col-xxl-22{grid-column:auto/span 22}.panel-grid .g-col-xxl-23{grid-column:auto/span 23}.panel-grid .g-col-xxl-24{grid-column:auto/span 24}.panel-grid .g-start-xxl-1{grid-column-start:1}.panel-grid .g-start-xxl-2{grid-column-start:2}.panel-grid .g-start-xxl-3{grid-column-start:3}.panel-grid .g-start-xxl-4{grid-column-start:4}.panel-grid .g-start-xxl-5{grid-column-start:5}.panel-grid .g-start-xxl-6{grid-column-start:6}.panel-grid .g-start-xxl-7{grid-column-start:7}.panel-grid .g-start-xxl-8{grid-column-start:8}.panel-grid .g-start-xxl-9{grid-column-start:9}.panel-grid .g-start-xxl-10{grid-column-start:10}.panel-grid .g-start-xxl-11{grid-column-start:11}.panel-grid .g-start-xxl-12{grid-column-start:12}.panel-grid .g-start-xxl-13{grid-column-start:13}.panel-grid .g-start-xxl-14{grid-column-start:14}.panel-grid .g-start-xxl-15{grid-column-start:15}.panel-grid .g-start-xxl-16{grid-column-start:16}.panel-grid .g-start-xxl-17{grid-column-start:17}.panel-grid .g-start-xxl-18{grid-column-start:18}.panel-grid .g-start-xxl-19{grid-column-start:19}.panel-grid .g-start-xxl-20{grid-column-start:20}.panel-grid .g-start-xxl-21{grid-column-start:21}.panel-grid .g-start-xxl-22{grid-column-start:22}.panel-grid .g-start-xxl-23{grid-column-start:23}}main{margin-top:1em;margin-bottom:1em}h1,.h1,h2,.h2{color:inherit;margin-top:2rem;margin-bottom:1rem;font-weight:600}h1.title,.title.h1{margin-top:0}main.content>section:first-of-type>h2:first-child,main.content>section:first-of-type>.h2:first-child{margin-top:0}h2,.h2{border-bottom:1px solid #dee2e6;padding-bottom:.5rem}h3,.h3{font-weight:600}h3,.h3,h4,.h4{opacity:.9;margin-top:1.5rem}h5,.h5,h6,.h6{opacity:.9}.header-section-number{color:#6d7a86}.nav-link.active .header-section-number{color:inherit}mark,.mark{padding:0em}.panel-caption,.figure-caption,.subfigure-caption,.table-caption,figcaption,caption{font-size:.9rem;color:#6d7a86}.quarto-layout-cell[data-ref-parent] caption{color:#6d7a86}.column-margin figcaption,.margin-caption,div.aside,aside,.column-margin{color:#6d7a86;font-size:.825rem}.panel-caption.margin-caption{text-align:inherit}.column-margin.column-container p{margin-bottom:0}.column-margin.column-container>*:not(.collapse):first-child{padding-bottom:.5em;display:block}.column-margin.column-container>*:not(.collapse):not(:first-child){padding-top:.5em;padding-bottom:.5em;display:block}.column-margin.column-container>*.collapse:not(.show){display:none}@media(min-width: 768px){.column-margin.column-container .callout-margin-content:first-child{margin-top:4.5em}.column-margin.column-container .callout-margin-content-simple:first-child{margin-top:3.5em}}.margin-caption>*{padding-top:.5em;padding-bottom:.5em}@media(max-width: 767.98px){.quarto-layout-row{flex-direction:column}}.nav-tabs .nav-item{margin-top:1px;cursor:pointer}.tab-content{margin-top:0px;border-left:#dee2e6 1px solid;border-right:#dee2e6 1px solid;border-bottom:#dee2e6 1px solid;margin-left:0;padding:1em;margin-bottom:1em}@media(max-width: 767.98px){.layout-sidebar{margin-left:0;margin-right:0}}.panel-sidebar,.panel-sidebar .form-control,.panel-input,.panel-input .form-control,.selectize-dropdown{font-size:.9rem}.panel-sidebar .form-control,.panel-input .form-control{padding-top:.1rem}.tab-pane div.sourceCode{margin-top:0px}.tab-pane>p{padding-top:0}.tab-pane>p:nth-child(1){padding-top:0}.tab-pane>p:last-child{margin-bottom:0}.tab-pane>pre:last-child{margin-bottom:0}.tab-content>.tab-pane:not(.active){display:none !important}div.sourceCode{background-color:rgba(233,236,239,.65);border:1px solid rgba(233,236,239,.65);border-radius:.25rem}pre.sourceCode{background-color:rgba(0,0,0,0)}pre.sourceCode{border:none;font-size:.875em;overflow:visible !important;padding:.4em}.callout pre.sourceCode{padding-left:0}div.sourceCode{overflow-y:hidden}.callout div.sourceCode{margin-left:initial}.blockquote{font-size:inherit;padding-left:1rem;padding-right:1.5rem;color:#6d7a86}.blockquote h1:first-child,.blockquote .h1:first-child,.blockquote h2:first-child,.blockquote .h2:first-child,.blockquote h3:first-child,.blockquote .h3:first-child,.blockquote h4:first-child,.blockquote .h4:first-child,.blockquote h5:first-child,.blockquote .h5:first-child{margin-top:0}pre{background-color:initial;padding:initial;border:initial}p pre code:not(.sourceCode),li pre code:not(.sourceCode),pre code:not(.sourceCode){background-color:initial}p code:not(.sourceCode),li code:not(.sourceCode),td code:not(.sourceCode){background-color:#f8f9fa;padding:.2em}nav p code:not(.sourceCode),nav li code:not(.sourceCode),nav td code:not(.sourceCode){background-color:rgba(0,0,0,0);padding:0}td code:not(.sourceCode){white-space:pre-wrap}#quarto-embedded-source-code-modal>.modal-dialog{max-width:1000px;padding-left:1.75rem;padding-right:1.75rem}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body{padding:0}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body div.sourceCode{margin:0;padding:.2rem .2rem;border-radius:0px;border:none}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-header{padding:.7rem}.code-tools-button{font-size:1rem;padding:.15rem .15rem;margin-left:5px;color:#6c757d;background-color:rgba(0,0,0,0);transition:initial;cursor:pointer}.code-tools-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}.code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}.sidebar{will-change:top;transition:top 200ms linear;position:sticky;overflow-y:auto;padding-top:1.2em;max-height:100vh}.sidebar.toc-left,.sidebar.margin-sidebar{top:0px;padding-top:1em}.sidebar.quarto-banner-title-block-sidebar>*{padding-top:1.65em}figure .quarto-notebook-link{margin-top:.5em}.quarto-notebook-link{font-size:.75em;color:#6c757d;margin-bottom:1em;text-decoration:none;display:block}.quarto-notebook-link:hover{text-decoration:underline;color:#2761e3}.quarto-notebook-link::before{display:inline-block;height:.75rem;width:.75rem;margin-bottom:0em;margin-right:.25em;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:.75rem .75rem}.toc-actions i.bi,.quarto-code-links i.bi,.quarto-other-links i.bi,.quarto-alternate-notebooks i.bi,.quarto-alternate-formats i.bi{margin-right:.4em;font-size:.8rem}.quarto-other-links-text-target .quarto-code-links i.bi,.quarto-other-links-text-target .quarto-other-links i.bi{margin-right:.2em}.quarto-other-formats-text-target .quarto-alternate-formats i.bi{margin-right:.1em}.toc-actions i.bi.empty,.quarto-code-links i.bi.empty,.quarto-other-links i.bi.empty,.quarto-alternate-notebooks i.bi.empty,.quarto-alternate-formats i.bi.empty{padding-left:1em}.quarto-notebook h2,.quarto-notebook .h2{border-bottom:none}.quarto-notebook .cell-container{display:flex}.quarto-notebook .cell-container .cell{flex-grow:4}.quarto-notebook .cell-container .cell-decorator{padding-top:1.5em;padding-right:1em;text-align:right}.quarto-notebook .cell-container.code-fold .cell-decorator{padding-top:3em}.quarto-notebook .cell-code code{white-space:pre-wrap}.quarto-notebook .cell .cell-output-stderr pre code,.quarto-notebook .cell .cell-output-stdout pre code{white-space:pre-wrap;overflow-wrap:anywhere}.toc-actions,.quarto-alternate-formats,.quarto-other-links,.quarto-code-links,.quarto-alternate-notebooks{padding-left:0em}.sidebar .toc-actions a,.sidebar .quarto-alternate-formats a,.sidebar .quarto-other-links a,.sidebar .quarto-code-links a,.sidebar .quarto-alternate-notebooks a,.sidebar nav[role=doc-toc] a{text-decoration:none}.sidebar .toc-actions a:hover,.sidebar .quarto-other-links a:hover,.sidebar .quarto-code-links a:hover,.sidebar .quarto-alternate-formats a:hover,.sidebar .quarto-alternate-notebooks a:hover{color:#2761e3}.sidebar .toc-actions h2,.sidebar .toc-actions .h2,.sidebar .quarto-code-links h2,.sidebar .quarto-code-links .h2,.sidebar .quarto-other-links h2,.sidebar .quarto-other-links .h2,.sidebar .quarto-alternate-notebooks h2,.sidebar .quarto-alternate-notebooks .h2,.sidebar .quarto-alternate-formats h2,.sidebar .quarto-alternate-formats .h2,.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-weight:500;margin-bottom:.2rem;margin-top:.3rem;font-family:inherit;border-bottom:0;padding-bottom:0;padding-top:0px}.sidebar .toc-actions>h2,.sidebar .toc-actions>.h2,.sidebar .quarto-code-links>h2,.sidebar .quarto-code-links>.h2,.sidebar .quarto-other-links>h2,.sidebar .quarto-other-links>.h2,.sidebar .quarto-alternate-notebooks>h2,.sidebar .quarto-alternate-notebooks>.h2,.sidebar .quarto-alternate-formats>h2,.sidebar .quarto-alternate-formats>.h2{font-size:.8rem}.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-size:.875rem}.sidebar nav[role=doc-toc]>ul a{border-left:1px solid #e9ecef;padding-left:.6rem}.sidebar .toc-actions h2>ul a,.sidebar .toc-actions .h2>ul a,.sidebar .quarto-code-links h2>ul a,.sidebar .quarto-code-links .h2>ul a,.sidebar .quarto-other-links h2>ul a,.sidebar .quarto-other-links .h2>ul a,.sidebar .quarto-alternate-notebooks h2>ul a,.sidebar .quarto-alternate-notebooks .h2>ul a,.sidebar .quarto-alternate-formats h2>ul a,.sidebar .quarto-alternate-formats .h2>ul a{border-left:none;padding-left:.6rem}.sidebar .toc-actions ul a:empty,.sidebar .quarto-code-links ul a:empty,.sidebar .quarto-other-links ul a:empty,.sidebar .quarto-alternate-notebooks ul a:empty,.sidebar .quarto-alternate-formats ul a:empty,.sidebar nav[role=doc-toc]>ul a:empty{display:none}.sidebar .toc-actions ul,.sidebar .quarto-code-links ul,.sidebar .quarto-other-links ul,.sidebar .quarto-alternate-notebooks ul,.sidebar .quarto-alternate-formats ul{padding-left:0;list-style:none}.sidebar nav[role=doc-toc] ul{list-style:none;padding-left:0;list-style:none}.sidebar nav[role=doc-toc]>ul{margin-left:.45em}.quarto-margin-sidebar nav[role=doc-toc]{padding-left:.5em}.sidebar .toc-actions>ul,.sidebar .quarto-code-links>ul,.sidebar .quarto-other-links>ul,.sidebar .quarto-alternate-notebooks>ul,.sidebar .quarto-alternate-formats>ul{font-size:.8rem}.sidebar nav[role=doc-toc]>ul{font-size:.875rem}.sidebar .toc-actions ul li a,.sidebar .quarto-code-links ul li a,.sidebar .quarto-other-links ul li a,.sidebar .quarto-alternate-notebooks ul li a,.sidebar .quarto-alternate-formats ul li a,.sidebar nav[role=doc-toc]>ul li a{line-height:1.1rem;padding-bottom:.2rem;padding-top:.2rem;color:inherit}.sidebar nav[role=doc-toc] ul>li>ul>li>a{padding-left:1.2em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>a{padding-left:2.4em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>a{padding-left:3.6em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:4.8em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:6em}.sidebar nav[role=doc-toc] ul>li>a.active,.sidebar nav[role=doc-toc] ul>li>ul>li>a.active{border-left:1px solid #2761e3;color:#2761e3 !important}.sidebar nav[role=doc-toc] ul>li>a:hover,.sidebar nav[role=doc-toc] ul>li>ul>li>a:hover{color:#2761e3 !important}kbd,.kbd{color:#343a40;background-color:#f8f9fa;border:1px solid;border-radius:5px;border-color:#dee2e6}.quarto-appendix-contents div.hanging-indent{margin-left:0em}.quarto-appendix-contents div.hanging-indent div.csl-entry{margin-left:1em;text-indent:-1em}.citation a,.footnote-ref{text-decoration:none}.footnotes ol{padding-left:1em}.tippy-content>*{margin-bottom:.7em}.tippy-content>*:last-child{margin-bottom:0}.callout{margin-top:1.25rem;margin-bottom:1.25rem;border-radius:.25rem;overflow-wrap:break-word}.callout .callout-title-container{overflow-wrap:anywhere}.callout.callout-style-simple{padding:.4em .7em;border-left:5px solid;border-right:1px solid #dee2e6;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.callout.callout-style-default{border-left:5px solid;border-right:1px solid #dee2e6;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.callout .callout-body-container{flex-grow:1}.callout.callout-style-simple .callout-body{font-size:.9rem;font-weight:400}.callout.callout-style-default .callout-body{font-size:.9rem;font-weight:400}.callout:not(.no-icon).callout-titled.callout-style-simple .callout-body{padding-left:1.6em}.callout.callout-titled>.callout-header{padding-top:.2em;margin-bottom:-0.2em}.callout.callout-style-simple>div.callout-header{border-bottom:none;font-size:.9rem;font-weight:600;opacity:75%}.callout.callout-style-default>div.callout-header{border-bottom:none;font-weight:600;opacity:85%;font-size:.9rem;padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body{padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body>:first-child{padding-top:.5rem;margin-top:0}.callout>div.callout-header[data-bs-toggle=collapse]{cursor:pointer}.callout.callout-style-default .callout-header[aria-expanded=false],.callout.callout-style-default .callout-header[aria-expanded=true]{padding-top:0px;margin-bottom:0px;align-items:center}.callout.callout-titled .callout-body>:last-child:not(.sourceCode),.callout.callout-titled .callout-body>div>:last-child:not(.sourceCode){padding-bottom:.5rem;margin-bottom:0}.callout:not(.callout-titled) .callout-body>:first-child,.callout:not(.callout-titled) .callout-body>div>:first-child{margin-top:.25rem}.callout:not(.callout-titled) .callout-body>:last-child,.callout:not(.callout-titled) .callout-body>div>:last-child{margin-bottom:.2rem}.callout.callout-style-simple .callout-icon::before,.callout.callout-style-simple .callout-toggle::before{height:1rem;width:1rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.callout.callout-style-default .callout-icon::before,.callout.callout-style-default .callout-toggle::before{height:.9rem;width:.9rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:.9rem .9rem}.callout.callout-style-default .callout-toggle::before{margin-top:5px}.callout .callout-btn-toggle .callout-toggle::before{transition:transform .2s linear}.callout .callout-header[aria-expanded=false] .callout-toggle::before{transform:rotate(-90deg)}.callout .callout-header[aria-expanded=true] .callout-toggle::before{transform:none}.callout.callout-style-simple:not(.no-icon) div.callout-icon-container{padding-top:.2em;padding-right:.55em}.callout.callout-style-default:not(.no-icon) div.callout-icon-container{padding-top:.1em;padding-right:.35em}.callout.callout-style-default:not(.no-icon) div.callout-title-container{margin-top:-1px}.callout.callout-style-default.callout-caution:not(.no-icon) div.callout-icon-container{padding-top:.3em;padding-right:.35em}.callout>.callout-body>.callout-icon-container>.no-icon,.callout>.callout-header>.callout-icon-container>.no-icon{display:none}div.callout.callout{border-left-color:#6c757d}div.callout.callout-style-default>.callout-header{background-color:#6c757d}div.callout-note.callout{border-left-color:#2780e3}div.callout-note.callout-style-default>.callout-header{background-color:#e9f2fc}div.callout-note:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-tip.callout{border-left-color:#3fb618}div.callout-tip.callout-style-default>.callout-header{background-color:#ecf8e8}div.callout-tip:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-warning.callout{border-left-color:#ff7518}div.callout-warning.callout-style-default>.callout-header{background-color:#fff1e8}div.callout-warning:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-caution.callout{border-left-color:#f0ad4e}div.callout-caution.callout-style-default>.callout-header{background-color:#fef7ed}div.callout-caution:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-important.callout{border-left-color:#ff0039}div.callout-important.callout-style-default>.callout-header{background-color:#ffe6eb}div.callout-important:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important .callout-toggle::before{background-image:url('data:image/svg+xml,')}.quarto-toggle-container{display:flex;align-items:center}.quarto-reader-toggle .bi::before,.quarto-color-scheme-toggle .bi::before{display:inline-block;height:1rem;width:1rem;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.sidebar-navigation{padding-left:20px}.navbar{background-color:#f8f9fa;color:#545555}.navbar .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.quarto-sidebar-toggle{border-color:#dee2e6;border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem;border-style:solid;border-width:1px;overflow:hidden;border-top-width:0px;padding-top:0px !important}.quarto-sidebar-toggle-title{cursor:pointer;padding-bottom:2px;margin-left:.25em;text-align:center;font-weight:400;font-size:.775em}#quarto-content .quarto-sidebar-toggle{background:#fafafa}#quarto-content .quarto-sidebar-toggle-title{color:#343a40}.quarto-sidebar-toggle-icon{color:#dee2e6;margin-right:.5em;float:right;transition:transform .2s ease}.quarto-sidebar-toggle-icon::before{padding-top:5px}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-icon{transform:rotate(-180deg)}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-title{border-bottom:solid #dee2e6 1px}.quarto-sidebar-toggle-contents{background-color:#fff;padding-right:10px;padding-left:10px;margin-top:0px !important;transition:max-height .5s ease}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-contents{padding-top:1em;padding-bottom:10px}@media(max-width: 767.98px){.sidebar-menu-container{padding-bottom:5em}}.quarto-sidebar-toggle:not(.expanded) .quarto-sidebar-toggle-contents{padding-top:0px !important;padding-bottom:0px}nav[role=doc-toc]{z-index:1020}#quarto-sidebar>*,nav[role=doc-toc]>*{transition:opacity .1s ease,border .1s ease}#quarto-sidebar.slow>*,nav[role=doc-toc].slow>*{transition:opacity .4s ease,border .4s ease}.quarto-color-scheme-toggle:not(.alternate).top-right .bi::before{background-image:url('data:image/svg+xml,')}.quarto-color-scheme-toggle.alternate.top-right .bi::before{background-image:url('data:image/svg+xml,')}#quarto-appendix.default{border-top:1px solid #dee2e6}#quarto-appendix.default{background-color:#fff;padding-top:1.5em;margin-top:2em;z-index:998}#quarto-appendix.default .quarto-appendix-heading{margin-top:0;line-height:1.4em;font-weight:600;opacity:.9;border-bottom:none;margin-bottom:0}#quarto-appendix.default .footnotes ol,#quarto-appendix.default .footnotes ol li>p:last-of-type,#quarto-appendix.default .quarto-appendix-contents>p:last-of-type{margin-bottom:0}#quarto-appendix.default .footnotes ol{margin-left:.5em}#quarto-appendix.default .quarto-appendix-secondary-label{margin-bottom:.4em}#quarto-appendix.default .quarto-appendix-bibtex{font-size:.7em;padding:1em;border:solid 1px #dee2e6;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-bibtex code.sourceCode{white-space:pre-wrap}#quarto-appendix.default .quarto-appendix-citeas{font-size:.9em;padding:1em;border:solid 1px #dee2e6;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-heading{font-size:1em !important}#quarto-appendix.default *[role=doc-endnotes]>ol,#quarto-appendix.default .quarto-appendix-contents>*:not(h2):not(.h2){font-size:.9em}#quarto-appendix.default section{padding-bottom:1.5em}#quarto-appendix.default section *[role=doc-endnotes],#quarto-appendix.default section>*:not(a){opacity:.9;word-wrap:break-word}.btn.btn-quarto,div.cell-output-display .btn-quarto{--bs-btn-color: #cacccd;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #cacccd;--bs-btn-hover-bg: #52585d;--bs-btn-hover-border-color: #484e53;--bs-btn-focus-shadow-rgb: 75, 80, 85;--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}nav.quarto-secondary-nav.color-navbar{background-color:#f8f9fa;color:#545555}nav.quarto-secondary-nav.color-navbar h1,nav.quarto-secondary-nav.color-navbar .h1,nav.quarto-secondary-nav.color-navbar .quarto-btn-toggle{color:#545555}@media(max-width: 991.98px){body.nav-sidebar .quarto-title-banner{margin-bottom:0;padding-bottom:1em}body.nav-sidebar #title-block-header{margin-block-end:0}}p.subtitle{margin-top:.25em;margin-bottom:.5em}code a:any-link{color:inherit;text-decoration-color:#6c757d}/*! light */div.observablehq table thead tr th{background-color:var(--bs-body-bg)}input,button,select,optgroup,textarea{background-color:var(--bs-body-bg)}.code-annotated .code-copy-button{margin-right:1.25em;margin-top:0;padding-bottom:0;padding-top:3px}.code-annotation-gutter-bg{background-color:#fff}.code-annotation-gutter{background-color:rgba(233,236,239,.65)}.code-annotation-gutter,.code-annotation-gutter-bg{height:100%;width:calc(20px + .5em);position:absolute;top:0;right:0}dl.code-annotation-container-grid dt{margin-right:1em;margin-top:.25rem}dl.code-annotation-container-grid dt{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:#4b545c;border:solid #4b545c 1px;border-radius:50%;height:22px;width:22px;line-height:22px;font-size:11px;text-align:center;vertical-align:middle;text-decoration:none}dl.code-annotation-container-grid dt[data-target-cell]{cursor:pointer}dl.code-annotation-container-grid dt[data-target-cell].code-annotation-active{color:#fff;border:solid #aaa 1px;background-color:#aaa}pre.code-annotation-code{padding-top:0;padding-bottom:0}pre.code-annotation-code code{z-index:3}#code-annotation-line-highlight-gutter{width:100%;border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}#code-annotation-line-highlight{margin-left:-4em;width:calc(100% + 4em);border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}code.sourceCode .code-annotation-anchor.code-annotation-active{background-color:var(--quarto-hl-normal-color, #aaaaaa);border:solid var(--quarto-hl-normal-color, #aaaaaa) 1px;color:#e9ecef;font-weight:bolder}code.sourceCode .code-annotation-anchor{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:var(--quarto-hl-co-color);border:solid var(--quarto-hl-co-color) 1px;border-radius:50%;height:18px;width:18px;font-size:9px;margin-top:2px}code.sourceCode button.code-annotation-anchor{padding:2px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none}code.sourceCode a.code-annotation-anchor{line-height:18px;text-align:center;vertical-align:middle;cursor:default;text-decoration:none}@media print{.page-columns .column-screen-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:page-start-inset/page-end-inset;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}}.quarto-video{margin-bottom:1em}.table{border-top:1px solid #ebedee;border-bottom:1px solid #ebedee}.table>thead{border-top-width:0;border-bottom:1px solid #b2bac1}.table a{word-break:break-word}.table>:not(caption)>*>*{background-color:unset;color:unset}#quarto-document-content .crosstalk-input .checkbox input[type=checkbox],#quarto-document-content .crosstalk-input .checkbox-inline input[type=checkbox]{position:unset;margin-top:unset;margin-left:unset}#quarto-document-content .row{margin-left:unset;margin-right:unset}.quarto-xref{white-space:nowrap}#quarto-draft-alert{margin-top:0px;margin-bottom:0px;padding:.3em;text-align:center;font-size:.9em}#quarto-draft-alert i{margin-right:.3em}a.external:after{content:"";background-image:url('data:image/svg+xml,');background-size:contain;background-repeat:no-repeat;background-position:center center;margin-left:.2em;padding-right:.75em}div.sourceCode code a.external:after{content:none}a.external:after:hover{cursor:pointer}.quarto-ext-icon{display:inline-block;font-size:.75em;padding-left:.3em}.code-with-filename .code-with-filename-file{margin-bottom:0;padding-bottom:2px;padding-top:2px;padding-left:.7em;border:var(--quarto-border-width) solid var(--quarto-border-color);border-radius:var(--quarto-border-radius);border-bottom:0;border-bottom-left-radius:0%;border-bottom-right-radius:0%}.code-with-filename div.sourceCode,.reveal .code-with-filename div.sourceCode{margin-top:0;border-top-left-radius:0%;border-top-right-radius:0%}.code-with-filename .code-with-filename-file pre{margin-bottom:0}.code-with-filename .code-with-filename-file{background-color:rgba(219,219,219,.8)}.quarto-dark .code-with-filename .code-with-filename-file{background-color:#555}.code-with-filename .code-with-filename-file strong{font-weight:400}.quarto-title-banner{margin-bottom:1em;color:#545555;background:#f8f9fa}.quarto-title-banner a{color:#545555}.quarto-title-banner h1,.quarto-title-banner .h1,.quarto-title-banner h2,.quarto-title-banner .h2{color:#545555}.quarto-title-banner .code-tools-button{color:#878888}.quarto-title-banner .code-tools-button:hover{color:#545555}.quarto-title-banner .code-tools-button>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .quarto-title .title{font-weight:600}.quarto-title-banner .quarto-categories{margin-top:.75em}@media(min-width: 992px){.quarto-title-banner{padding-top:2.5em;padding-bottom:2.5em}}@media(max-width: 991.98px){.quarto-title-banner{padding-top:1em;padding-bottom:1em}}@media(max-width: 767.98px){body.hypothesis-enabled #title-block-header>*{padding-right:20px}}main.quarto-banner-title-block>section:first-child>h2,main.quarto-banner-title-block>section:first-child>.h2,main.quarto-banner-title-block>section:first-child>h3,main.quarto-banner-title-block>section:first-child>.h3,main.quarto-banner-title-block>section:first-child>h4,main.quarto-banner-title-block>section:first-child>.h4{margin-top:0}.quarto-title .quarto-categories{display:flex;flex-wrap:wrap;row-gap:.5em;column-gap:.4em;padding-bottom:.5em;margin-top:.75em}.quarto-title .quarto-categories .quarto-category{padding:.25em .75em;font-size:.65em;text-transform:uppercase;border:solid 1px;border-radius:.25rem;opacity:.6}.quarto-title .quarto-categories .quarto-category a{color:inherit}.quarto-title-meta-container{display:grid;grid-template-columns:1fr auto}.quarto-title-meta-column-end{display:flex;flex-direction:column;padding-left:1em}.quarto-title-meta-column-end a .bi{margin-right:.3em}#title-block-header.quarto-title-block.default .quarto-title-meta{display:grid;grid-template-columns:repeat(2, 1fr);grid-column-gap:1em}#title-block-header.quarto-title-block.default .quarto-title .title{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-author-orcid img{margin-top:-0.2em;height:.8em;width:.8em}#title-block-header.quarto-title-block.default .quarto-title-author-email{opacity:.7}#title-block-header.quarto-title-block.default .quarto-description p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p,#title-block-header.quarto-title-block.default .quarto-title-authors p,#title-block-header.quarto-title-block.default .quarto-title-affiliations p{margin-bottom:.1em}#title-block-header.quarto-title-block.default .quarto-title-meta-heading{text-transform:uppercase;margin-top:1em;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-contents{font-size:.9em}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p.affiliation:last-of-type{margin-bottom:.1em}#title-block-header.quarto-title-block.default p.affiliation{margin-bottom:.1em}#title-block-header.quarto-title-block.default .keywords,#title-block-header.quarto-title-block.default .description,#title-block-header.quarto-title-block.default .abstract{margin-top:0}#title-block-header.quarto-title-block.default .keywords>p,#title-block-header.quarto-title-block.default .description>p,#title-block-header.quarto-title-block.default .abstract>p{font-size:.9em}#title-block-header.quarto-title-block.default .keywords>p:last-of-type,#title-block-header.quarto-title-block.default .description>p:last-of-type,#title-block-header.quarto-title-block.default .abstract>p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .keywords .block-title,#title-block-header.quarto-title-block.default .description .block-title,#title-block-header.quarto-title-block.default .abstract .block-title{margin-top:1em;text-transform:uppercase;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-author{display:grid;grid-template-columns:minmax(max-content, 1fr) 1fr;grid-column-gap:1em}.quarto-title-tools-only{display:flex;justify-content:right}body{-webkit-font-smoothing:antialiased}.badge.bg-light{color:#343a40}.progress .progress-bar{font-size:8px;line-height:8px} diff --git a/blog/docs/site_libs/bootstrap/bootstrap.min.js b/blog/docs/site_libs/bootstrap/bootstrap.min.js new file mode 100644 index 0000000..e8f21f7 --- /dev/null +++ b/blog/docs/site_libs/bootstrap/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.1"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Rs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,qs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Vs extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return z.find(Rs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(Rs)?t:z.findOne(Rs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Vs.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(qs))Vs.getOrCreateInstance(t)})),m(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){N.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),d(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),N.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),N.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Qs,(t=>this._onInteraction(t,!0))),N.on(this._element,Xs,(t=>this._onInteraction(t,!1))),N.on(this._element,Ys,(t=>this._onInteraction(t,!0))),N.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ro),m(ro),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Vs,Toast:ro,Tooltip:cs}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/blog/docs/site_libs/clipboard/clipboard.min.js b/blog/docs/site_libs/clipboard/clipboard.min.js new file mode 100644 index 0000000..1103f81 --- /dev/null +++ b/blog/docs/site_libs/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1.anchorjs-link,.anchorjs-link:focus{opacity:1}",A.sheet.cssRules.length),A.sheet.insertRule("[data-anchorjs-icon]::after{content:attr(data-anchorjs-icon)}",A.sheet.cssRules.length),A.sheet.insertRule('@font-face{font-family:anchorjs-icons;src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype")}',A.sheet.cssRules.length)),h=document.querySelectorAll("[id]"),t=[].map.call(h,function(A){return A.id}),i=0;i\]./()*\\\n\t\b\v\u00A0]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),A=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||A||!1}}}); +// @license-end \ No newline at end of file diff --git a/blog/docs/site_libs/quarto-html/popper.min.js b/blog/docs/site_libs/quarto-html/popper.min.js new file mode 100644 index 0000000..e3726d7 --- /dev/null +++ b/blog/docs/site_libs/quarto-html/popper.min.js @@ -0,0 +1,6 @@ +/** + * @popperjs/core v2.11.7 - MIT License + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){"use strict";function t(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function n(e){return e instanceof t(e).Element||e instanceof Element}function r(e){return e instanceof t(e).HTMLElement||e instanceof HTMLElement}function o(e){return"undefined"!=typeof ShadowRoot&&(e instanceof t(e).ShadowRoot||e instanceof ShadowRoot)}var i=Math.max,a=Math.min,s=Math.round;function f(){var e=navigator.userAgentData;return null!=e&&e.brands&&Array.isArray(e.brands)?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function c(){return!/^((?!chrome|android).)*safari/i.test(f())}function p(e,o,i){void 0===o&&(o=!1),void 0===i&&(i=!1);var a=e.getBoundingClientRect(),f=1,p=1;o&&r(e)&&(f=e.offsetWidth>0&&s(a.width)/e.offsetWidth||1,p=e.offsetHeight>0&&s(a.height)/e.offsetHeight||1);var u=(n(e)?t(e):window).visualViewport,l=!c()&&i,d=(a.left+(l&&u?u.offsetLeft:0))/f,h=(a.top+(l&&u?u.offsetTop:0))/p,m=a.width/f,v=a.height/p;return{width:m,height:v,top:h,right:d+m,bottom:h+v,left:d,x:d,y:h}}function u(e){var n=t(e);return{scrollLeft:n.pageXOffset,scrollTop:n.pageYOffset}}function l(e){return e?(e.nodeName||"").toLowerCase():null}function d(e){return((n(e)?e.ownerDocument:e.document)||window.document).documentElement}function h(e){return p(d(e)).left+u(e).scrollLeft}function m(e){return t(e).getComputedStyle(e)}function v(e){var t=m(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function y(e,n,o){void 0===o&&(o=!1);var i,a,f=r(n),c=r(n)&&function(e){var t=e.getBoundingClientRect(),n=s(t.width)/e.offsetWidth||1,r=s(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(n),m=d(n),y=p(e,c,o),g={scrollLeft:0,scrollTop:0},b={x:0,y:0};return(f||!f&&!o)&&(("body"!==l(n)||v(m))&&(g=(i=n)!==t(i)&&r(i)?{scrollLeft:(a=i).scrollLeft,scrollTop:a.scrollTop}:u(i)),r(n)?((b=p(n,!0)).x+=n.clientLeft,b.y+=n.clientTop):m&&(b.x=h(m))),{x:y.left+g.scrollLeft-b.x,y:y.top+g.scrollTop-b.y,width:y.width,height:y.height}}function g(e){var t=p(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function b(e){return"html"===l(e)?e:e.assignedSlot||e.parentNode||(o(e)?e.host:null)||d(e)}function x(e){return["html","body","#document"].indexOf(l(e))>=0?e.ownerDocument.body:r(e)&&v(e)?e:x(b(e))}function w(e,n){var r;void 0===n&&(n=[]);var o=x(e),i=o===(null==(r=e.ownerDocument)?void 0:r.body),a=t(o),s=i?[a].concat(a.visualViewport||[],v(o)?o:[]):o,f=n.concat(s);return i?f:f.concat(w(b(s)))}function O(e){return["table","td","th"].indexOf(l(e))>=0}function j(e){return r(e)&&"fixed"!==m(e).position?e.offsetParent:null}function E(e){for(var n=t(e),i=j(e);i&&O(i)&&"static"===m(i).position;)i=j(i);return i&&("html"===l(i)||"body"===l(i)&&"static"===m(i).position)?n:i||function(e){var t=/firefox/i.test(f());if(/Trident/i.test(f())&&r(e)&&"fixed"===m(e).position)return null;var n=b(e);for(o(n)&&(n=n.host);r(n)&&["html","body"].indexOf(l(n))<0;){var i=m(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||n}var D="top",A="bottom",L="right",P="left",M="auto",k=[D,A,L,P],W="start",B="end",H="viewport",T="popper",R=k.reduce((function(e,t){return e.concat([t+"-"+W,t+"-"+B])}),[]),S=[].concat(k,[M]).reduce((function(e,t){return e.concat([t,t+"-"+W,t+"-"+B])}),[]),V=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function q(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}function C(e){return e.split("-")[0]}function N(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&o(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function I(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function _(e,r,o){return r===H?I(function(e,n){var r=t(e),o=d(e),i=r.visualViewport,a=o.clientWidth,s=o.clientHeight,f=0,p=0;if(i){a=i.width,s=i.height;var u=c();(u||!u&&"fixed"===n)&&(f=i.offsetLeft,p=i.offsetTop)}return{width:a,height:s,x:f+h(e),y:p}}(e,o)):n(r)?function(e,t){var n=p(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(r,o):I(function(e){var t,n=d(e),r=u(e),o=null==(t=e.ownerDocument)?void 0:t.body,a=i(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=i(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),f=-r.scrollLeft+h(e),c=-r.scrollTop;return"rtl"===m(o||n).direction&&(f+=i(n.clientWidth,o?o.clientWidth:0)-a),{width:a,height:s,x:f,y:c}}(d(e)))}function F(e,t,o,s){var f="clippingParents"===t?function(e){var t=w(b(e)),o=["absolute","fixed"].indexOf(m(e).position)>=0&&r(e)?E(e):e;return n(o)?t.filter((function(e){return n(e)&&N(e,o)&&"body"!==l(e)})):[]}(e):[].concat(t),c=[].concat(f,[o]),p=c[0],u=c.reduce((function(t,n){var r=_(e,n,s);return t.top=i(r.top,t.top),t.right=a(r.right,t.right),t.bottom=a(r.bottom,t.bottom),t.left=i(r.left,t.left),t}),_(e,p,s));return u.width=u.right-u.left,u.height=u.bottom-u.top,u.x=u.left,u.y=u.top,u}function U(e){return e.split("-")[1]}function z(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function X(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?C(o):null,a=o?U(o):null,s=n.x+n.width/2-r.width/2,f=n.y+n.height/2-r.height/2;switch(i){case D:t={x:s,y:n.y-r.height};break;case A:t={x:s,y:n.y+n.height};break;case L:t={x:n.x+n.width,y:f};break;case P:t={x:n.x-r.width,y:f};break;default:t={x:n.x,y:n.y}}var c=i?z(i):null;if(null!=c){var p="y"===c?"height":"width";switch(a){case W:t[c]=t[c]-(n[p]/2-r[p]/2);break;case B:t[c]=t[c]+(n[p]/2-r[p]/2)}}return t}function Y(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function G(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function J(e,t){void 0===t&&(t={});var r=t,o=r.placement,i=void 0===o?e.placement:o,a=r.strategy,s=void 0===a?e.strategy:a,f=r.boundary,c=void 0===f?"clippingParents":f,u=r.rootBoundary,l=void 0===u?H:u,h=r.elementContext,m=void 0===h?T:h,v=r.altBoundary,y=void 0!==v&&v,g=r.padding,b=void 0===g?0:g,x=Y("number"!=typeof b?b:G(b,k)),w=m===T?"reference":T,O=e.rects.popper,j=e.elements[y?w:m],E=F(n(j)?j:j.contextElement||d(e.elements.popper),c,l,s),P=p(e.elements.reference),M=X({reference:P,element:O,strategy:"absolute",placement:i}),W=I(Object.assign({},O,M)),B=m===T?W:P,R={top:E.top-B.top+x.top,bottom:B.bottom-E.bottom+x.bottom,left:E.left-B.left+x.left,right:B.right-E.right+x.right},S=e.modifiersData.offset;if(m===T&&S){var V=S[i];Object.keys(R).forEach((function(e){var t=[L,A].indexOf(e)>=0?1:-1,n=[D,A].indexOf(e)>=0?"y":"x";R[e]+=V[n]*t}))}return R}var K={placement:"bottom",modifiers:[],strategy:"absolute"};function Q(){for(var e=arguments.length,t=new Array(e),n=0;n=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*o,[P,L].indexOf(r)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],f=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=f,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=a}},se={left:"right",right:"left",bottom:"top",top:"bottom"};function fe(e){return e.replace(/left|right|bottom|top/g,(function(e){return se[e]}))}var ce={start:"end",end:"start"};function pe(e){return e.replace(/start|end/g,(function(e){return ce[e]}))}function ue(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,f=n.allowedAutoPlacements,c=void 0===f?S:f,p=U(r),u=p?s?R:R.filter((function(e){return U(e)===p})):k,l=u.filter((function(e){return c.indexOf(e)>=0}));0===l.length&&(l=u);var d=l.reduce((function(t,n){return t[n]=J(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[C(n)],t}),{});return Object.keys(d).sort((function(e,t){return d[e]-d[t]}))}var le={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0===a||a,f=n.fallbackPlacements,c=n.padding,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.flipVariations,h=void 0===d||d,m=n.allowedAutoPlacements,v=t.options.placement,y=C(v),g=f||(y===v||!h?[fe(v)]:function(e){if(C(e)===M)return[];var t=fe(e);return[pe(e),t,pe(t)]}(v)),b=[v].concat(g).reduce((function(e,n){return e.concat(C(n)===M?ue(t,{placement:n,boundary:p,rootBoundary:u,padding:c,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),x=t.rects.reference,w=t.rects.popper,O=new Map,j=!0,E=b[0],k=0;k=0,S=R?"width":"height",V=J(t,{placement:B,boundary:p,rootBoundary:u,altBoundary:l,padding:c}),q=R?T?L:P:T?A:D;x[S]>w[S]&&(q=fe(q));var N=fe(q),I=[];if(i&&I.push(V[H]<=0),s&&I.push(V[q]<=0,V[N]<=0),I.every((function(e){return e}))){E=B,j=!1;break}O.set(B,I)}if(j)for(var _=function(e){var t=b.find((function(t){var n=O.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},F=h?3:1;F>0;F--){if("break"===_(F))break}t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function de(e,t,n){return i(e,a(t,n))}var he={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=void 0===o||o,f=n.altAxis,c=void 0!==f&&f,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,h=n.tether,m=void 0===h||h,v=n.tetherOffset,y=void 0===v?0:v,b=J(t,{boundary:p,rootBoundary:u,padding:d,altBoundary:l}),x=C(t.placement),w=U(t.placement),O=!w,j=z(x),M="x"===j?"y":"x",k=t.modifiersData.popperOffsets,B=t.rects.reference,H=t.rects.popper,T="function"==typeof y?y(Object.assign({},t.rects,{placement:t.placement})):y,R="number"==typeof T?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),S=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,V={x:0,y:0};if(k){if(s){var q,N="y"===j?D:P,I="y"===j?A:L,_="y"===j?"height":"width",F=k[j],X=F+b[N],Y=F-b[I],G=m?-H[_]/2:0,K=w===W?B[_]:H[_],Q=w===W?-H[_]:-B[_],Z=t.elements.arrow,$=m&&Z?g(Z):{width:0,height:0},ee=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},te=ee[N],ne=ee[I],re=de(0,B[_],$[_]),oe=O?B[_]/2-G-re-te-R.mainAxis:K-re-te-R.mainAxis,ie=O?-B[_]/2+G+re+ne+R.mainAxis:Q+re+ne+R.mainAxis,ae=t.elements.arrow&&E(t.elements.arrow),se=ae?"y"===j?ae.clientTop||0:ae.clientLeft||0:0,fe=null!=(q=null==S?void 0:S[j])?q:0,ce=F+ie-fe,pe=de(m?a(X,F+oe-fe-se):X,F,m?i(Y,ce):Y);k[j]=pe,V[j]=pe-F}if(c){var ue,le="x"===j?D:P,he="x"===j?A:L,me=k[M],ve="y"===M?"height":"width",ye=me+b[le],ge=me-b[he],be=-1!==[D,P].indexOf(x),xe=null!=(ue=null==S?void 0:S[M])?ue:0,we=be?ye:me-B[ve]-H[ve]-xe+R.altAxis,Oe=be?me+B[ve]+H[ve]-xe-R.altAxis:ge,je=m&&be?function(e,t,n){var r=de(e,t,n);return r>n?n:r}(we,me,Oe):de(m?we:ye,me,m?Oe:ge);k[M]=je,V[M]=je-me}t.modifiersData[r]=V}},requiresIfExists:["offset"]};var me={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=C(n.placement),f=z(s),c=[P,L].indexOf(s)>=0?"height":"width";if(i&&a){var p=function(e,t){return Y("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:G(e,k))}(o.padding,n),u=g(i),l="y"===f?D:P,d="y"===f?A:L,h=n.rects.reference[c]+n.rects.reference[f]-a[f]-n.rects.popper[c],m=a[f]-n.rects.reference[f],v=E(i),y=v?"y"===f?v.clientHeight||0:v.clientWidth||0:0,b=h/2-m/2,x=p[l],w=y-u[c]-p[d],O=y/2-u[c]/2+b,j=de(x,O,w),M=f;n.modifiersData[r]=((t={})[M]=j,t.centerOffset=j-O,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&N(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ve(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function ye(e){return[D,L,A,P].some((function(t){return e[t]>=0}))}var ge={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=J(t,{elementContext:"reference"}),s=J(t,{altBoundary:!0}),f=ve(a,r),c=ve(s,o,i),p=ye(f),u=ye(c);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:u},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":u})}},be=Z({defaultModifiers:[ee,te,oe,ie]}),xe=[ee,te,oe,ie,ae,le,he,me,ge],we=Z({defaultModifiers:xe});e.applyStyles=ie,e.arrow=me,e.computeStyles=oe,e.createPopper=we,e.createPopperLite=be,e.defaultModifiers=xe,e.detectOverflow=J,e.eventListeners=ee,e.flip=le,e.hide=ge,e.offset=ae,e.popperGenerator=Z,e.popperOffsets=te,e.preventOverflow=he,Object.defineProperty(e,"__esModule",{value:!0})})); + diff --git a/blog/docs/site_libs/quarto-html/quarto-syntax-highlighting.css b/blog/docs/site_libs/quarto-html/quarto-syntax-highlighting.css new file mode 100644 index 0000000..b30ce57 --- /dev/null +++ b/blog/docs/site_libs/quarto-html/quarto-syntax-highlighting.css @@ -0,0 +1,205 @@ +/* quarto syntax highlight colors */ +:root { + --quarto-hl-ot-color: #003B4F; + --quarto-hl-at-color: #657422; + --quarto-hl-ss-color: #20794D; + --quarto-hl-an-color: #5E5E5E; + --quarto-hl-fu-color: #4758AB; + --quarto-hl-st-color: #20794D; + --quarto-hl-cf-color: #003B4F; + --quarto-hl-op-color: #5E5E5E; + --quarto-hl-er-color: #AD0000; + --quarto-hl-bn-color: #AD0000; + --quarto-hl-al-color: #AD0000; + --quarto-hl-va-color: #111111; + --quarto-hl-bu-color: inherit; + --quarto-hl-ex-color: inherit; + --quarto-hl-pp-color: #AD0000; + --quarto-hl-in-color: #5E5E5E; + --quarto-hl-vs-color: #20794D; + --quarto-hl-wa-color: #5E5E5E; + --quarto-hl-do-color: #5E5E5E; + --quarto-hl-im-color: #00769E; + --quarto-hl-ch-color: #20794D; + --quarto-hl-dt-color: #AD0000; + --quarto-hl-fl-color: #AD0000; + --quarto-hl-co-color: #5E5E5E; + --quarto-hl-cv-color: #5E5E5E; + --quarto-hl-cn-color: #8f5902; + --quarto-hl-sc-color: #5E5E5E; + --quarto-hl-dv-color: #AD0000; + --quarto-hl-kw-color: #003B4F; +} + +/* other quarto variables */ +:root { + --quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +pre > code.sourceCode > span { + color: #003B4F; +} + +code span { + color: #003B4F; +} + +code.sourceCode > span { + color: #003B4F; +} + +div.sourceCode, +div.sourceCode pre.sourceCode { + color: #003B4F; +} + +code span.ot { + color: #003B4F; + font-style: inherit; +} + +code span.at { + color: #657422; + font-style: inherit; +} + +code span.ss { + color: #20794D; + font-style: inherit; +} + +code span.an { + color: #5E5E5E; + font-style: inherit; +} + +code span.fu { + color: #4758AB; + font-style: inherit; +} + +code span.st { + color: #20794D; + font-style: inherit; +} + +code span.cf { + color: #003B4F; + font-weight: bold; + font-style: inherit; +} + +code span.op { + color: #5E5E5E; + font-style: inherit; +} + +code span.er { + color: #AD0000; + font-style: inherit; +} + +code span.bn { + color: #AD0000; + font-style: inherit; +} + +code span.al { + color: #AD0000; + font-style: inherit; +} + +code span.va { + color: #111111; + font-style: inherit; +} + +code span.bu { + font-style: inherit; +} + +code span.ex { + font-style: inherit; +} + +code span.pp { + color: #AD0000; + font-style: inherit; +} + +code span.in { + color: #5E5E5E; + font-style: inherit; +} + +code span.vs { + color: #20794D; + font-style: inherit; +} + +code span.wa { + color: #5E5E5E; + font-style: italic; +} + +code span.do { + color: #5E5E5E; + font-style: italic; +} + +code span.im { + color: #00769E; + font-style: inherit; +} + +code span.ch { + color: #20794D; + font-style: inherit; +} + +code span.dt { + color: #AD0000; + font-style: inherit; +} + +code span.fl { + color: #AD0000; + font-style: inherit; +} + +code span.co { + color: #5E5E5E; + font-style: inherit; +} + +code span.cv { + color: #5E5E5E; + font-style: italic; +} + +code span.cn { + color: #8f5902; + font-style: inherit; +} + +code span.sc { + color: #5E5E5E; + font-style: inherit; +} + +code span.dv { + color: #AD0000; + font-style: inherit; +} + +code span.kw { + color: #003B4F; + font-weight: bold; + font-style: inherit; +} + +.prevent-inlining { + content: " { + // Find any conflicting margin elements and add margins to the + // top to prevent overlap + const marginChildren = window.document.querySelectorAll( + ".column-margin.column-container > *, .margin-caption, .aside" + ); + + let lastBottom = 0; + for (const marginChild of marginChildren) { + if (marginChild.offsetParent !== null) { + // clear the top margin so we recompute it + marginChild.style.marginTop = null; + const top = marginChild.getBoundingClientRect().top + window.scrollY; + if (top < lastBottom) { + const marginChildStyle = window.getComputedStyle(marginChild); + const marginBottom = parseFloat(marginChildStyle["marginBottom"]); + const margin = lastBottom - top + marginBottom; + marginChild.style.marginTop = `${margin}px`; + } + const styles = window.getComputedStyle(marginChild); + const marginTop = parseFloat(styles["marginTop"]); + lastBottom = top + marginChild.getBoundingClientRect().height + marginTop; + } + } +}; + +window.document.addEventListener("DOMContentLoaded", function (_event) { + // Recompute the position of margin elements anytime the body size changes + if (window.ResizeObserver) { + const resizeObserver = new window.ResizeObserver( + throttle(() => { + layoutMarginEls(); + if ( + window.document.body.getBoundingClientRect().width < 990 && + isReaderMode() + ) { + quartoToggleReader(); + } + }, 50) + ); + resizeObserver.observe(window.document.body); + } + + const tocEl = window.document.querySelector('nav.toc-active[role="doc-toc"]'); + const sidebarEl = window.document.getElementById("quarto-sidebar"); + const leftTocEl = window.document.getElementById("quarto-sidebar-toc-left"); + const marginSidebarEl = window.document.getElementById( + "quarto-margin-sidebar" + ); + // function to determine whether the element has a previous sibling that is active + const prevSiblingIsActiveLink = (el) => { + const sibling = el.previousElementSibling; + if (sibling && sibling.tagName === "A") { + return sibling.classList.contains("active"); + } else { + return false; + } + }; + + // fire slideEnter for bootstrap tab activations (for htmlwidget resize behavior) + function fireSlideEnter(e) { + const event = window.document.createEvent("Event"); + event.initEvent("slideenter", true, true); + window.document.dispatchEvent(event); + } + const tabs = window.document.querySelectorAll('a[data-bs-toggle="tab"]'); + tabs.forEach((tab) => { + tab.addEventListener("shown.bs.tab", fireSlideEnter); + }); + + // fire slideEnter for tabby tab activations (for htmlwidget resize behavior) + document.addEventListener("tabby", fireSlideEnter, false); + + // Track scrolling and mark TOC links as active + // get table of contents and sidebar (bail if we don't have at least one) + const tocLinks = tocEl + ? [...tocEl.querySelectorAll("a[data-scroll-target]")] + : []; + const makeActive = (link) => tocLinks[link].classList.add("active"); + const removeActive = (link) => tocLinks[link].classList.remove("active"); + const removeAllActive = () => + [...Array(tocLinks.length).keys()].forEach((link) => removeActive(link)); + + // activate the anchor for a section associated with this TOC entry + tocLinks.forEach((link) => { + link.addEventListener("click", () => { + if (link.href.indexOf("#") !== -1) { + const anchor = link.href.split("#")[1]; + const heading = window.document.querySelector( + `[data-anchor-id="${anchor}"]` + ); + if (heading) { + // Add the class + heading.classList.add("reveal-anchorjs-link"); + + // function to show the anchor + const handleMouseout = () => { + heading.classList.remove("reveal-anchorjs-link"); + heading.removeEventListener("mouseout", handleMouseout); + }; + + // add a function to clear the anchor when the user mouses out of it + heading.addEventListener("mouseout", handleMouseout); + } + } + }); + }); + + const sections = tocLinks.map((link) => { + const target = link.getAttribute("data-scroll-target"); + if (target.startsWith("#")) { + return window.document.getElementById(decodeURI(`${target.slice(1)}`)); + } else { + return window.document.querySelector(decodeURI(`${target}`)); + } + }); + + const sectionMargin = 200; + let currentActive = 0; + // track whether we've initialized state the first time + let init = false; + + const updateActiveLink = () => { + // The index from bottom to top (e.g. reversed list) + let sectionIndex = -1; + if ( + window.innerHeight + window.pageYOffset >= + window.document.body.offsetHeight + ) { + // This is the no-scroll case where last section should be the active one + sectionIndex = 0; + } else { + // This finds the last section visible on screen that should be made active + sectionIndex = [...sections].reverse().findIndex((section) => { + if (section) { + return window.pageYOffset >= section.offsetTop - sectionMargin; + } else { + return false; + } + }); + } + if (sectionIndex > -1) { + const current = sections.length - sectionIndex - 1; + if (current !== currentActive) { + removeAllActive(); + currentActive = current; + makeActive(current); + if (init) { + window.dispatchEvent(sectionChanged); + } + init = true; + } + } + }; + + const inHiddenRegion = (top, bottom, hiddenRegions) => { + for (const region of hiddenRegions) { + if (top <= region.bottom && bottom >= region.top) { + return true; + } + } + return false; + }; + + const categorySelector = "header.quarto-title-block .quarto-category"; + const activateCategories = (href) => { + // Find any categories + // Surround them with a link pointing back to: + // #category=Authoring + try { + const categoryEls = window.document.querySelectorAll(categorySelector); + for (const categoryEl of categoryEls) { + const categoryText = categoryEl.textContent; + if (categoryText) { + const link = `${href}#category=${encodeURIComponent(categoryText)}`; + const linkEl = window.document.createElement("a"); + linkEl.setAttribute("href", link); + for (const child of categoryEl.childNodes) { + linkEl.append(child); + } + categoryEl.appendChild(linkEl); + } + } + } catch { + // Ignore errors + } + }; + function hasTitleCategories() { + return window.document.querySelector(categorySelector) !== null; + } + + function offsetRelativeUrl(url) { + const offset = getMeta("quarto:offset"); + return offset ? offset + url : url; + } + + function offsetAbsoluteUrl(url) { + const offset = getMeta("quarto:offset"); + const baseUrl = new URL(offset, window.location); + + const projRelativeUrl = url.replace(baseUrl, ""); + if (projRelativeUrl.startsWith("/")) { + return projRelativeUrl; + } else { + return "/" + projRelativeUrl; + } + } + + // read a meta tag value + function getMeta(metaName) { + const metas = window.document.getElementsByTagName("meta"); + for (let i = 0; i < metas.length; i++) { + if (metas[i].getAttribute("name") === metaName) { + return metas[i].getAttribute("content"); + } + } + return ""; + } + + async function findAndActivateCategories() { + const currentPagePath = offsetAbsoluteUrl(window.location.href); + const response = await fetch(offsetRelativeUrl("listings.json")); + if (response.status == 200) { + return response.json().then(function (listingPaths) { + const listingHrefs = []; + for (const listingPath of listingPaths) { + const pathWithoutLeadingSlash = listingPath.listing.substring(1); + for (const item of listingPath.items) { + if ( + item === currentPagePath || + item === currentPagePath + "index.html" + ) { + // Resolve this path against the offset to be sure + // we already are using the correct path to the listing + // (this adjusts the listing urls to be rooted against + // whatever root the page is actually running against) + const relative = offsetRelativeUrl(pathWithoutLeadingSlash); + const baseUrl = window.location; + const resolvedPath = new URL(relative, baseUrl); + listingHrefs.push(resolvedPath.pathname); + break; + } + } + } + + // Look up the tree for a nearby linting and use that if we find one + const nearestListing = findNearestParentListing( + offsetAbsoluteUrl(window.location.pathname), + listingHrefs + ); + if (nearestListing) { + activateCategories(nearestListing); + } else { + // See if the referrer is a listing page for this item + const referredRelativePath = offsetAbsoluteUrl(document.referrer); + const referrerListing = listingHrefs.find((listingHref) => { + const isListingReferrer = + listingHref === referredRelativePath || + listingHref === referredRelativePath + "index.html"; + return isListingReferrer; + }); + + if (referrerListing) { + // Try to use the referrer if possible + activateCategories(referrerListing); + } else if (listingHrefs.length > 0) { + // Otherwise, just fall back to the first listing + activateCategories(listingHrefs[0]); + } + } + }); + } + } + if (hasTitleCategories()) { + findAndActivateCategories(); + } + + const findNearestParentListing = (href, listingHrefs) => { + if (!href || !listingHrefs) { + return undefined; + } + // Look up the tree for a nearby linting and use that if we find one + const relativeParts = href.substring(1).split("/"); + while (relativeParts.length > 0) { + const path = relativeParts.join("/"); + for (const listingHref of listingHrefs) { + if (listingHref.startsWith(path)) { + return listingHref; + } + } + relativeParts.pop(); + } + + return undefined; + }; + + const manageSidebarVisiblity = (el, placeholderDescriptor) => { + let isVisible = true; + let elRect; + + return (hiddenRegions) => { + if (el === null) { + return; + } + + // Find the last element of the TOC + const lastChildEl = el.lastElementChild; + + if (lastChildEl) { + // Converts the sidebar to a menu + const convertToMenu = () => { + for (const child of el.children) { + child.style.opacity = 0; + child.style.overflow = "hidden"; + child.style.pointerEvents = "none"; + } + + nexttick(() => { + const toggleContainer = window.document.createElement("div"); + toggleContainer.style.width = "100%"; + toggleContainer.classList.add("zindex-over-content"); + toggleContainer.classList.add("quarto-sidebar-toggle"); + toggleContainer.classList.add("headroom-target"); // Marks this to be managed by headeroom + toggleContainer.id = placeholderDescriptor.id; + toggleContainer.style.position = "fixed"; + + const toggleIcon = window.document.createElement("i"); + toggleIcon.classList.add("quarto-sidebar-toggle-icon"); + toggleIcon.classList.add("bi"); + toggleIcon.classList.add("bi-caret-down-fill"); + + const toggleTitle = window.document.createElement("div"); + const titleEl = window.document.body.querySelector( + placeholderDescriptor.titleSelector + ); + if (titleEl) { + toggleTitle.append( + titleEl.textContent || titleEl.innerText, + toggleIcon + ); + } + toggleTitle.classList.add("zindex-over-content"); + toggleTitle.classList.add("quarto-sidebar-toggle-title"); + toggleContainer.append(toggleTitle); + + const toggleContents = window.document.createElement("div"); + toggleContents.classList = el.classList; + toggleContents.classList.add("zindex-over-content"); + toggleContents.classList.add("quarto-sidebar-toggle-contents"); + for (const child of el.children) { + if (child.id === "toc-title") { + continue; + } + + const clone = child.cloneNode(true); + clone.style.opacity = 1; + clone.style.pointerEvents = null; + clone.style.display = null; + toggleContents.append(clone); + } + toggleContents.style.height = "0px"; + const positionToggle = () => { + // position the element (top left of parent, same width as parent) + if (!elRect) { + elRect = el.getBoundingClientRect(); + } + toggleContainer.style.left = `${elRect.left}px`; + toggleContainer.style.top = `${elRect.top}px`; + toggleContainer.style.width = `${elRect.width}px`; + }; + positionToggle(); + + toggleContainer.append(toggleContents); + el.parentElement.prepend(toggleContainer); + + // Process clicks + let tocShowing = false; + // Allow the caller to control whether this is dismissed + // when it is clicked (e.g. sidebar navigation supports + // opening and closing the nav tree, so don't dismiss on click) + const clickEl = placeholderDescriptor.dismissOnClick + ? toggleContainer + : toggleTitle; + + const closeToggle = () => { + if (tocShowing) { + toggleContainer.classList.remove("expanded"); + toggleContents.style.height = "0px"; + tocShowing = false; + } + }; + + // Get rid of any expanded toggle if the user scrolls + window.document.addEventListener( + "scroll", + throttle(() => { + closeToggle(); + }, 50) + ); + + // Handle positioning of the toggle + window.addEventListener( + "resize", + throttle(() => { + elRect = undefined; + positionToggle(); + }, 50) + ); + + window.addEventListener("quarto-hrChanged", () => { + elRect = undefined; + }); + + // Process the click + clickEl.onclick = () => { + if (!tocShowing) { + toggleContainer.classList.add("expanded"); + toggleContents.style.height = null; + tocShowing = true; + } else { + closeToggle(); + } + }; + }); + }; + + // Converts a sidebar from a menu back to a sidebar + const convertToSidebar = () => { + for (const child of el.children) { + child.style.opacity = 1; + child.style.overflow = null; + child.style.pointerEvents = null; + } + + const placeholderEl = window.document.getElementById( + placeholderDescriptor.id + ); + if (placeholderEl) { + placeholderEl.remove(); + } + + el.classList.remove("rollup"); + }; + + if (isReaderMode()) { + convertToMenu(); + isVisible = false; + } else { + // Find the top and bottom o the element that is being managed + const elTop = el.offsetTop; + const elBottom = + elTop + lastChildEl.offsetTop + lastChildEl.offsetHeight; + + if (!isVisible) { + // If the element is current not visible reveal if there are + // no conflicts with overlay regions + if (!inHiddenRegion(elTop, elBottom, hiddenRegions)) { + convertToSidebar(); + isVisible = true; + } + } else { + // If the element is visible, hide it if it conflicts with overlay regions + // and insert a placeholder toggle (or if we're in reader mode) + if (inHiddenRegion(elTop, elBottom, hiddenRegions)) { + convertToMenu(); + isVisible = false; + } + } + } + } + }; + }; + + const tabEls = document.querySelectorAll('a[data-bs-toggle="tab"]'); + for (const tabEl of tabEls) { + const id = tabEl.getAttribute("data-bs-target"); + if (id) { + const columnEl = document.querySelector( + `${id} .column-margin, .tabset-margin-content` + ); + if (columnEl) + tabEl.addEventListener("shown.bs.tab", function (event) { + const el = event.srcElement; + if (el) { + const visibleCls = `${el.id}-margin-content`; + // walk up until we find a parent tabset + let panelTabsetEl = el.parentElement; + while (panelTabsetEl) { + if (panelTabsetEl.classList.contains("panel-tabset")) { + break; + } + panelTabsetEl = panelTabsetEl.parentElement; + } + + if (panelTabsetEl) { + const prevSib = panelTabsetEl.previousElementSibling; + if ( + prevSib && + prevSib.classList.contains("tabset-margin-container") + ) { + const childNodes = prevSib.querySelectorAll( + ".tabset-margin-content" + ); + for (const childEl of childNodes) { + if (childEl.classList.contains(visibleCls)) { + childEl.classList.remove("collapse"); + } else { + childEl.classList.add("collapse"); + } + } + } + } + } + + layoutMarginEls(); + }); + } + } + + // Manage the visibility of the toc and the sidebar + const marginScrollVisibility = manageSidebarVisiblity(marginSidebarEl, { + id: "quarto-toc-toggle", + titleSelector: "#toc-title", + dismissOnClick: true, + }); + const sidebarScrollVisiblity = manageSidebarVisiblity(sidebarEl, { + id: "quarto-sidebarnav-toggle", + titleSelector: ".title", + dismissOnClick: false, + }); + let tocLeftScrollVisibility; + if (leftTocEl) { + tocLeftScrollVisibility = manageSidebarVisiblity(leftTocEl, { + id: "quarto-lefttoc-toggle", + titleSelector: "#toc-title", + dismissOnClick: true, + }); + } + + // Find the first element that uses formatting in special columns + const conflictingEls = window.document.body.querySelectorAll( + '[class^="column-"], [class*=" column-"], aside, [class*="margin-caption"], [class*=" margin-caption"], [class*="margin-ref"], [class*=" margin-ref"]' + ); + + // Filter all the possibly conflicting elements into ones + // the do conflict on the left or ride side + const arrConflictingEls = Array.from(conflictingEls); + const leftSideConflictEls = arrConflictingEls.filter((el) => { + if (el.tagName === "ASIDE") { + return false; + } + return Array.from(el.classList).find((className) => { + return ( + className !== "column-body" && + className.startsWith("column-") && + !className.endsWith("right") && + !className.endsWith("container") && + className !== "column-margin" + ); + }); + }); + const rightSideConflictEls = arrConflictingEls.filter((el) => { + if (el.tagName === "ASIDE") { + return true; + } + + const hasMarginCaption = Array.from(el.classList).find((className) => { + return className == "margin-caption"; + }); + if (hasMarginCaption) { + return true; + } + + return Array.from(el.classList).find((className) => { + return ( + className !== "column-body" && + !className.endsWith("container") && + className.startsWith("column-") && + !className.endsWith("left") + ); + }); + }); + + const kOverlapPaddingSize = 10; + function toRegions(els) { + return els.map((el) => { + const boundRect = el.getBoundingClientRect(); + const top = + boundRect.top + + document.documentElement.scrollTop - + kOverlapPaddingSize; + return { + top, + bottom: top + el.scrollHeight + 2 * kOverlapPaddingSize, + }; + }); + } + + let hasObserved = false; + const visibleItemObserver = (els) => { + let visibleElements = [...els]; + const intersectionObserver = new IntersectionObserver( + (entries, _observer) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + if (visibleElements.indexOf(entry.target) === -1) { + visibleElements.push(entry.target); + } + } else { + visibleElements = visibleElements.filter((visibleEntry) => { + return visibleEntry !== entry; + }); + } + }); + + if (!hasObserved) { + hideOverlappedSidebars(); + } + hasObserved = true; + }, + {} + ); + els.forEach((el) => { + intersectionObserver.observe(el); + }); + + return { + getVisibleEntries: () => { + return visibleElements; + }, + }; + }; + + const rightElementObserver = visibleItemObserver(rightSideConflictEls); + const leftElementObserver = visibleItemObserver(leftSideConflictEls); + + const hideOverlappedSidebars = () => { + marginScrollVisibility(toRegions(rightElementObserver.getVisibleEntries())); + sidebarScrollVisiblity(toRegions(leftElementObserver.getVisibleEntries())); + if (tocLeftScrollVisibility) { + tocLeftScrollVisibility( + toRegions(leftElementObserver.getVisibleEntries()) + ); + } + }; + + window.quartoToggleReader = () => { + // Applies a slow class (or removes it) + // to update the transition speed + const slowTransition = (slow) => { + const manageTransition = (id, slow) => { + const el = document.getElementById(id); + if (el) { + if (slow) { + el.classList.add("slow"); + } else { + el.classList.remove("slow"); + } + } + }; + + manageTransition("TOC", slow); + manageTransition("quarto-sidebar", slow); + }; + const readerMode = !isReaderMode(); + setReaderModeValue(readerMode); + + // If we're entering reader mode, slow the transition + if (readerMode) { + slowTransition(readerMode); + } + highlightReaderToggle(readerMode); + hideOverlappedSidebars(); + + // If we're exiting reader mode, restore the non-slow transition + if (!readerMode) { + slowTransition(!readerMode); + } + }; + + const highlightReaderToggle = (readerMode) => { + const els = document.querySelectorAll(".quarto-reader-toggle"); + if (els) { + els.forEach((el) => { + if (readerMode) { + el.classList.add("reader"); + } else { + el.classList.remove("reader"); + } + }); + } + }; + + const setReaderModeValue = (val) => { + if (window.location.protocol !== "file:") { + window.localStorage.setItem("quarto-reader-mode", val); + } else { + localReaderMode = val; + } + }; + + const isReaderMode = () => { + if (window.location.protocol !== "file:") { + return window.localStorage.getItem("quarto-reader-mode") === "true"; + } else { + return localReaderMode; + } + }; + let localReaderMode = null; + + const tocOpenDepthStr = tocEl?.getAttribute("data-toc-expanded"); + const tocOpenDepth = tocOpenDepthStr ? Number(tocOpenDepthStr) : 1; + + // Walk the TOC and collapse/expand nodes + // Nodes are expanded if: + // - they are top level + // - they have children that are 'active' links + // - they are directly below an link that is 'active' + const walk = (el, depth) => { + // Tick depth when we enter a UL + if (el.tagName === "UL") { + depth = depth + 1; + } + + // It this is active link + let isActiveNode = false; + if (el.tagName === "A" && el.classList.contains("active")) { + isActiveNode = true; + } + + // See if there is an active child to this element + let hasActiveChild = false; + for (child of el.children) { + hasActiveChild = walk(child, depth) || hasActiveChild; + } + + // Process the collapse state if this is an UL + if (el.tagName === "UL") { + if (tocOpenDepth === -1 && depth > 1) { + // toc-expand: false + el.classList.add("collapse"); + } else if ( + depth <= tocOpenDepth || + hasActiveChild || + prevSiblingIsActiveLink(el) + ) { + el.classList.remove("collapse"); + } else { + el.classList.add("collapse"); + } + + // untick depth when we leave a UL + depth = depth - 1; + } + return hasActiveChild || isActiveNode; + }; + + // walk the TOC and expand / collapse any items that should be shown + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + + // Throttle the scroll event and walk peridiocally + window.document.addEventListener( + "scroll", + throttle(() => { + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + if (!isReaderMode()) { + hideOverlappedSidebars(); + } + }, 5) + ); + window.addEventListener( + "resize", + throttle(() => { + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + if (!isReaderMode()) { + hideOverlappedSidebars(); + } + }, 10) + ); + hideOverlappedSidebars(); + highlightReaderToggle(isReaderMode()); +}); + +// grouped tabsets +window.addEventListener("pageshow", (_event) => { + function getTabSettings() { + const data = localStorage.getItem("quarto-persistent-tabsets-data"); + if (!data) { + localStorage.setItem("quarto-persistent-tabsets-data", "{}"); + return {}; + } + if (data) { + return JSON.parse(data); + } + } + + function setTabSettings(data) { + localStorage.setItem( + "quarto-persistent-tabsets-data", + JSON.stringify(data) + ); + } + + function setTabState(groupName, groupValue) { + const data = getTabSettings(); + data[groupName] = groupValue; + setTabSettings(data); + } + + function toggleTab(tab, active) { + const tabPanelId = tab.getAttribute("aria-controls"); + const tabPanel = document.getElementById(tabPanelId); + if (active) { + tab.classList.add("active"); + tabPanel.classList.add("active"); + } else { + tab.classList.remove("active"); + tabPanel.classList.remove("active"); + } + } + + function toggleAll(selectedGroup, selectorsToSync) { + for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) { + const active = selectedGroup === thisGroup; + for (const tab of tabs) { + toggleTab(tab, active); + } + } + } + + function findSelectorsToSyncByLanguage() { + const result = {}; + const tabs = Array.from( + document.querySelectorAll(`div[data-group] a[id^='tabset-']`) + ); + for (const item of tabs) { + const div = item.parentElement.parentElement.parentElement; + const group = div.getAttribute("data-group"); + if (!result[group]) { + result[group] = {}; + } + const selectorsToSync = result[group]; + const value = item.innerHTML; + if (!selectorsToSync[value]) { + selectorsToSync[value] = []; + } + selectorsToSync[value].push(item); + } + return result; + } + + function setupSelectorSync() { + const selectorsToSync = findSelectorsToSyncByLanguage(); + Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => { + Object.entries(tabSetsByValue).forEach(([value, items]) => { + items.forEach((item) => { + item.addEventListener("click", (_event) => { + setTabState(group, value); + toggleAll(value, selectorsToSync[group]); + }); + }); + }); + }); + return selectorsToSync; + } + + const selectorsToSync = setupSelectorSync(); + for (const [group, selectedName] of Object.entries(getTabSettings())) { + const selectors = selectorsToSync[group]; + // it's possible that stale state gives us empty selections, so we explicitly check here. + if (selectors) { + toggleAll(selectedName, selectors); + } + } +}); + +function throttle(func, wait) { + let waiting = false; + return function () { + if (!waiting) { + func.apply(this, arguments); + waiting = true; + setTimeout(function () { + waiting = false; + }, wait); + } + }; +} + +function nexttick(func) { + return setTimeout(func, 0); +} diff --git a/blog/docs/site_libs/quarto-html/tippy.css b/blog/docs/site_libs/quarto-html/tippy.css new file mode 100644 index 0000000..e6ae635 --- /dev/null +++ b/blog/docs/site_libs/quarto-html/tippy.css @@ -0,0 +1 @@ +.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1} \ No newline at end of file diff --git a/blog/docs/site_libs/quarto-html/tippy.umd.min.js b/blog/docs/site_libs/quarto-html/tippy.umd.min.js new file mode 100644 index 0000000..ca292be --- /dev/null +++ b/blog/docs/site_libs/quarto-html/tippy.umd.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],t):(e=e||self).tippy=t(e.Popper)}(this,(function(e){"use strict";var t={passive:!0,capture:!0},n=function(){return document.body};function r(e,t,n){if(Array.isArray(e)){var r=e[t];return null==r?Array.isArray(n)?n[t]:n:r}return e}function o(e,t){var n={}.toString.call(e);return 0===n.indexOf("[object")&&n.indexOf(t+"]")>-1}function i(e,t){return"function"==typeof e?e.apply(void 0,t):e}function a(e,t){return 0===t?e:function(r){clearTimeout(n),n=setTimeout((function(){e(r)}),t)};var n}function s(e,t){var n=Object.assign({},e);return t.forEach((function(e){delete n[e]})),n}function u(e){return[].concat(e)}function c(e,t){-1===e.indexOf(t)&&e.push(t)}function p(e){return e.split("-")[0]}function f(e){return[].slice.call(e)}function l(e){return Object.keys(e).reduce((function(t,n){return void 0!==e[n]&&(t[n]=e[n]),t}),{})}function d(){return document.createElement("div")}function v(e){return["Element","Fragment"].some((function(t){return o(e,t)}))}function m(e){return o(e,"MouseEvent")}function g(e){return!(!e||!e._tippy||e._tippy.reference!==e)}function h(e){return v(e)?[e]:function(e){return o(e,"NodeList")}(e)?f(e):Array.isArray(e)?e:f(document.querySelectorAll(e))}function b(e,t){e.forEach((function(e){e&&(e.style.transitionDuration=t+"ms")}))}function y(e,t){e.forEach((function(e){e&&e.setAttribute("data-state",t)}))}function w(e){var t,n=u(e)[0];return null!=n&&null!=(t=n.ownerDocument)&&t.body?n.ownerDocument:document}function E(e,t,n){var r=t+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(t){e[r](t,n)}))}function O(e,t){for(var n=t;n;){var r;if(e.contains(n))return!0;n=null==n.getRootNode||null==(r=n.getRootNode())?void 0:r.host}return!1}var x={isTouch:!1},C=0;function T(){x.isTouch||(x.isTouch=!0,window.performance&&document.addEventListener("mousemove",A))}function A(){var e=performance.now();e-C<20&&(x.isTouch=!1,document.removeEventListener("mousemove",A)),C=e}function L(){var e=document.activeElement;if(g(e)){var t=e._tippy;e.blur&&!t.state.isVisible&&e.blur()}}var D=!!("undefined"!=typeof window&&"undefined"!=typeof document)&&!!window.msCrypto,R=Object.assign({appendTo:n,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(R);function P(e){var t=(e.plugins||[]).reduce((function(t,n){var r,o=n.name,i=n.defaultValue;o&&(t[o]=void 0!==e[o]?e[o]:null!=(r=R[o])?r:i);return t}),{});return Object.assign({},e,t)}function j(e,t){var n=Object.assign({},t,{content:i(t.content,[e])},t.ignoreAttributes?{}:function(e,t){return(t?Object.keys(P(Object.assign({},R,{plugins:t}))):k).reduce((function(t,n){var r=(e.getAttribute("data-tippy-"+n)||"").trim();if(!r)return t;if("content"===n)t[n]=r;else try{t[n]=JSON.parse(r)}catch(e){t[n]=r}return t}),{})}(e,t.plugins));return n.aria=Object.assign({},R.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?t.interactive:n.aria.expanded,content:"auto"===n.aria.content?t.interactive?null:"describedby":n.aria.content},n}function M(e,t){e.innerHTML=t}function V(e){var t=d();return!0===e?t.className="tippy-arrow":(t.className="tippy-svg-arrow",v(e)?t.appendChild(e):M(t,e)),t}function I(e,t){v(t.content)?(M(e,""),e.appendChild(t.content)):"function"!=typeof t.content&&(t.allowHTML?M(e,t.content):e.textContent=t.content)}function S(e){var t=e.firstElementChild,n=f(t.children);return{box:t,content:n.find((function(e){return e.classList.contains("tippy-content")})),arrow:n.find((function(e){return e.classList.contains("tippy-arrow")||e.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(e){return e.classList.contains("tippy-backdrop")}))}}function N(e){var t=d(),n=d();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=d();function o(n,r){var o=S(t),i=o.box,a=o.content,s=o.arrow;r.theme?i.setAttribute("data-theme",r.theme):i.removeAttribute("data-theme"),"string"==typeof r.animation?i.setAttribute("data-animation",r.animation):i.removeAttribute("data-animation"),r.inertia?i.setAttribute("data-inertia",""):i.removeAttribute("data-inertia"),i.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?i.setAttribute("role",r.role):i.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||I(a,e.props),r.arrow?s?n.arrow!==r.arrow&&(i.removeChild(s),i.appendChild(V(r.arrow))):i.appendChild(V(r.arrow)):s&&i.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),I(r,e.props),t.appendChild(n),n.appendChild(r),o(e.props,e.props),{popper:t,onUpdate:o}}N.$$tippy=!0;var B=1,H=[],U=[];function _(o,s){var v,g,h,C,T,A,L,k,M=j(o,Object.assign({},R,P(l(s)))),V=!1,I=!1,N=!1,_=!1,F=[],W=a(we,M.interactiveDebounce),X=B++,Y=(k=M.plugins).filter((function(e,t){return k.indexOf(e)===t})),$={id:X,reference:o,popper:d(),popperInstance:null,props:M,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:Y,clearDelayTimeouts:function(){clearTimeout(v),clearTimeout(g),cancelAnimationFrame(h)},setProps:function(e){if($.state.isDestroyed)return;ae("onBeforeUpdate",[$,e]),be();var t=$.props,n=j(o,Object.assign({},t,l(e),{ignoreAttributes:!0}));$.props=n,he(),t.interactiveDebounce!==n.interactiveDebounce&&(ce(),W=a(we,n.interactiveDebounce));t.triggerTarget&&!n.triggerTarget?u(t.triggerTarget).forEach((function(e){e.removeAttribute("aria-expanded")})):n.triggerTarget&&o.removeAttribute("aria-expanded");ue(),ie(),J&&J(t,n);$.popperInstance&&(Ce(),Ae().forEach((function(e){requestAnimationFrame(e._tippy.popperInstance.forceUpdate)})));ae("onAfterUpdate",[$,e])},setContent:function(e){$.setProps({content:e})},show:function(){var e=$.state.isVisible,t=$.state.isDestroyed,o=!$.state.isEnabled,a=x.isTouch&&!$.props.touch,s=r($.props.duration,0,R.duration);if(e||t||o||a)return;if(te().hasAttribute("disabled"))return;if(ae("onShow",[$],!1),!1===$.props.onShow($))return;$.state.isVisible=!0,ee()&&(z.style.visibility="visible");ie(),de(),$.state.isMounted||(z.style.transition="none");if(ee()){var u=re(),p=u.box,f=u.content;b([p,f],0)}A=function(){var e;if($.state.isVisible&&!_){if(_=!0,z.offsetHeight,z.style.transition=$.props.moveTransition,ee()&&$.props.animation){var t=re(),n=t.box,r=t.content;b([n,r],s),y([n,r],"visible")}se(),ue(),c(U,$),null==(e=$.popperInstance)||e.forceUpdate(),ae("onMount",[$]),$.props.animation&&ee()&&function(e,t){me(e,t)}(s,(function(){$.state.isShown=!0,ae("onShown",[$])}))}},function(){var e,t=$.props.appendTo,r=te();e=$.props.interactive&&t===n||"parent"===t?r.parentNode:i(t,[r]);e.contains(z)||e.appendChild(z);$.state.isMounted=!0,Ce()}()},hide:function(){var e=!$.state.isVisible,t=$.state.isDestroyed,n=!$.state.isEnabled,o=r($.props.duration,1,R.duration);if(e||t||n)return;if(ae("onHide",[$],!1),!1===$.props.onHide($))return;$.state.isVisible=!1,$.state.isShown=!1,_=!1,V=!1,ee()&&(z.style.visibility="hidden");if(ce(),ve(),ie(!0),ee()){var i=re(),a=i.box,s=i.content;$.props.animation&&(b([a,s],o),y([a,s],"hidden"))}se(),ue(),$.props.animation?ee()&&function(e,t){me(e,(function(){!$.state.isVisible&&z.parentNode&&z.parentNode.contains(z)&&t()}))}(o,$.unmount):$.unmount()},hideWithInteractivity:function(e){ne().addEventListener("mousemove",W),c(H,W),W(e)},enable:function(){$.state.isEnabled=!0},disable:function(){$.hide(),$.state.isEnabled=!1},unmount:function(){$.state.isVisible&&$.hide();if(!$.state.isMounted)return;Te(),Ae().forEach((function(e){e._tippy.unmount()})),z.parentNode&&z.parentNode.removeChild(z);U=U.filter((function(e){return e!==$})),$.state.isMounted=!1,ae("onHidden",[$])},destroy:function(){if($.state.isDestroyed)return;$.clearDelayTimeouts(),$.unmount(),be(),delete o._tippy,$.state.isDestroyed=!0,ae("onDestroy",[$])}};if(!M.render)return $;var q=M.render($),z=q.popper,J=q.onUpdate;z.setAttribute("data-tippy-root",""),z.id="tippy-"+$.id,$.popper=z,o._tippy=$,z._tippy=$;var G=Y.map((function(e){return e.fn($)})),K=o.hasAttribute("aria-expanded");return he(),ue(),ie(),ae("onCreate",[$]),M.showOnCreate&&Le(),z.addEventListener("mouseenter",(function(){$.props.interactive&&$.state.isVisible&&$.clearDelayTimeouts()})),z.addEventListener("mouseleave",(function(){$.props.interactive&&$.props.trigger.indexOf("mouseenter")>=0&&ne().addEventListener("mousemove",W)})),$;function Q(){var e=$.props.touch;return Array.isArray(e)?e:[e,0]}function Z(){return"hold"===Q()[0]}function ee(){var e;return!(null==(e=$.props.render)||!e.$$tippy)}function te(){return L||o}function ne(){var e=te().parentNode;return e?w(e):document}function re(){return S(z)}function oe(e){return $.state.isMounted&&!$.state.isVisible||x.isTouch||C&&"focus"===C.type?0:r($.props.delay,e?0:1,R.delay)}function ie(e){void 0===e&&(e=!1),z.style.pointerEvents=$.props.interactive&&!e?"":"none",z.style.zIndex=""+$.props.zIndex}function ae(e,t,n){var r;(void 0===n&&(n=!0),G.forEach((function(n){n[e]&&n[e].apply(n,t)})),n)&&(r=$.props)[e].apply(r,t)}function se(){var e=$.props.aria;if(e.content){var t="aria-"+e.content,n=z.id;u($.props.triggerTarget||o).forEach((function(e){var r=e.getAttribute(t);if($.state.isVisible)e.setAttribute(t,r?r+" "+n:n);else{var o=r&&r.replace(n,"").trim();o?e.setAttribute(t,o):e.removeAttribute(t)}}))}}function ue(){!K&&$.props.aria.expanded&&u($.props.triggerTarget||o).forEach((function(e){$.props.interactive?e.setAttribute("aria-expanded",$.state.isVisible&&e===te()?"true":"false"):e.removeAttribute("aria-expanded")}))}function ce(){ne().removeEventListener("mousemove",W),H=H.filter((function(e){return e!==W}))}function pe(e){if(!x.isTouch||!N&&"mousedown"!==e.type){var t=e.composedPath&&e.composedPath()[0]||e.target;if(!$.props.interactive||!O(z,t)){if(u($.props.triggerTarget||o).some((function(e){return O(e,t)}))){if(x.isTouch)return;if($.state.isVisible&&$.props.trigger.indexOf("click")>=0)return}else ae("onClickOutside",[$,e]);!0===$.props.hideOnClick&&($.clearDelayTimeouts(),$.hide(),I=!0,setTimeout((function(){I=!1})),$.state.isMounted||ve())}}}function fe(){N=!0}function le(){N=!1}function de(){var e=ne();e.addEventListener("mousedown",pe,!0),e.addEventListener("touchend",pe,t),e.addEventListener("touchstart",le,t),e.addEventListener("touchmove",fe,t)}function ve(){var e=ne();e.removeEventListener("mousedown",pe,!0),e.removeEventListener("touchend",pe,t),e.removeEventListener("touchstart",le,t),e.removeEventListener("touchmove",fe,t)}function me(e,t){var n=re().box;function r(e){e.target===n&&(E(n,"remove",r),t())}if(0===e)return t();E(n,"remove",T),E(n,"add",r),T=r}function ge(e,t,n){void 0===n&&(n=!1),u($.props.triggerTarget||o).forEach((function(r){r.addEventListener(e,t,n),F.push({node:r,eventType:e,handler:t,options:n})}))}function he(){var e;Z()&&(ge("touchstart",ye,{passive:!0}),ge("touchend",Ee,{passive:!0})),(e=$.props.trigger,e.split(/\s+/).filter(Boolean)).forEach((function(e){if("manual"!==e)switch(ge(e,ye),e){case"mouseenter":ge("mouseleave",Ee);break;case"focus":ge(D?"focusout":"blur",Oe);break;case"focusin":ge("focusout",Oe)}}))}function be(){F.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),F=[]}function ye(e){var t,n=!1;if($.state.isEnabled&&!xe(e)&&!I){var r="focus"===(null==(t=C)?void 0:t.type);C=e,L=e.currentTarget,ue(),!$.state.isVisible&&m(e)&&H.forEach((function(t){return t(e)})),"click"===e.type&&($.props.trigger.indexOf("mouseenter")<0||V)&&!1!==$.props.hideOnClick&&$.state.isVisible?n=!0:Le(e),"click"===e.type&&(V=!n),n&&!r&&De(e)}}function we(e){var t=e.target,n=te().contains(t)||z.contains(t);"mousemove"===e.type&&n||function(e,t){var n=t.clientX,r=t.clientY;return e.every((function(e){var t=e.popperRect,o=e.popperState,i=e.props.interactiveBorder,a=p(o.placement),s=o.modifiersData.offset;if(!s)return!0;var u="bottom"===a?s.top.y:0,c="top"===a?s.bottom.y:0,f="right"===a?s.left.x:0,l="left"===a?s.right.x:0,d=t.top-r+u>i,v=r-t.bottom-c>i,m=t.left-n+f>i,g=n-t.right-l>i;return d||v||m||g}))}(Ae().concat(z).map((function(e){var t,n=null==(t=e._tippy.popperInstance)?void 0:t.state;return n?{popperRect:e.getBoundingClientRect(),popperState:n,props:M}:null})).filter(Boolean),e)&&(ce(),De(e))}function Ee(e){xe(e)||$.props.trigger.indexOf("click")>=0&&V||($.props.interactive?$.hideWithInteractivity(e):De(e))}function Oe(e){$.props.trigger.indexOf("focusin")<0&&e.target!==te()||$.props.interactive&&e.relatedTarget&&z.contains(e.relatedTarget)||De(e)}function xe(e){return!!x.isTouch&&Z()!==e.type.indexOf("touch")>=0}function Ce(){Te();var t=$.props,n=t.popperOptions,r=t.placement,i=t.offset,a=t.getReferenceClientRect,s=t.moveTransition,u=ee()?S(z).arrow:null,c=a?{getBoundingClientRect:a,contextElement:a.contextElement||te()}:o,p=[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var t=e.state;if(ee()){var n=re().box;["placement","reference-hidden","escaped"].forEach((function(e){"placement"===e?n.setAttribute("data-placement",t.placement):t.attributes.popper["data-popper-"+e]?n.setAttribute("data-"+e,""):n.removeAttribute("data-"+e)})),t.attributes.popper={}}}}];ee()&&u&&p.push({name:"arrow",options:{element:u,padding:3}}),p.push.apply(p,(null==n?void 0:n.modifiers)||[]),$.popperInstance=e.createPopper(c,z,Object.assign({},n,{placement:r,onFirstUpdate:A,modifiers:p}))}function Te(){$.popperInstance&&($.popperInstance.destroy(),$.popperInstance=null)}function Ae(){return f(z.querySelectorAll("[data-tippy-root]"))}function Le(e){$.clearDelayTimeouts(),e&&ae("onTrigger",[$,e]),de();var t=oe(!0),n=Q(),r=n[0],o=n[1];x.isTouch&&"hold"===r&&o&&(t=o),t?v=setTimeout((function(){$.show()}),t):$.show()}function De(e){if($.clearDelayTimeouts(),ae("onUntrigger",[$,e]),$.state.isVisible){if(!($.props.trigger.indexOf("mouseenter")>=0&&$.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(e.type)>=0&&V)){var t=oe(!1);t?g=setTimeout((function(){$.state.isVisible&&$.hide()}),t):h=requestAnimationFrame((function(){$.hide()}))}}else ve()}}function F(e,n){void 0===n&&(n={});var r=R.plugins.concat(n.plugins||[]);document.addEventListener("touchstart",T,t),window.addEventListener("blur",L);var o=Object.assign({},n,{plugins:r}),i=h(e).reduce((function(e,t){var n=t&&_(t,o);return n&&e.push(n),e}),[]);return v(e)?i[0]:i}F.defaultProps=R,F.setDefaultProps=function(e){Object.keys(e).forEach((function(t){R[t]=e[t]}))},F.currentInput=x;var W=Object.assign({},e.applyStyles,{effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow)}}),X={mouseover:"mouseenter",focusin:"focus",click:"click"};var Y={name:"animateFill",defaultValue:!1,fn:function(e){var t;if(null==(t=e.props.render)||!t.$$tippy)return{};var n=S(e.popper),r=n.box,o=n.content,i=e.props.animateFill?function(){var e=d();return e.className="tippy-backdrop",y([e],"hidden"),e}():null;return{onCreate:function(){i&&(r.insertBefore(i,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",e.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(i){var e=r.style.transitionDuration,t=Number(e.replace("ms",""));o.style.transitionDelay=Math.round(t/10)+"ms",i.style.transitionDuration=e,y([i],"visible")}},onShow:function(){i&&(i.style.transitionDuration="0ms")},onHide:function(){i&&y([i],"hidden")}}}};var $={clientX:0,clientY:0},q=[];function z(e){var t=e.clientX,n=e.clientY;$={clientX:t,clientY:n}}var J={name:"followCursor",defaultValue:!1,fn:function(e){var t=e.reference,n=w(e.props.triggerTarget||t),r=!1,o=!1,i=!0,a=e.props;function s(){return"initial"===e.props.followCursor&&e.state.isVisible}function u(){n.addEventListener("mousemove",f)}function c(){n.removeEventListener("mousemove",f)}function p(){r=!0,e.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||t.contains(n.target),o=e.props.followCursor,i=n.clientX,a=n.clientY,s=t.getBoundingClientRect(),u=i-s.left,c=a-s.top;!r&&e.props.interactive||e.setProps({getReferenceClientRect:function(){var e=t.getBoundingClientRect(),n=i,r=a;"initial"===o&&(n=e.left+u,r=e.top+c);var s="horizontal"===o?e.top:r,p="vertical"===o?e.right:n,f="horizontal"===o?e.bottom:r,l="vertical"===o?e.left:n;return{width:p-l,height:f-s,top:s,right:p,bottom:f,left:l}}})}function l(){e.props.followCursor&&(q.push({instance:e,doc:n}),function(e){e.addEventListener("mousemove",z)}(n))}function d(){0===(q=q.filter((function(t){return t.instance!==e}))).filter((function(e){return e.doc===n})).length&&function(e){e.removeEventListener("mousemove",z)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=e.props},onAfterUpdate:function(t,n){var i=n.followCursor;r||void 0!==i&&a.followCursor!==i&&(d(),i?(l(),!e.state.isMounted||o||s()||u()):(c(),p()))},onMount:function(){e.props.followCursor&&!o&&(i&&(f($),i=!1),s()||u())},onTrigger:function(e,t){m(t)&&($={clientX:t.clientX,clientY:t.clientY}),o="focus"===t.type},onHidden:function(){e.props.followCursor&&(p(),c(),i=!0)}}}};var G={name:"inlinePositioning",defaultValue:!1,fn:function(e){var t,n=e.reference;var r=-1,o=!1,i=[],a={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(o){var a=o.state;e.props.inlinePositioning&&(-1!==i.indexOf(a.placement)&&(i=[]),t!==a.placement&&-1===i.indexOf(a.placement)&&(i.push(a.placement),e.setProps({getReferenceClientRect:function(){return function(e){return function(e,t,n,r){if(n.length<2||null===e)return t;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||t;switch(e){case"top":case"bottom":var o=n[0],i=n[n.length-1],a="top"===e,s=o.top,u=i.bottom,c=a?o.left:i.left,p=a?o.right:i.right;return{top:s,bottom:u,left:c,right:p,width:p-c,height:u-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(e){return e.left}))),l=Math.max.apply(Math,n.map((function(e){return e.right}))),d=n.filter((function(t){return"left"===e?t.left===f:t.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return t}}(p(e),n.getBoundingClientRect(),f(n.getClientRects()),r)}(a.placement)}})),t=a.placement)}};function s(){var t;o||(t=function(e,t){var n;return{popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat(((null==(n=e.popperOptions)?void 0:n.modifiers)||[]).filter((function(e){return e.name!==t.name})),[t])})}}(e.props,a),o=!0,e.setProps(t),o=!1)}return{onCreate:s,onAfterUpdate:s,onTrigger:function(t,n){if(m(n)){var o=f(e.reference.getClientRects()),i=o.find((function(e){return e.left-2<=n.clientX&&e.right+2>=n.clientX&&e.top-2<=n.clientY&&e.bottom+2>=n.clientY})),a=o.indexOf(i);r=a>-1?a:r}},onHidden:function(){r=-1}}}};var K={name:"sticky",defaultValue:!1,fn:function(e){var t=e.reference,n=e.popper;function r(t){return!0===e.props.sticky||e.props.sticky===t}var o=null,i=null;function a(){var s=r("reference")?(e.popperInstance?e.popperInstance.state.elements.reference:t).getBoundingClientRect():null,u=r("popper")?n.getBoundingClientRect():null;(s&&Q(o,s)||u&&Q(i,u))&&e.popperInstance&&e.popperInstance.update(),o=s,i=u,e.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){e.props.sticky&&a()}}}};function Q(e,t){return!e||!t||(e.top!==t.top||e.right!==t.right||e.bottom!==t.bottom||e.left!==t.left)}return F.setDefaultProps({plugins:[Y,J,G,K],render:N}),F.createSingleton=function(e,t){var n;void 0===t&&(t={});var r,o=e,i=[],a=[],c=t.overrides,p=[],f=!1;function l(){a=o.map((function(e){return u(e.props.triggerTarget||e.reference)})).reduce((function(e,t){return e.concat(t)}),[])}function v(){i=o.map((function(e){return e.reference}))}function m(e){o.forEach((function(t){e?t.enable():t.disable()}))}function g(e){return o.map((function(t){var n=t.setProps;return t.setProps=function(o){n(o),t.reference===r&&e.setProps(o)},function(){t.setProps=n}}))}function h(e,t){var n=a.indexOf(t);if(t!==r){r=t;var s=(c||[]).concat("content").reduce((function(e,t){return e[t]=o[n].props[t],e}),{});e.setProps(Object.assign({},s,{getReferenceClientRect:"function"==typeof s.getReferenceClientRect?s.getReferenceClientRect:function(){var e;return null==(e=i[n])?void 0:e.getBoundingClientRect()}}))}}m(!1),v(),l();var b={fn:function(){return{onDestroy:function(){m(!0)},onHidden:function(){r=null},onClickOutside:function(e){e.props.showOnCreate&&!f&&(f=!0,r=null)},onShow:function(e){e.props.showOnCreate&&!f&&(f=!0,h(e,i[0]))},onTrigger:function(e,t){h(e,t.currentTarget)}}}},y=F(d(),Object.assign({},s(t,["overrides"]),{plugins:[b].concat(t.plugins||[]),triggerTarget:a,popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat((null==(n=t.popperOptions)?void 0:n.modifiers)||[],[W])})})),w=y.show;y.show=function(e){if(w(),!r&&null==e)return h(y,i[0]);if(!r||null!=e){if("number"==typeof e)return i[e]&&h(y,i[e]);if(o.indexOf(e)>=0){var t=e.reference;return h(y,t)}return i.indexOf(e)>=0?h(y,e):void 0}},y.showNext=function(){var e=i[0];if(!r)return y.show(0);var t=i.indexOf(r);y.show(i[t+1]||e)},y.showPrevious=function(){var e=i[i.length-1];if(!r)return y.show(e);var t=i.indexOf(r),n=i[t-1]||e;y.show(n)};var E=y.setProps;return y.setProps=function(e){c=e.overrides||c,E(e)},y.setInstances=function(e){m(!0),p.forEach((function(e){return e()})),o=e,m(!1),v(),l(),p=g(y),y.setProps({triggerTarget:a})},p=g(y),y},F.delegate=function(e,n){var r=[],o=[],i=!1,a=n.target,c=s(n,["target"]),p=Object.assign({},c,{trigger:"manual",touch:!1}),f=Object.assign({touch:R.touch},c,{showOnCreate:!0}),l=F(e,p);function d(e){if(e.target&&!i){var t=e.target.closest(a);if(t){var r=t.getAttribute("data-tippy-trigger")||n.trigger||R.trigger;if(!t._tippy&&!("touchstart"===e.type&&"boolean"==typeof f.touch||"touchstart"!==e.type&&r.indexOf(X[e.type])<0)){var s=F(t,f);s&&(o=o.concat(s))}}}}function v(e,t,n,o){void 0===o&&(o=!1),e.addEventListener(t,n,o),r.push({node:e,eventType:t,handler:n,options:o})}return u(l).forEach((function(e){var n=e.destroy,a=e.enable,s=e.disable;e.destroy=function(e){void 0===e&&(e=!0),e&&o.forEach((function(e){e.destroy()})),o=[],r.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),r=[],n()},e.enable=function(){a(),o.forEach((function(e){return e.enable()})),i=!1},e.disable=function(){s(),o.forEach((function(e){return e.disable()})),i=!0},function(e){var n=e.reference;v(n,"touchstart",d,t),v(n,"mouseover",d),v(n,"focusin",d),v(n,"click",d)}(e)})),l},F.hideAll=function(e){var t=void 0===e?{}:e,n=t.exclude,r=t.duration;U.forEach((function(e){var t=!1;if(n&&(t=g(n)?e.reference===n:e.popper===n.popper),!t){var o=e.props.duration;e.setProps({duration:r}),e.hide(),e.state.isDestroyed||e.setProps({duration:o})}}))},F.roundArrow='',F})); + diff --git a/blog/docs/site_libs/quarto-listing/list.min.js b/blog/docs/site_libs/quarto-listing/list.min.js new file mode 100644 index 0000000..511346f --- /dev/null +++ b/blog/docs/site_libs/quarto-listing/list.min.js @@ -0,0 +1,2 @@ +var List;List=function(){var t={"./src/add-async.js":function(t){t.exports=function(t){return function e(r,n,s){var i=r.splice(0,50);s=(s=s||[]).concat(t.add(i)),r.length>0?setTimeout((function(){e(r,n,s)}),1):(t.update(),n(s))}}},"./src/filter.js":function(t){t.exports=function(t){return t.handlers.filterStart=t.handlers.filterStart||[],t.handlers.filterComplete=t.handlers.filterComplete||[],function(e){if(t.trigger("filterStart"),t.i=1,t.reset.filter(),void 0===e)t.filtered=!1;else{t.filtered=!0;for(var r=t.items,n=0,s=r.length;nv.page,a=new g(t[s],void 0,n),v.items.push(a),r.push(a)}return v.update(),r}m(t.slice(0),e)}},this.show=function(t,e){return this.i=t,this.page=e,v.update(),v},this.remove=function(t,e,r){for(var n=0,s=0,i=v.items.length;s-1&&r.splice(n,1),v},this.trigger=function(t){for(var e=v.handlers[t].length;e--;)v.handlers[t][e](v);return v},this.reset={filter:function(){for(var t=v.items,e=t.length;e--;)t[e].filtered=!1;return v},search:function(){for(var t=v.items,e=t.length;e--;)t[e].found=!1;return v}},this.update=function(){var t=v.items,e=t.length;v.visibleItems=[],v.matchingItems=[],v.templater.clear();for(var r=0;r=v.i&&v.visibleItems.lengthe},innerWindow:function(t,e,r){return t>=e-r&&t<=e+r},dotted:function(t,e,r,n,s,i,a){return this.dottedLeft(t,e,r,n,s,i)||this.dottedRight(t,e,r,n,s,i,a)},dottedLeft:function(t,e,r,n,s,i){return e==r+1&&!this.innerWindow(e,s,i)&&!this.right(e,n)},dottedRight:function(t,e,r,n,s,i,a){return!t.items[a-1].values().dotted&&(e==n&&!this.innerWindow(e,s,i)&&!this.right(e,n))}};return function(e){var n=new i(t.listContainer.id,{listClass:e.paginationClass||"pagination",item:e.item||"
  • ",valueNames:["page","dotted"],searchClass:"pagination-search-that-is-not-supposed-to-exist",sortClass:"pagination-sort-that-is-not-supposed-to-exist"});s.bind(n.listContainer,"click",(function(e){var r=e.target||e.srcElement,n=t.utils.getAttribute(r,"data-page"),s=t.utils.getAttribute(r,"data-i");s&&t.show((s-1)*n+1,n)})),t.on("updated",(function(){r(n,e)})),r(n,e)}}},"./src/parse.js":function(t,e,r){t.exports=function(t){var e=r("./src/item.js")(t),n=function(r,n){for(var s=0,i=r.length;s0?setTimeout((function(){e(r,s)}),1):(t.update(),t.trigger("parseComplete"))};return t.handlers.parseComplete=t.handlers.parseComplete||[],function(){var e=function(t){for(var e=t.childNodes,r=[],n=0,s=e.length;n]/g.exec(t)){var e=document.createElement("tbody");return e.innerHTML=t,e.firstElementChild}if(-1!==t.indexOf("<")){var r=document.createElement("div");return r.innerHTML=t,r.firstElementChild}}},a=function(e,r,n){var s=void 0,i=function(e){for(var r=0,n=t.valueNames.length;r=1;)t.list.removeChild(t.list.firstChild)},function(){var r;if("function"!=typeof t.item){if(!(r="string"==typeof t.item?-1===t.item.indexOf("<")?document.getElementById(t.item):i(t.item):s()))throw new Error("The list needs to have at least one item on init otherwise you'll have to add a template.");r=n(r,t.valueNames),e=function(){return r.cloneNode(!0)}}else e=function(e){var r=t.item(e);return i(r)}}()};t.exports=function(t){return new e(t)}},"./src/utils/classes.js":function(t,e,r){var n=r("./src/utils/index-of.js"),s=/\s+/;Object.prototype.toString;function i(t){if(!t||!t.nodeType)throw new Error("A DOM element reference is required");this.el=t,this.list=t.classList}t.exports=function(t){return new i(t)},i.prototype.add=function(t){if(this.list)return this.list.add(t),this;var e=this.array();return~n(e,t)||e.push(t),this.el.className=e.join(" "),this},i.prototype.remove=function(t){if(this.list)return this.list.remove(t),this;var e=this.array(),r=n(e,t);return~r&&e.splice(r,1),this.el.className=e.join(" "),this},i.prototype.toggle=function(t,e){return this.list?(void 0!==e?e!==this.list.toggle(t,e)&&this.list.toggle(t):this.list.toggle(t),this):(void 0!==e?e?this.add(t):this.remove(t):this.has(t)?this.remove(t):this.add(t),this)},i.prototype.array=function(){var t=(this.el.getAttribute("class")||"").replace(/^\s+|\s+$/g,"").split(s);return""===t[0]&&t.shift(),t},i.prototype.has=i.prototype.contains=function(t){return this.list?this.list.contains(t):!!~n(this.array(),t)}},"./src/utils/events.js":function(t,e,r){var n=window.addEventListener?"addEventListener":"attachEvent",s=window.removeEventListener?"removeEventListener":"detachEvent",i="addEventListener"!==n?"on":"",a=r("./src/utils/to-array.js");e.bind=function(t,e,r,s){for(var o=0,l=(t=a(t)).length;o32)return!1;var a=n,o=function(){var t,r={};for(t=0;t=p;b--){var j=o[t.charAt(b-1)];if(C[b]=0===m?(C[b+1]<<1|1)&j:(C[b+1]<<1|1)&j|(v[b+1]|v[b])<<1|1|v[b+1],C[b]&d){var x=l(m,b-1);if(x<=u){if(u=x,!((c=b-1)>a))break;p=Math.max(1,2*a-c)}}}if(l(m+1,a)>u)break;v=C}return!(c<0)}},"./src/utils/get-attribute.js":function(t){t.exports=function(t,e){var r=t.getAttribute&&t.getAttribute(e)||null;if(!r)for(var n=t.attributes,s=n.length,i=0;i=48&&t<=57}function i(t,e){for(var i=(t+="").length,a=(e+="").length,o=0,l=0;o=i&&l=a?-1:l>=a&&o=i?1:i-a}i.caseInsensitive=i.i=function(t,e){return i((""+t).toLowerCase(),(""+e).toLowerCase())},Object.defineProperties(i,{alphabet:{get:function(){return e},set:function(t){r=[];var s=0;if(e=t)for(;s { + if (categoriesLoaded) { + activateCategory(category); + setCategoryHash(category); + } +}; + +window["quarto-listing-loaded"] = () => { + // Process any existing hash + const hash = getHash(); + + if (hash) { + // If there is a category, switch to that + if (hash.category) { + activateCategory(hash.category); + } + // Paginate a specific listing + const listingIds = Object.keys(window["quarto-listings"]); + for (const listingId of listingIds) { + const page = hash[getListingPageKey(listingId)]; + if (page) { + showPage(listingId, page); + } + } + } + + const listingIds = Object.keys(window["quarto-listings"]); + for (const listingId of listingIds) { + // The actual list + const list = window["quarto-listings"][listingId]; + + // Update the handlers for pagination events + refreshPaginationHandlers(listingId); + + // Render any visible items that need it + renderVisibleProgressiveImages(list); + + // Whenever the list is updated, we also need to + // attach handlers to the new pagination elements + // and refresh any newly visible items. + list.on("updated", function () { + renderVisibleProgressiveImages(list); + setTimeout(() => refreshPaginationHandlers(listingId)); + + // Show or hide the no matching message + toggleNoMatchingMessage(list); + }); + } +}; + +window.document.addEventListener("DOMContentLoaded", function (_event) { + // Attach click handlers to categories + const categoryEls = window.document.querySelectorAll( + ".quarto-listing-category .category" + ); + + for (const categoryEl of categoryEls) { + const category = categoryEl.getAttribute("data-category"); + categoryEl.onclick = () => { + activateCategory(category); + setCategoryHash(category); + }; + } + + // Attach a click handler to the category title + // (there should be only one, but since it is a class name, handle N) + const categoryTitleEls = window.document.querySelectorAll( + ".quarto-listing-category-title" + ); + for (const categoryTitleEl of categoryTitleEls) { + categoryTitleEl.onclick = () => { + activateCategory(""); + setCategoryHash(""); + }; + } + + categoriesLoaded = true; +}); + +function toggleNoMatchingMessage(list) { + const selector = `#${list.listContainer.id} .listing-no-matching`; + const noMatchingEl = window.document.querySelector(selector); + if (noMatchingEl) { + if (list.visibleItems.length === 0) { + noMatchingEl.classList.remove("d-none"); + } else { + if (!noMatchingEl.classList.contains("d-none")) { + noMatchingEl.classList.add("d-none"); + } + } + } +} + +function setCategoryHash(category) { + setHash({ category }); +} + +function setPageHash(listingId, page) { + const currentHash = getHash() || {}; + currentHash[getListingPageKey(listingId)] = page; + setHash(currentHash); +} + +function getListingPageKey(listingId) { + return `${listingId}-page`; +} + +function refreshPaginationHandlers(listingId) { + const listingEl = window.document.getElementById(listingId); + const paginationEls = listingEl.querySelectorAll( + ".pagination li.page-item:not(.disabled) .page.page-link" + ); + for (const paginationEl of paginationEls) { + paginationEl.onclick = (sender) => { + setPageHash(listingId, sender.target.getAttribute("data-i")); + showPage(listingId, sender.target.getAttribute("data-i")); + return false; + }; + } +} + +function renderVisibleProgressiveImages(list) { + // Run through the visible items and render any progressive images + for (const item of list.visibleItems) { + const itemEl = item.elm; + if (itemEl) { + const progressiveImgs = itemEl.querySelectorAll( + `img[${kProgressiveAttr}]` + ); + for (const progressiveImg of progressiveImgs) { + const srcValue = progressiveImg.getAttribute(kProgressiveAttr); + if (srcValue) { + progressiveImg.setAttribute("src", srcValue); + } + progressiveImg.removeAttribute(kProgressiveAttr); + } + } + } +} + +function getHash() { + // Hashes are of the form + // #name:value|name1:value1|name2:value2 + const currentUrl = new URL(window.location); + const hashRaw = currentUrl.hash ? currentUrl.hash.slice(1) : undefined; + return parseHash(hashRaw); +} + +const kAnd = "&"; +const kEquals = "="; + +function parseHash(hash) { + if (!hash) { + return undefined; + } + const hasValuesStrs = hash.split(kAnd); + const hashValues = hasValuesStrs + .map((hashValueStr) => { + const vals = hashValueStr.split(kEquals); + if (vals.length === 2) { + return { name: vals[0], value: vals[1] }; + } else { + return undefined; + } + }) + .filter((value) => { + return value !== undefined; + }); + + const hashObj = {}; + hashValues.forEach((hashValue) => { + hashObj[hashValue.name] = decodeURIComponent(hashValue.value); + }); + return hashObj; +} + +function makeHash(obj) { + return Object.keys(obj) + .map((key) => { + return `${key}${kEquals}${obj[key]}`; + }) + .join(kAnd); +} + +function setHash(obj) { + const hash = makeHash(obj); + window.history.pushState(null, null, `#${hash}`); +} + +function showPage(listingId, page) { + const list = window["quarto-listings"][listingId]; + if (list) { + list.show((page - 1) * list.page + 1, list.page); + } +} + +function activateCategory(category) { + // Deactivate existing categories + const activeEls = window.document.querySelectorAll( + ".quarto-listing-category .category.active" + ); + for (const activeEl of activeEls) { + activeEl.classList.remove("active"); + } + + // Activate this category + const categoryEl = window.document.querySelector( + `.quarto-listing-category .category[data-category='${category}'` + ); + if (categoryEl) { + categoryEl.classList.add("active"); + } + + // Filter the listings to this category + filterListingCategory(category); +} + +function filterListingCategory(category) { + const listingIds = Object.keys(window["quarto-listings"]); + for (const listingId of listingIds) { + const list = window["quarto-listings"][listingId]; + if (list) { + if (category === "") { + // resets the filter + list.filter(); + } else { + // filter to this category + list.filter(function (item) { + const itemValues = item.values(); + if (itemValues.categories !== null) { + const categories = itemValues.categories.split(","); + return categories.includes(category); + } else { + return false; + } + }); + } + } + } +} diff --git a/blog/docs/site_libs/quarto-nav/headroom.min.js b/blog/docs/site_libs/quarto-nav/headroom.min.js new file mode 100644 index 0000000..b08f1df --- /dev/null +++ b/blog/docs/site_libs/quarto-nav/headroom.min.js @@ -0,0 +1,7 @@ +/*! + * headroom.js v0.12.0 - Give your page some headroom. Hide your header until you need it + * Copyright (c) 2020 Nick Williams - http://wicky.nillia.ms/headroom.js + * License: MIT + */ + +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t=t||self).Headroom=n()}(this,function(){"use strict";function t(){return"undefined"!=typeof window}function d(t){return function(t){return t&&t.document&&function(t){return 9===t.nodeType}(t.document)}(t)?function(t){var n=t.document,o=n.body,s=n.documentElement;return{scrollHeight:function(){return Math.max(o.scrollHeight,s.scrollHeight,o.offsetHeight,s.offsetHeight,o.clientHeight,s.clientHeight)},height:function(){return t.innerHeight||s.clientHeight||o.clientHeight},scrollY:function(){return void 0!==t.pageYOffset?t.pageYOffset:(s||o.parentNode||o).scrollTop}}}(t):function(t){return{scrollHeight:function(){return Math.max(t.scrollHeight,t.offsetHeight,t.clientHeight)},height:function(){return Math.max(t.offsetHeight,t.clientHeight)},scrollY:function(){return t.scrollTop}}}(t)}function n(t,s,e){var n,o=function(){var n=!1;try{var t={get passive(){n=!0}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){n=!1}return n}(),i=!1,r=d(t),l=r.scrollY(),a={};function c(){var t=Math.round(r.scrollY()),n=r.height(),o=r.scrollHeight();a.scrollY=t,a.lastScrollY=l,a.direction=ls.tolerance[a.direction],e(a),l=t,i=!1}function h(){i||(i=!0,n=requestAnimationFrame(c))}var u=!!o&&{passive:!0,capture:!1};return t.addEventListener("scroll",h,u),c(),{destroy:function(){cancelAnimationFrame(n),t.removeEventListener("scroll",h,u)}}}function o(t){return t===Object(t)?t:{down:t,up:t}}function s(t,n){n=n||{},Object.assign(this,s.options,n),this.classes=Object.assign({},s.options.classes,n.classes),this.elem=t,this.tolerance=o(this.tolerance),this.offset=o(this.offset),this.initialised=!1,this.frozen=!1}return s.prototype={constructor:s,init:function(){return s.cutsTheMustard&&!this.initialised&&(this.addClass("initial"),this.initialised=!0,setTimeout(function(t){t.scrollTracker=n(t.scroller,{offset:t.offset,tolerance:t.tolerance},t.update.bind(t))},100,this)),this},destroy:function(){this.initialised=!1,Object.keys(this.classes).forEach(this.removeClass,this),this.scrollTracker.destroy()},unpin:function(){!this.hasClass("pinned")&&this.hasClass("unpinned")||(this.addClass("unpinned"),this.removeClass("pinned"),this.onUnpin&&this.onUnpin.call(this))},pin:function(){this.hasClass("unpinned")&&(this.addClass("pinned"),this.removeClass("unpinned"),this.onPin&&this.onPin.call(this))},freeze:function(){this.frozen=!0,this.addClass("frozen")},unfreeze:function(){this.frozen=!1,this.removeClass("frozen")},top:function(){this.hasClass("top")||(this.addClass("top"),this.removeClass("notTop"),this.onTop&&this.onTop.call(this))},notTop:function(){this.hasClass("notTop")||(this.addClass("notTop"),this.removeClass("top"),this.onNotTop&&this.onNotTop.call(this))},bottom:function(){this.hasClass("bottom")||(this.addClass("bottom"),this.removeClass("notBottom"),this.onBottom&&this.onBottom.call(this))},notBottom:function(){this.hasClass("notBottom")||(this.addClass("notBottom"),this.removeClass("bottom"),this.onNotBottom&&this.onNotBottom.call(this))},shouldUnpin:function(t){return"down"===t.direction&&!t.top&&t.toleranceExceeded},shouldPin:function(t){return"up"===t.direction&&t.toleranceExceeded||t.top},addClass:function(t){this.elem.classList.add.apply(this.elem.classList,this.classes[t].split(" "))},removeClass:function(t){this.elem.classList.remove.apply(this.elem.classList,this.classes[t].split(" "))},hasClass:function(t){return this.classes[t].split(" ").every(function(t){return this.classList.contains(t)},this.elem)},update:function(t){t.isOutOfBounds||!0!==this.frozen&&(t.top?this.top():this.notTop(),t.bottom?this.bottom():this.notBottom(),this.shouldUnpin(t)?this.unpin():this.shouldPin(t)&&this.pin())}},s.options={tolerance:{up:0,down:0},offset:0,scroller:t()?window:null,classes:{frozen:"headroom--frozen",pinned:"headroom--pinned",unpinned:"headroom--unpinned",top:"headroom--top",notTop:"headroom--not-top",bottom:"headroom--bottom",notBottom:"headroom--not-bottom",initial:"headroom"}},s.cutsTheMustard=!!(t()&&function(){}.bind&&"classList"in document.documentElement&&Object.assign&&Object.keys&&requestAnimationFrame),s}); diff --git a/blog/docs/site_libs/quarto-nav/quarto-nav.js b/blog/docs/site_libs/quarto-nav/quarto-nav.js new file mode 100644 index 0000000..38cc430 --- /dev/null +++ b/blog/docs/site_libs/quarto-nav/quarto-nav.js @@ -0,0 +1,325 @@ +const headroomChanged = new CustomEvent("quarto-hrChanged", { + detail: {}, + bubbles: true, + cancelable: false, + composed: false, +}); + +const announceDismiss = () => { + const annEl = window.document.getElementById("quarto-announcement"); + if (annEl) { + annEl.remove(); + + const annId = annEl.getAttribute("data-announcement-id"); + window.localStorage.setItem(`quarto-announce-${annId}`, "true"); + } +}; + +const announceRegister = () => { + const annEl = window.document.getElementById("quarto-announcement"); + if (annEl) { + const annId = annEl.getAttribute("data-announcement-id"); + const isDismissed = + window.localStorage.getItem(`quarto-announce-${annId}`) || false; + if (isDismissed) { + announceDismiss(); + return; + } else { + annEl.classList.remove("hidden"); + } + + const actionEl = annEl.querySelector(".quarto-announcement-action"); + if (actionEl) { + actionEl.addEventListener("click", function (e) { + e.preventDefault(); + // Hide the bar immediately + announceDismiss(); + }); + } + } +}; + +window.document.addEventListener("DOMContentLoaded", function () { + let init = false; + + announceRegister(); + + // Manage the back to top button, if one is present. + let lastScrollTop = window.pageYOffset || document.documentElement.scrollTop; + const scrollDownBuffer = 5; + const scrollUpBuffer = 35; + const btn = document.getElementById("quarto-back-to-top"); + const hideBackToTop = () => { + btn.style.display = "none"; + }; + const showBackToTop = () => { + btn.style.display = "inline-block"; + }; + if (btn) { + window.document.addEventListener( + "scroll", + function () { + const currentScrollTop = + window.pageYOffset || document.documentElement.scrollTop; + + // Shows and hides the button 'intelligently' as the user scrolls + if (currentScrollTop - scrollDownBuffer > lastScrollTop) { + hideBackToTop(); + lastScrollTop = currentScrollTop <= 0 ? 0 : currentScrollTop; + } else if (currentScrollTop < lastScrollTop - scrollUpBuffer) { + showBackToTop(); + lastScrollTop = currentScrollTop <= 0 ? 0 : currentScrollTop; + } + + // Show the button at the bottom, hides it at the top + if (currentScrollTop <= 0) { + hideBackToTop(); + } else if ( + window.innerHeight + currentScrollTop >= + document.body.offsetHeight + ) { + showBackToTop(); + } + }, + false + ); + } + + function throttle(func, wait) { + var timeout; + return function () { + const context = this; + const args = arguments; + const later = function () { + clearTimeout(timeout); + timeout = null; + func.apply(context, args); + }; + + if (!timeout) { + timeout = setTimeout(later, wait); + } + }; + } + + function headerOffset() { + // Set an offset if there is are fixed top navbar + const headerEl = window.document.querySelector("header.fixed-top"); + if (headerEl) { + return headerEl.clientHeight; + } else { + return 0; + } + } + + function footerOffset() { + const footerEl = window.document.querySelector("footer.footer"); + if (footerEl) { + return footerEl.clientHeight; + } else { + return 0; + } + } + + function dashboardOffset() { + const dashboardNavEl = window.document.getElementById( + "quarto-dashboard-header" + ); + if (dashboardNavEl !== null) { + return dashboardNavEl.clientHeight; + } else { + return 0; + } + } + + function updateDocumentOffsetWithoutAnimation() { + updateDocumentOffset(false); + } + + function updateDocumentOffset(animated) { + // set body offset + const topOffset = headerOffset(); + const bodyOffset = topOffset + footerOffset() + dashboardOffset(); + const bodyEl = window.document.body; + bodyEl.setAttribute("data-bs-offset", topOffset); + bodyEl.style.paddingTop = topOffset + "px"; + + // deal with sidebar offsets + const sidebars = window.document.querySelectorAll( + ".sidebar, .headroom-target" + ); + sidebars.forEach((sidebar) => { + if (!animated) { + sidebar.classList.add("notransition"); + // Remove the no transition class after the animation has time to complete + setTimeout(function () { + sidebar.classList.remove("notransition"); + }, 201); + } + + if (window.Headroom && sidebar.classList.contains("sidebar-unpinned")) { + sidebar.style.top = "0"; + sidebar.style.maxHeight = "100vh"; + } else { + sidebar.style.top = topOffset + "px"; + sidebar.style.maxHeight = "calc(100vh - " + topOffset + "px)"; + } + }); + + // allow space for footer + const mainContainer = window.document.querySelector(".quarto-container"); + if (mainContainer) { + mainContainer.style.minHeight = "calc(100vh - " + bodyOffset + "px)"; + } + + // link offset + let linkStyle = window.document.querySelector("#quarto-target-style"); + if (!linkStyle) { + linkStyle = window.document.createElement("style"); + linkStyle.setAttribute("id", "quarto-target-style"); + window.document.head.appendChild(linkStyle); + } + while (linkStyle.firstChild) { + linkStyle.removeChild(linkStyle.firstChild); + } + if (topOffset > 0) { + linkStyle.appendChild( + window.document.createTextNode(` + section:target::before { + content: ""; + display: block; + height: ${topOffset}px; + margin: -${topOffset}px 0 0; + }`) + ); + } + if (init) { + window.dispatchEvent(headroomChanged); + } + init = true; + } + + // initialize headroom + var header = window.document.querySelector("#quarto-header"); + if (header && window.Headroom) { + const headroom = new window.Headroom(header, { + tolerance: 5, + onPin: function () { + const sidebars = window.document.querySelectorAll( + ".sidebar, .headroom-target" + ); + sidebars.forEach((sidebar) => { + sidebar.classList.remove("sidebar-unpinned"); + }); + updateDocumentOffset(); + }, + onUnpin: function () { + const sidebars = window.document.querySelectorAll( + ".sidebar, .headroom-target" + ); + sidebars.forEach((sidebar) => { + sidebar.classList.add("sidebar-unpinned"); + }); + updateDocumentOffset(); + }, + }); + headroom.init(); + + let frozen = false; + window.quartoToggleHeadroom = function () { + if (frozen) { + headroom.unfreeze(); + frozen = false; + } else { + headroom.freeze(); + frozen = true; + } + }; + } + + window.addEventListener( + "hashchange", + function (e) { + if ( + getComputedStyle(document.documentElement).scrollBehavior !== "smooth" + ) { + window.scrollTo(0, window.pageYOffset - headerOffset()); + } + }, + false + ); + + // Observe size changed for the header + const headerEl = window.document.querySelector("header.fixed-top"); + if (headerEl && window.ResizeObserver) { + const observer = new window.ResizeObserver(() => { + setTimeout(updateDocumentOffsetWithoutAnimation, 0); + }); + observer.observe(headerEl, { + attributes: true, + childList: true, + characterData: true, + }); + } else { + window.addEventListener( + "resize", + throttle(updateDocumentOffsetWithoutAnimation, 50) + ); + } + setTimeout(updateDocumentOffsetWithoutAnimation, 250); + + // fixup index.html links if we aren't on the filesystem + if (window.location.protocol !== "file:") { + const links = window.document.querySelectorAll("a"); + for (let i = 0; i < links.length; i++) { + if (links[i].href) { + links[i].dataset.originalHref = links[i].href; + links[i].href = links[i].href.replace(/\/index\.html/, "/"); + } + } + + // Fixup any sharing links that require urls + // Append url to any sharing urls + const sharingLinks = window.document.querySelectorAll( + "a.sidebar-tools-main-item, a.quarto-navigation-tool, a.quarto-navbar-tools, a.quarto-navbar-tools-item" + ); + for (let i = 0; i < sharingLinks.length; i++) { + const sharingLink = sharingLinks[i]; + const href = sharingLink.getAttribute("href"); + if (href) { + sharingLink.setAttribute( + "href", + href.replace("|url|", window.location.href) + ); + } + } + + // Scroll the active navigation item into view, if necessary + const navSidebar = window.document.querySelector("nav#quarto-sidebar"); + if (navSidebar) { + // Find the active item + const activeItem = navSidebar.querySelector("li.sidebar-item a.active"); + if (activeItem) { + // Wait for the scroll height and height to resolve by observing size changes on the + // nav element that is scrollable + const resizeObserver = new ResizeObserver((_entries) => { + // The bottom of the element + const elBottom = activeItem.offsetTop; + const viewBottom = navSidebar.scrollTop + navSidebar.clientHeight; + + // The element height and scroll height are the same, then we are still loading + if (viewBottom !== navSidebar.scrollHeight) { + // Determine if the item isn't visible and scroll to it + if (elBottom >= viewBottom) { + navSidebar.scrollTop = elBottom; + } + + // stop observing now since we've completed the scroll + resizeObserver.unobserve(navSidebar); + } + }); + resizeObserver.observe(navSidebar); + } + } + } +}); diff --git a/blog/docs/site_libs/quarto-search/autocomplete.umd.js b/blog/docs/site_libs/quarto-search/autocomplete.umd.js new file mode 100644 index 0000000..ae0063a --- /dev/null +++ b/blog/docs/site_libs/quarto-search/autocomplete.umd.js @@ -0,0 +1,3 @@ +/*! @algolia/autocomplete-js 1.11.1 | MIT License | © Algolia, Inc. and contributors | https://github.com/algolia/autocomplete */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["@algolia/autocomplete-js"]={})}(this,(function(e){"use strict";function t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function n(e){for(var n=1;n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,u,a=[],l=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.call(n)).done)&&(a.push(r.value),a.length!==t);l=!0);}catch(e){c=!0,o=e}finally{try{if(!l&&null!=n.return&&(u=n.return(),Object(u)!==u))return}finally{if(c)throw o}}return a}}(e,t)||c(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(e){return function(e){if(Array.isArray(e))return s(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||c(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(e,t){if(e){if("string"==typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function x(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function N(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r=3||2===n&&r>=4||1===n&&r>=10);function i(t,n,r){if(o&&void 0!==r){var i=r[0].__autocomplete_algoliaCredentials,u={"X-Algolia-Application-Id":i.appId,"X-Algolia-API-Key":i.apiKey};e.apply(void 0,[t].concat(D(n),[{headers:u}]))}else e.apply(void 0,[t].concat(D(n)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("clickedObjectIDsAfterSearch",B(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("clickedObjectIDs",B(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("convertedObjectIDsAfterSearch",B(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("convertedObjectIDs",B(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&t.reduce((function(e,t){var n=t.items,r=k(t,A);return[].concat(D(e),D(q(N(N({},r),{},{objectIDs:(null==n?void 0:n.map((function(e){return e.objectID})))||r.objectIDs})).map((function(e){return{items:n,payload:e}}))))}),[]).forEach((function(e){var t=e.items;return i("viewedObjectIDs",[e.payload],t)}))},viewedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function F(e){var t=e.items.reduce((function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function L(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function U(e){return U="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},U(e)}function M(e){return function(e){if(Array.isArray(e))return H(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return H(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return H(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function H(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&z({onItemsChange:r,items:n,insights:a,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive;function l(e){t({algoliaInsightsPlugin:{__algoliaSearchParameters:W({clickAnalytics:!0},e?{userToken:e}:{}),insights:a}})}u("addAlgoliaAgent","insights-plugin"),l(),u("onUserTokenChange",l),u("getUserToken",null,(function(e,t){l(t)})),n((function(e){var t=e.item,n=e.state,r=e.event,i=e.source;L(t)&&o({state:n,event:r,insights:a,item:t,insightsEvents:[W({eventName:"Item Selected"},j({item:t,items:i.getItems().filter(L)}))]})})),r((function(e){var t=e.item,n=e.source,r=e.state,o=e.event;L(t)&&i({state:r,event:o,insights:a,item:t,insightsEvents:[W({eventName:"Item Active"},j({item:t,items:n.getItems().filter(L)}))]})}))},onStateChange:function(e){var t=e.state;c({state:t})},__autocomplete_pluginOptions:e}}function J(e,t){var n=t;return{then:function(t,r){return J(e.then(Y(t,n,e),Y(r,n,e)),n)},catch:function(t){return J(e.catch(Y(t,n,e)),n)},finally:function(t){return t&&n.onCancelList.push(t),J(e.finally(Y(t&&function(){return n.onCancelList=[],t()},n,e)),n)},cancel:function(){n.isCanceled=!0;var e=n.onCancelList;n.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===n.isCanceled}}}function X(e){return J(e,{isCanceled:!1,onCancelList:[]})}function Y(e,t,n){return e?function(n){return t.isCanceled?n:e(n)}:n}function Z(e,t,n,r){if(!n)return null;if(e<0&&(null===t||null!==r&&0===t))return n+e;var o=(null===t?-1:t)+e;return o<=-1||o>=n?null===r?null:0:o}function ee(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function te(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:d(),plugins:o,initialState:he({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(ye(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:O,onResolve:O};Object.keys(t).forEach((function(e){t[e].__default=!0}));var r=te(te({},t),e);return Promise.resolve(r)})))}))}(e,n)}))).then((function(e){return m(e)})).then((function(e){return e.map((function(e){return he(he({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))},onResolve:function(n){e.onResolve(n),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:he({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}function Se(e){return Se="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Se(e)}function je(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Pe(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var He,Ve,We,Ke=null,Qe=(He=-1,Ve=-1,We=void 0,function(e){var t=++He;return Promise.resolve(e).then((function(e){return We&&t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function et(e){return et="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},et(e)}var tt=["props","refresh","store"],nt=["inputElement","formElement","panelElement"],rt=["inputElement"],ot=["inputElement","maxLength"],it=["source"],ut=["item","source"];function at(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function lt(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function ft(e){var t=e.props,n=e.refresh,r=e.store,o=st(e,tt);return{getEnvironmentProps:function(e){var n=e.inputElement,o=e.formElement,i=e.panelElement;function u(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[o,i].some((function(t){return n=t,r=e.target,n===r||n.contains(r);var n,r}))&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return lt({onTouchStart:u,onMouseDown:u,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},st(e,nt))},getRootProps:function(e){return lt({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-owns":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return ie(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":ie(t.id,"label")},e)},getFormProps:function(e){return e.inputElement,lt({action:"",noValidate:!0,role:"search",onSubmit:function(i){var u;i.preventDefault(),t.onSubmit(lt({event:i,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),null===(u=e.inputElement)||void 0===u||u.blur()},onReset:function(i){var u;i.preventDefault(),t.onReset(lt({event:i,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),null===(u=e.inputElement)||void 0===u||u.focus()}},st(e,rt))},getLabelProps:function(e){return lt({htmlFor:ie(t.id,"input"),id:ie(t.id,"label")},e)},getInputProps:function(e){var i;function u(e){(t.openOnFocus||Boolean(r.getState().query))&&$e(lt({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var a=e||{};a.inputElement;var l=a.maxLength,c=void 0===l?512:l,s=st(a,ot),f=oe(r.getState()),p=function(e){return Boolean(e&&e.match(ue))}((null===(i=t.environment.navigator)||void 0===i?void 0:i.userAgent)||""),m=t.enterKeyHint||(null!=f&&f.itemUrl&&!p?"go":"search");return lt({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?ie(t.id,"item-".concat(r.getState().activeItemId),null==f?void 0:f.source):void 0,"aria-controls":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return ie(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":ie(t.id,"label"),value:r.getState().completion||r.getState().query,id:ie(t.id,"input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:m,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:c,type:"search",onChange:function(e){$e(lt({event:e,props:t,query:e.currentTarget.value.slice(0,c),refresh:n,store:r},o))},onKeyDown:function(e){!function(e){var t=e.event,n=e.props,r=e.refresh,o=e.store,i=Ze(e,Ge);if("ArrowUp"===t.key||"ArrowDown"===t.key){var u=function(){var e=oe(o.getState()),t=n.environment.document.getElementById(ie(n.id,"item-".concat(o.getState().activeItemId),null==e?void 0:e.source));t&&(t.scrollIntoViewIfNeeded?t.scrollIntoViewIfNeeded(!1):t.scrollIntoView(!1))},a=function(){var e=oe(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,u=e.itemInputValue,a=e.itemUrl,l=e.source;l.onActive(Xe({event:t,item:n,itemInputValue:u,itemUrl:a,refresh:r,source:l,state:o.getState()},i))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?$e(Xe({event:t,props:n,query:o.getState().query,refresh:r,store:o},i)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),a(),setTimeout(u,0)})):(o.dispatch(t.key,{}),a(),u())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=oe(o.getState()),c=l.item,s=l.itemInputValue,f=l.itemUrl,p=l.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(p.onSelect(Xe({event:t,item:c,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i)),n.navigator.navigateNewTab({itemUrl:f,item:c,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(p.onSelect(Xe({event:t,item:c,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i)),n.navigator.navigateNewWindow({itemUrl:f,item:c,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return p.onSelect(Xe({event:t,item:c,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i)),void n.navigator.navigate({itemUrl:f,item:c,state:o.getState()});$e(Xe({event:t,nextState:{isOpen:!1},props:n,query:s,refresh:r,store:o},i)).then((function(){p.onSelect(Xe({event:t,item:c,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i))}))}}}(lt({event:e,props:t,refresh:n,store:r},o))},onFocus:u,onBlur:O,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||u(n)}},s)},getPanelProps:function(e){return lt({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.source,o=st(n,it);return lt({role:"listbox","aria-labelledby":ie(t.id,"label"),id:ie(t.id,"list",r)},o)},getItemProps:function(e){var i=e.item,u=e.source,a=st(e,ut);return lt({id:ie(t.id,"item-".concat(i.__autocomplete_id),u),role:"option","aria-selected":r.getState().activeItemId===i.__autocomplete_id,onMouseMove:function(e){if(i.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",i.__autocomplete_id);var t=oe(r.getState());if(null!==r.getState().activeItemId&&t){var u=t.item,a=t.itemInputValue,l=t.itemUrl,c=t.source;c.onActive(lt({event:e,item:u,itemInputValue:a,itemUrl:l,refresh:n,source:c,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var a=u.getItemInputValue({item:i,state:r.getState()}),l=u.getItemUrl({item:i,state:r.getState()});(l?Promise.resolve():$e(lt({event:e,nextState:{isOpen:!1},props:t,query:a,refresh:n,store:r},o))).then((function(){u.onSelect(lt({event:e,item:i,itemInputValue:a,itemUrl:l,refresh:n,source:u,state:r.getState()},o))}))}},a)}}}function pt(e){return pt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},pt(e)}function mt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function vt(e){for(var t=1;t=5&&((o||!e&&5===r)&&(u.push(r,0,o,n),r=6),e&&(u.push(r,e,0,n),r=6)),o=""},l=0;l"===t?(r=1,o=""):o=t+o[0]:i?t===i?i="":o+=t:'"'===t||"'"===t?i=t:">"===t?(a(),r=1):r&&("="===t?(r=5,n=o,o=""):"/"===t&&(r<5||">"===e[l][c+1])?(a(),3===r&&(u=u[0]),r=u,(u=u[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(a(),r=2):o+=t),3===r&&"!--"===o&&(r=4,u=u[0])}return a(),u}(e)),t),arguments,[])).length>1?t:t[0]}var kt=function(e){var t=e.environment,n=t.document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("class","aa-ClearIcon"),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("width","18"),n.setAttribute("height","18"),n.setAttribute("fill","currentColor");var r=t.document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d","M5.293 6.707l5.293 5.293-5.293 5.293c-0.391 0.391-0.391 1.024 0 1.414s1.024 0.391 1.414 0l5.293-5.293 5.293 5.293c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414l-5.293-5.293 5.293-5.293c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0l-5.293 5.293-5.293-5.293c-0.391-0.391-1.024-0.391-1.414 0s-0.391 1.024 0 1.414z"),n.appendChild(r),n};function xt(e,t){if("string"==typeof t){var n=e.document.querySelector(t);return"The element ".concat(JSON.stringify(t)," is not in the document."),n}return t}function Nt(){for(var e=arguments.length,t=new Array(e),n=0;n2&&(u.children=arguments.length>3?Jt.call(arguments,2):n),"function"==typeof e&&null!=e.defaultProps)for(i in e.defaultProps)void 0===u[i]&&(u[i]=e.defaultProps[i]);return sn(e,u,r,o,null)}function sn(e,t,n,r,o){var i={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++Yt:o};return null==o&&null!=Xt.vnode&&Xt.vnode(i),i}function fn(e){return e.children}function pn(e,t){this.props=e,this.context=t}function mn(e,t){if(null==t)return e.__?mn(e.__,e.__.__k.indexOf(e)+1):null;for(var n;tt&&Zt.sort(nn));yn.__r=0}function bn(e,t,n,r,o,i,u,a,l,c){var s,f,p,m,v,d,y,b=r&&r.__k||on,g=b.length;for(n.__k=[],s=0;s0?sn(m.type,m.props,m.key,m.ref?m.ref:null,m.__v):m)){if(m.__=n,m.__b=n.__b+1,null===(p=b[s])||p&&m.key==p.key&&m.type===p.type)b[s]=void 0;else for(f=0;f=0;t--)if((n=e.__k[t])&&(r=On(n)))return r;return null}function _n(e,t,n){"-"===t[0]?e.setProperty(t,null==n?"":n):e[t]=null==n?"":"number"!=typeof n||un.test(t)?n:n+"px"}function Sn(e,t,n,r,o){var i;e:if("style"===t)if("string"==typeof n)e.style.cssText=n;else{if("string"==typeof r&&(e.style.cssText=r=""),r)for(t in r)n&&t in n||_n(e.style,t,"");if(n)for(t in n)r&&n[t]===r[t]||_n(e.style,t,n[t])}else if("o"===t[0]&&"n"===t[1])i=t!==(t=t.replace(/Capture$/,"")),t=t.toLowerCase()in e?t.toLowerCase().slice(2):t.slice(2),e.l||(e.l={}),e.l[t+i]=n,n?r||e.addEventListener(t,i?Pn:jn,i):e.removeEventListener(t,i?Pn:jn,i);else if("dangerouslySetInnerHTML"!==t){if(o)t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!==t&&"height"!==t&&"href"!==t&&"list"!==t&&"form"!==t&&"tabIndex"!==t&&"download"!==t&&t in e)try{e[t]=null==n?"":n;break e}catch(e){}"function"==typeof n||(null==n||!1===n&&"-"!==t[4]?e.removeAttribute(t):e.setAttribute(t,n))}}function jn(e){return this.l[e.type+!1](Xt.event?Xt.event(e):e)}function Pn(e){return this.l[e.type+!0](Xt.event?Xt.event(e):e)}function wn(e,t,n,r,o,i,u,a,l){var c,s,f,p,m,v,d,y,b,g,h,O,_,S,j,P=t.type;if(void 0!==t.constructor)return null;null!=n.__h&&(l=n.__h,a=t.__e=n.__e,t.__h=null,i=[a]),(c=Xt.__b)&&c(t);try{e:if("function"==typeof P){if(y=t.props,b=(c=P.contextType)&&r[c.__c],g=c?b?b.props.value:c.__:r,n.__c?d=(s=t.__c=n.__c).__=s.__E:("prototype"in P&&P.prototype.render?t.__c=s=new P(y,g):(t.__c=s=new pn(y,g),s.constructor=P,s.render=Cn),b&&b.sub(s),s.props=y,s.state||(s.state={}),s.context=g,s.__n=r,f=s.__d=!0,s.__h=[],s._sb=[]),null==s.__s&&(s.__s=s.state),null!=P.getDerivedStateFromProps&&(s.__s==s.state&&(s.__s=an({},s.__s)),an(s.__s,P.getDerivedStateFromProps(y,s.__s))),p=s.props,m=s.state,s.__v=t,f)null==P.getDerivedStateFromProps&&null!=s.componentWillMount&&s.componentWillMount(),null!=s.componentDidMount&&s.__h.push(s.componentDidMount);else{if(null==P.getDerivedStateFromProps&&y!==p&&null!=s.componentWillReceiveProps&&s.componentWillReceiveProps(y,g),!s.__e&&null!=s.shouldComponentUpdate&&!1===s.shouldComponentUpdate(y,s.__s,g)||t.__v===n.__v){for(t.__v!==n.__v&&(s.props=y,s.state=s.__s,s.__d=!1),s.__e=!1,t.__e=n.__e,t.__k=n.__k,t.__k.forEach((function(e){e&&(e.__=t)})),h=0;h0&&void 0!==arguments[0]?arguments[0]:[];return{get:function(){return e},add:function(t){var n=e[e.length-1];(null==n?void 0:n.isHighlighted)===t.isHighlighted?e[e.length-1]={value:n.value+t.value,isHighlighted:n.isHighlighted}:e.push(t)}}}(n?[{value:n,isHighlighted:!1}]:[]);return t.forEach((function(e){var t=e.split(xn);r.add({value:t[0],isHighlighted:!0}),""!==t[1]&&r.add({value:t[1],isHighlighted:!1})})),r.get()}function Tn(e){return function(e){if(Array.isArray(e))return qn(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return qn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return qn(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function qn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n",""":'"',"'":"'"},Fn=new RegExp(/\w/i),Ln=/&(amp|quot|lt|gt|#39);/g,Un=RegExp(Ln.source);function Mn(e,t){var n,r,o,i=e[t],u=(null===(n=e[t+1])||void 0===n?void 0:n.isHighlighted)||!0,a=(null===(r=e[t-1])||void 0===r?void 0:r.isHighlighted)||!0;return Fn.test((o=i.value)&&Un.test(o)?o.replace(Ln,(function(e){return Rn[e]})):o)||a!==u?i.isHighlighted:a}function Hn(e){return Hn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Hn(e)}function Vn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Wn(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function ur(e){return function(e){if(Array.isArray(e))return ar(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return ar(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ar(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ar(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0;if(!O.value.core.openOnFocus&&!t.query)return n;var r=Boolean(y.current||O.value.renderer.renderNoResults);return!n&&r||n},__autocomplete_metadata:{userAgents:br,options:e}}))})),j=f(n({collections:[],completion:null,context:{},isOpen:!1,query:"",activeItemId:null,status:"idle"},O.value.core.initialState)),P={getEnvironmentProps:O.value.renderer.getEnvironmentProps,getFormProps:O.value.renderer.getFormProps,getInputProps:O.value.renderer.getInputProps,getItemProps:O.value.renderer.getItemProps,getLabelProps:O.value.renderer.getLabelProps,getListProps:O.value.renderer.getListProps,getPanelProps:O.value.renderer.getPanelProps,getRootProps:O.value.renderer.getRootProps},w={setActiveItemId:S.value.setActiveItemId,setQuery:S.value.setQuery,setCollections:S.value.setCollections,setIsOpen:S.value.setIsOpen,setStatus:S.value.setStatus,setContext:S.value.setContext,refresh:S.value.refresh,navigator:S.value.navigator},I=m((function(){return Ct.bind(O.value.renderer.renderer.createElement)})),A=m((function(){return Gt({autocomplete:S.value,autocompleteScopeApi:w,classNames:O.value.renderer.classNames,environment:O.value.core.environment,isDetached:_.value,placeholder:O.value.core.placeholder,propGetters:P,setIsModalOpen:k,state:j.current,translations:O.value.renderer.translations})}));function E(){Ht(A.value.panel,{style:_.value?{}:yr({panelPlacement:O.value.renderer.panelPlacement,container:A.value.root,form:A.value.form,environment:O.value.core.environment})})}function D(e){j.current=e;var t={autocomplete:S.value,autocompleteScopeApi:w,classNames:O.value.renderer.classNames,components:O.value.renderer.components,container:O.value.renderer.container,html:I.value,dom:A.value,panelContainer:_.value?A.value.detachedContainer:O.value.renderer.panelContainer,propGetters:P,state:j.current,renderer:O.value.renderer.renderer},r=!b(e)&&!y.current&&O.value.renderer.renderNoResults||O.value.renderer.render;!function(e){var t=e.autocomplete,r=e.autocompleteScopeApi,o=e.dom,i=e.propGetters,u=e.state;Vt(o.root,i.getRootProps(n({state:u,props:t.getRootProps({})},r))),Vt(o.input,i.getInputProps(n({state:u,props:t.getInputProps({inputElement:o.input}),inputElement:o.input},r))),Ht(o.label,{hidden:"stalled"===u.status}),Ht(o.loadingIndicator,{hidden:"stalled"!==u.status}),Ht(o.clearButton,{hidden:!u.query}),Ht(o.detachedSearchButtonQuery,{textContent:u.query}),Ht(o.detachedSearchButtonPlaceholder,{hidden:Boolean(u.query)})}(t),function(e,t){var r=t.autocomplete,o=t.autocompleteScopeApi,u=t.classNames,a=t.html,l=t.dom,c=t.panelContainer,s=t.propGetters,f=t.state,p=t.components,m=t.renderer;if(f.isOpen){c.contains(l.panel)||"loading"===f.status||c.appendChild(l.panel),l.panel.classList.toggle("aa-Panel--stalled","stalled"===f.status);var v=f.collections.filter((function(e){var t=e.source,n=e.items;return t.templates.noResults||n.length>0})).map((function(e,t){var l=e.source,c=e.items;return m.createElement("section",{key:t,className:u.source,"data-autocomplete-source-id":l.sourceId},l.templates.header&&m.createElement("div",{className:u.sourceHeader},l.templates.header({components:p,createElement:m.createElement,Fragment:m.Fragment,items:c,source:l,state:f,html:a})),l.templates.noResults&&0===c.length?m.createElement("div",{className:u.sourceNoResults},l.templates.noResults({components:p,createElement:m.createElement,Fragment:m.Fragment,source:l,state:f,html:a})):m.createElement("ul",i({className:u.list},s.getListProps(n({state:f,props:r.getListProps({source:l})},o))),c.map((function(e){var t=r.getItemProps({item:e,source:l});return m.createElement("li",i({key:t.id,className:u.item},s.getItemProps(n({state:f,props:t},o))),l.templates.item({components:p,createElement:m.createElement,Fragment:m.Fragment,item:e,state:f,html:a}))}))),l.templates.footer&&m.createElement("div",{className:u.sourceFooter},l.templates.footer({components:p,createElement:m.createElement,Fragment:m.Fragment,items:c,source:l,state:f,html:a})))})),d=m.createElement(m.Fragment,null,m.createElement("div",{className:u.panelLayout},v),m.createElement("div",{className:"aa-GradientBottom"})),y=v.reduce((function(e,t){return e[t.props["data-autocomplete-source-id"]]=t,e}),{});e(n(n({children:d,state:f,sections:v,elements:y},m),{},{components:p,html:a},o),l.panel)}else c.contains(l.panel)&&c.removeChild(l.panel)}(r,t)}function C(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};l();var t=O.value.renderer,n=t.components,r=u(t,gr);g.current=qt(r,O.value.core,{components:Bt(n,(function(e){return!e.value.hasOwnProperty("__autocomplete_componentName")})),initialState:j.current},e),v(),c(),S.value.refresh().then((function(){D(j.current)}))}function k(e){requestAnimationFrame((function(){var t=O.value.core.environment.document.body.contains(A.value.detachedOverlay);e!==t&&(e?(O.value.core.environment.document.body.appendChild(A.value.detachedOverlay),O.value.core.environment.document.body.classList.add("aa-Detached"),A.value.input.focus()):(O.value.core.environment.document.body.removeChild(A.value.detachedOverlay),O.value.core.environment.document.body.classList.remove("aa-Detached")))}))}return a((function(){var e=S.value.getEnvironmentProps({formElement:A.value.form,panelElement:A.value.panel,inputElement:A.value.input});return Ht(O.value.core.environment,e),function(){Ht(O.value.core.environment,Object.keys(e).reduce((function(e,t){return n(n({},e),{},o({},t,void 0))}),{}))}})),a((function(){var e=_.value?O.value.core.environment.document.body:O.value.renderer.panelContainer,t=_.value?A.value.detachedOverlay:A.value.panel;return _.value&&j.current.isOpen&&k(!0),D(j.current),function(){e.contains(t)&&e.removeChild(t)}})),a((function(){var e=O.value.renderer.container;return e.appendChild(A.value.root),function(){e.removeChild(A.value.root)}})),a((function(){var e=p((function(e){D(e.state)}),0);return h.current=function(t){var n=t.state,r=t.prevState;(_.value&&r.isOpen!==n.isOpen&&k(n.isOpen),_.value||!n.isOpen||r.isOpen||E(),n.query!==r.query)&&O.value.core.environment.document.querySelectorAll(".aa-Panel--scrollable").forEach((function(e){0!==e.scrollTop&&(e.scrollTop=0)}));e({state:n})},function(){h.current=void 0}})),a((function(){var e=p((function(){var e=_.value;_.value=O.value.core.environment.matchMedia(O.value.renderer.detachedMediaQuery).matches,e!==_.value?C({}):requestAnimationFrame(E)}),20);return O.value.core.environment.addEventListener("resize",e),function(){O.value.core.environment.removeEventListener("resize",e)}})),a((function(){if(!_.value)return function(){};function e(e){A.value.detachedContainer.classList.toggle("aa-DetachedContainer--modal",e)}function t(t){e(t.matches)}var n=O.value.core.environment.matchMedia(getComputedStyle(O.value.core.environment.document.documentElement).getPropertyValue("--aa-detached-modal-media-query"));e(n.matches);var r=Boolean(n.addEventListener);return r?n.addEventListener("change",t):n.addListener(t),function(){r?n.removeEventListener("change",t):n.removeListener(t)}})),a((function(){return requestAnimationFrame(E),function(){}})),n(n({},w),{},{update:C,destroy:function(){l()}})},e.getAlgoliaFacets=function(e){var t=hr({transformResponse:function(e){return e.facetHits}}),r=e.queries.map((function(e){return n(n({},e),{},{type:"facet"})}));return t(n(n({},e),{},{queries:r}))},e.getAlgoliaResults=Or,Object.defineProperty(e,"__esModule",{value:!0})})); + diff --git a/blog/docs/site_libs/quarto-search/fuse.min.js b/blog/docs/site_libs/quarto-search/fuse.min.js new file mode 100644 index 0000000..adc2835 --- /dev/null +++ b/blog/docs/site_libs/quarto-search/fuse.min.js @@ -0,0 +1,9 @@ +/** + * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2022 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(C).length;if(n.has(i))return n.get(i);var o=1/Math.pow(i,.5*e),c=parseFloat(Math.round(o*r)/r);return n.set(i,c),c},clear:function(){n.clear()}}}var $=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?I.getFn:n,o=t.fieldNormWeight,c=void 0===o?I.fieldNormWeight:o;r(this,e),this.norm=E(c,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return o(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,g(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();g(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?I.getFn:r,o=n.fieldNormWeight,c=void 0===o?I.fieldNormWeight:o,a=new $({getFn:i,fieldNormWeight:c});return a.setKeys(e.map(_)),a.setSources(t),a.create(),a}function R(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,c=t.expectedLocation,a=void 0===c?0:c,s=t.distance,u=void 0===s?I.distance:s,h=t.ignoreLocation,l=void 0===h?I.ignoreLocation:h,f=r/e.length;if(l)return f;var d=Math.abs(a-o);return u?f+d/u:d?1:f}function N(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:I.minMatchCharLength,n=[],r=-1,i=-1,o=0,c=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}var P=32;function W(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,c=void 0===o?I.location:o,a=i.threshold,s=void 0===a?I.threshold:a,u=i.distance,h=void 0===u?I.distance:u,l=i.includeMatches,f=void 0===l?I.includeMatches:l,d=i.findAllMatches,v=void 0===d?I.findAllMatches:d,g=i.minMatchCharLength,y=void 0===g?I.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?I.isCaseSensitive:p,k=i.ignoreLocation,M=void 0===k?I.ignoreLocation:k;if(r(this,e),this.options={location:c,threshold:s,distance:h,includeMatches:f,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:M},this.pattern=m?t:t.toLowerCase(),this.chunks=[],this.pattern.length){var b=function(e,t){n.chunks.push({pattern:e,alphabet:W(e),startIndex:t})},x=this.pattern.length;if(x>P){for(var w=0,L=x%P,S=x-L;w3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?I.location:i,c=r.distance,a=void 0===c?I.distance:c,s=r.threshold,u=void 0===s?I.threshold:s,h=r.findAllMatches,l=void 0===h?I.findAllMatches:h,f=r.minMatchCharLength,d=void 0===f?I.minMatchCharLength:f,v=r.includeMatches,g=void 0===v?I.includeMatches:v,y=r.ignoreLocation,p=void 0===y?I.ignoreLocation:y;if(t.length>P)throw new Error(w(P));for(var m,k=t.length,M=e.length,b=Math.max(0,Math.min(o,M)),x=u,L=b,S=d>1||g,_=S?Array(M):[];(m=e.indexOf(t,L))>-1;){var O=R(t,{currentLocation:m,expectedLocation:b,distance:a,ignoreLocation:p});if(x=Math.min(O,x),L=m+k,S)for(var j=0;j=z;q-=1){var B=q-1,J=n[e.charAt(B)];if(S&&(_[B]=+!!J),K[q]=(K[q+1]<<1|1)&J,F&&(K[q]|=(A[q+1]|A[q])<<1|1|A[q+1]),K[q]&$&&(C=R(t,{errors:F,currentLocation:B,expectedLocation:b,distance:a,ignoreLocation:p}))<=x){if(x=C,(L=B)<=b)break;z=Math.max(1,2*b-L)}}if(R(t,{errors:F+1,currentLocation:b,expectedLocation:b,distance:a,ignoreLocation:p})>x)break;A=K}var U={isMatch:L>=0,score:Math.max(.001,C)};if(S){var V=N(_,d);V.length?g&&(U.indices=V):U.isMatch=!1}return U}(e,n,i,{location:c+o,distance:a,threshold:s,findAllMatches:u,minMatchCharLength:h,includeMatches:r,ignoreLocation:l}),p=y.isMatch,m=y.score,k=y.indices;p&&(g=!0),v+=m,p&&k&&(d=[].concat(f(d),f(k)))}));var y={isMatch:g,score:g?v/this.chunks.length:1};return g&&r&&(y.indices=d),y}}]),e}(),z=function(){function e(t){r(this,e),this.pattern=t}return o(e,[{key:"search",value:function(){}}],[{key:"isMultiMatch",value:function(e){return D(e,this.multiRegex)}},{key:"isSingleMatch",value:function(e){return D(e,this.singleRegex)}}]),e}();function D(e,t){var n=e.match(t);return n?n[1]:null}var K=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e===this.pattern;return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"exact"}},{key:"multiRegex",get:function(){return/^="(.*)"$/}},{key:"singleRegex",get:function(){return/^=(.*)$/}}]),n}(z),q=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=-1===e.indexOf(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"$/}},{key:"singleRegex",get:function(){return/^!(.*)$/}}]),n}(z),B=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"prefix-exact"}},{key:"multiRegex",get:function(){return/^\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^\^(.*)$/}}]),n}(z),J=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=!e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-prefix-exact"}},{key:"multiRegex",get:function(){return/^!\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^!\^(.*)$/}}]),n}(z),U=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[e.length-this.pattern.length,e.length-1]}}}],[{key:"type",get:function(){return"suffix-exact"}},{key:"multiRegex",get:function(){return/^"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^(.*)\$$/}}]),n}(z),V=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=!e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-suffix-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^!(.*)\$$/}}]),n}(z),G=function(e){a(n,e);var t=l(n);function n(e){var i,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},c=o.location,a=void 0===c?I.location:c,s=o.threshold,u=void 0===s?I.threshold:s,h=o.distance,l=void 0===h?I.distance:h,f=o.includeMatches,d=void 0===f?I.includeMatches:f,v=o.findAllMatches,g=void 0===v?I.findAllMatches:v,y=o.minMatchCharLength,p=void 0===y?I.minMatchCharLength:y,m=o.isCaseSensitive,k=void 0===m?I.isCaseSensitive:m,M=o.ignoreLocation,b=void 0===M?I.ignoreLocation:M;return r(this,n),(i=t.call(this,e))._bitapSearch=new T(e,{location:a,threshold:u,distance:l,includeMatches:d,findAllMatches:g,minMatchCharLength:p,isCaseSensitive:k,ignoreLocation:b}),i}return o(n,[{key:"search",value:function(e){return this._bitapSearch.searchIn(e)}}],[{key:"type",get:function(){return"fuzzy"}},{key:"multiRegex",get:function(){return/^"(.*)"$/}},{key:"singleRegex",get:function(){return/^(.*)$/}}]),n}(z),H=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){for(var t,n=0,r=[],i=this.pattern.length;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,r.push([t,n-1]);var o=!!r.length;return{isMatch:o,score:o?0:1,indices:r}}}],[{key:"type",get:function(){return"include"}},{key:"multiRegex",get:function(){return/^'"(.*)"$/}},{key:"singleRegex",get:function(){return/^'(.*)$/}}]),n}(z),Q=[K,H,B,J,V,U,q,G],X=Q.length,Y=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/;function Z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.split("|").map((function(e){for(var n=e.trim().split(Y).filter((function(e){return e&&!!e.trim()})),r=[],i=0,o=n.length;i1&&void 0!==arguments[1]?arguments[1]:{},i=n.isCaseSensitive,o=void 0===i?I.isCaseSensitive:i,c=n.includeMatches,a=void 0===c?I.includeMatches:c,s=n.minMatchCharLength,u=void 0===s?I.minMatchCharLength:s,h=n.ignoreLocation,l=void 0===h?I.ignoreLocation:h,f=n.findAllMatches,d=void 0===f?I.findAllMatches:f,v=n.location,g=void 0===v?I.location:v,y=n.threshold,p=void 0===y?I.threshold:y,m=n.distance,k=void 0===m?I.distance:m;r(this,e),this.query=null,this.options={isCaseSensitive:o,includeMatches:a,minMatchCharLength:u,findAllMatches:d,ignoreLocation:l,location:g,threshold:p,distance:k},this.pattern=o?t:t.toLowerCase(),this.query=Z(this.pattern,this.options)}return o(e,[{key:"searchIn",value:function(e){var t=this.query;if(!t)return{isMatch:!1,score:1};var n=this.options,r=n.includeMatches;e=n.isCaseSensitive?e:e.toLowerCase();for(var i=0,o=[],c=0,a=0,s=t.length;a-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function ve(e,t){t.score=e.score}function ge(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?I.includeMatches:r,o=n.includeScore,c=void 0===o?I.includeScore:o,a=[];return i&&a.push(de),c&&a.push(ve),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return a.length&&a.forEach((function(t){t(e,r)})),r}))}var ye=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;r(this,e),this.options=t(t({},I),i),this.options.useExtendedSearch,this._keyStore=new S(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof $))throw new Error("Incorrect 'index' type");this._myIndex=t||F(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){k(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{},n=t.limit,r=void 0===n?-1:n,i=this.options,o=i.includeMatches,c=i.includeScore,a=i.shouldSort,s=i.sortFn,u=i.ignoreFieldNorm,h=g(e)?g(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return fe(h,{ignoreFieldNorm:u}),a&&h.sort(s),y(r)&&r>-1&&(h=h.slice(0,r)),ge(h,this._docs,{includeMatches:o,includeScore:c})}},{key:"_searchStringList",value:function(e){var t=re(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(k(n)){var c=t.searchIn(n),a=c.isMatch,s=c.score,u=c.indices;a&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:u}]})}})),r}},{key:"_searchLogical",value:function(e){var t=this,n=function(e,t){var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).auto,r=void 0===n||n,i=function e(n){var i=Object.keys(n),o=ue(n);if(!o&&i.length>1&&!se(n))return e(le(n));if(he(n)){var c=o?n[ce]:i[0],a=o?n[ae]:n[c];if(!g(a))throw new Error(x(c));var s={keyId:j(c),pattern:a};return r&&(s.searcher=re(a,t)),s}var u={children:[],operator:i[0]};return i.forEach((function(t){var r=n[t];v(r)&&r.forEach((function(t){u.children.push(e(t))}))})),u};return se(e)||(e=le(e)),i(e)}(e,this.options),r=function e(n,r,i){if(!n.children){var o=n.keyId,c=n.searcher,a=t._findMatches({key:t._keyStore.get(o),value:t._myIndex.getValueForItemAtKeyId(r,o),searcher:c});return a&&a.length?[{idx:i,item:r,matches:a}]:[]}for(var s=[],u=0,h=n.children.length;u1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?I.getFn:n,i=t.fieldNormWeight,o=void 0===i?I.fieldNormWeight:i,c=e.keys,a=e.records,s=new $({getFn:r,fieldNormWeight:o});return s.setKeys(c),s.setIndexRecords(a),s},ye.config=I,function(){ne.push.apply(ne,arguments)}(te),ye},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t(); \ No newline at end of file diff --git a/blog/docs/site_libs/quarto-search/quarto-search.js b/blog/docs/site_libs/quarto-search/quarto-search.js new file mode 100644 index 0000000..d788a95 --- /dev/null +++ b/blog/docs/site_libs/quarto-search/quarto-search.js @@ -0,0 +1,1290 @@ +const kQueryArg = "q"; +const kResultsArg = "show-results"; + +// If items don't provide a URL, then both the navigator and the onSelect +// function aren't called (and therefore, the default implementation is used) +// +// We're using this sentinel URL to signal to those handlers that this +// item is a more item (along with the type) and can be handled appropriately +const kItemTypeMoreHref = "0767FDFD-0422-4E5A-BC8A-3BE11E5BBA05"; + +window.document.addEventListener("DOMContentLoaded", function (_event) { + // Ensure that search is available on this page. If it isn't, + // should return early and not do anything + var searchEl = window.document.getElementById("quarto-search"); + if (!searchEl) return; + + const { autocomplete } = window["@algolia/autocomplete-js"]; + + let quartoSearchOptions = {}; + let language = {}; + const searchOptionEl = window.document.getElementById( + "quarto-search-options" + ); + if (searchOptionEl) { + const jsonStr = searchOptionEl.textContent; + quartoSearchOptions = JSON.parse(jsonStr); + language = quartoSearchOptions.language; + } + + // note the search mode + if (quartoSearchOptions.type === "overlay") { + searchEl.classList.add("type-overlay"); + } else { + searchEl.classList.add("type-textbox"); + } + + // Used to determine highlighting behavior for this page + // A `q` query param is expected when the user follows a search + // to this page + const currentUrl = new URL(window.location); + const query = currentUrl.searchParams.get(kQueryArg); + const showSearchResults = currentUrl.searchParams.get(kResultsArg); + const mainEl = window.document.querySelector("main"); + + // highlight matches on the page + if (query && mainEl) { + // perform any highlighting + highlight(escapeRegExp(query), mainEl); + + // fix up the URL to remove the q query param + const replacementUrl = new URL(window.location); + replacementUrl.searchParams.delete(kQueryArg); + window.history.replaceState({}, "", replacementUrl); + } + + // function to clear highlighting on the page when the search query changes + // (e.g. if the user edits the query or clears it) + let highlighting = true; + const resetHighlighting = (searchTerm) => { + if (mainEl && highlighting && query && searchTerm !== query) { + clearHighlight(query, mainEl); + highlighting = false; + } + }; + + // Clear search highlighting when the user scrolls sufficiently + const resetFn = () => { + resetHighlighting(""); + window.removeEventListener("quarto-hrChanged", resetFn); + window.removeEventListener("quarto-sectionChanged", resetFn); + }; + + // Register this event after the initial scrolling and settling of events + // on the page + window.addEventListener("quarto-hrChanged", resetFn); + window.addEventListener("quarto-sectionChanged", resetFn); + + // Responsively switch to overlay mode if the search is present on the navbar + // Note that switching the sidebar to overlay mode requires more coordinate (not just + // the media query since we generate different HTML for sidebar overlays than we do + // for sidebar input UI) + const detachedMediaQuery = + quartoSearchOptions.type === "overlay" ? "all" : "(max-width: 991px)"; + + // If configured, include the analytics client to send insights + const plugins = configurePlugins(quartoSearchOptions); + + let lastState = null; + const { setIsOpen, setQuery, setCollections } = autocomplete({ + container: searchEl, + detachedMediaQuery: detachedMediaQuery, + defaultActiveItemId: 0, + panelContainer: "#quarto-search-results", + panelPlacement: quartoSearchOptions["panel-placement"], + debug: false, + openOnFocus: true, + plugins, + classNames: { + form: "d-flex", + }, + placeholder: language["search-text-placeholder"], + translations: { + clearButtonTitle: language["search-clear-button-title"], + detachedCancelButtonText: language["search-detached-cancel-button-title"], + submitButtonTitle: language["search-submit-button-title"], + }, + initialState: { + query, + }, + getItemUrl({ item }) { + return item.href; + }, + onStateChange({ state }) { + // If this is a file URL, note that + + // Perhaps reset highlighting + resetHighlighting(state.query); + + // If the panel just opened, ensure the panel is positioned properly + if (state.isOpen) { + if (lastState && !lastState.isOpen) { + setTimeout(() => { + positionPanel(quartoSearchOptions["panel-placement"]); + }, 150); + } + } + + // Perhaps show the copy link + showCopyLink(state.query, quartoSearchOptions); + + lastState = state; + }, + reshape({ sources, state }) { + return sources.map((source) => { + try { + const items = source.getItems(); + + // Validate the items + validateItems(items); + + // group the items by document + const groupedItems = new Map(); + items.forEach((item) => { + const hrefParts = item.href.split("#"); + const baseHref = hrefParts[0]; + const isDocumentItem = hrefParts.length === 1; + + const items = groupedItems.get(baseHref); + if (!items) { + groupedItems.set(baseHref, [item]); + } else { + // If the href for this item matches the document + // exactly, place this item first as it is the item that represents + // the document itself + if (isDocumentItem) { + items.unshift(item); + } else { + items.push(item); + } + groupedItems.set(baseHref, items); + } + }); + + const reshapedItems = []; + let count = 1; + for (const [_key, value] of groupedItems) { + const firstItem = value[0]; + reshapedItems.push({ + ...firstItem, + type: kItemTypeDoc, + }); + + const collapseMatches = quartoSearchOptions["collapse-after"]; + const collapseCount = + typeof collapseMatches === "number" ? collapseMatches : 1; + + if (value.length > 1) { + const target = `search-more-${count}`; + const isExpanded = + state.context.expanded && + state.context.expanded.includes(target); + + const remainingCount = value.length - collapseCount; + + for (let i = 1; i < value.length; i++) { + if (collapseMatches && i === collapseCount) { + reshapedItems.push({ + target, + title: isExpanded + ? language["search-hide-matches-text"] + : remainingCount === 1 + ? `${remainingCount} ${language["search-more-match-text"]}` + : `${remainingCount} ${language["search-more-matches-text"]}`, + type: kItemTypeMore, + href: kItemTypeMoreHref, + }); + } + + if (isExpanded || !collapseMatches || i < collapseCount) { + reshapedItems.push({ + ...value[i], + type: kItemTypeItem, + target, + }); + } + } + } + count += 1; + } + + return { + ...source, + getItems() { + return reshapedItems; + }, + }; + } catch (error) { + // Some form of error occurred + return { + ...source, + getItems() { + return [ + { + title: error.name || "An Error Occurred While Searching", + text: + error.message || + "An unknown error occurred while attempting to perform the requested search.", + type: kItemTypeError, + }, + ]; + }, + }; + } + }); + }, + navigator: { + navigate({ itemUrl }) { + if (itemUrl !== offsetURL(kItemTypeMoreHref)) { + window.location.assign(itemUrl); + } + }, + navigateNewTab({ itemUrl }) { + if (itemUrl !== offsetURL(kItemTypeMoreHref)) { + const windowReference = window.open(itemUrl, "_blank", "noopener"); + if (windowReference) { + windowReference.focus(); + } + } + }, + navigateNewWindow({ itemUrl }) { + if (itemUrl !== offsetURL(kItemTypeMoreHref)) { + window.open(itemUrl, "_blank", "noopener"); + } + }, + }, + getSources({ state, setContext, setActiveItemId, refresh }) { + return [ + { + sourceId: "documents", + getItemUrl({ item }) { + if (item.href) { + return offsetURL(item.href); + } else { + return undefined; + } + }, + onSelect({ + item, + state, + setContext, + setIsOpen, + setActiveItemId, + refresh, + }) { + if (item.type === kItemTypeMore) { + toggleExpanded(item, state, setContext, setActiveItemId, refresh); + + // Toggle more + setIsOpen(true); + } + }, + getItems({ query }) { + if (query === null || query === "") { + return []; + } + + const limit = quartoSearchOptions.limit; + if (quartoSearchOptions.algolia) { + return algoliaSearch(query, limit, quartoSearchOptions.algolia); + } else { + // Fuse search options + const fuseSearchOptions = { + isCaseSensitive: false, + shouldSort: true, + minMatchCharLength: 2, + limit: limit, + }; + + return readSearchData().then(function (fuse) { + return fuseSearch(query, fuse, fuseSearchOptions); + }); + } + }, + templates: { + noResults({ createElement }) { + const hasQuery = lastState.query; + + return createElement( + "div", + { + class: `quarto-search-no-results${ + hasQuery ? "" : " no-query" + }`, + }, + language["search-no-results-text"] + ); + }, + header({ items, createElement }) { + // count the documents + const count = items.filter((item) => { + return item.type === kItemTypeDoc; + }).length; + + if (count > 0) { + return createElement( + "div", + { class: "search-result-header" }, + `${count} ${language["search-matching-documents-text"]}` + ); + } else { + return createElement( + "div", + { class: "search-result-header-no-results" }, + `` + ); + } + }, + footer({ _items, createElement }) { + if ( + quartoSearchOptions.algolia && + quartoSearchOptions.algolia["show-logo"] + ) { + const libDir = quartoSearchOptions.algolia["libDir"]; + const logo = createElement("img", { + src: offsetURL( + `${libDir}/quarto-search/search-by-algolia.svg` + ), + class: "algolia-search-logo", + }); + return createElement( + "a", + { href: "http://www.algolia.com/" }, + logo + ); + } + }, + + item({ item, createElement }) { + return renderItem( + item, + createElement, + state, + setActiveItemId, + setContext, + refresh, + quartoSearchOptions + ); + }, + }, + }, + ]; + }, + }); + + window.quartoOpenSearch = () => { + setIsOpen(false); + setIsOpen(true); + focusSearchInput(); + }; + + document.addEventListener("keyup", (event) => { + const { key } = event; + const kbds = quartoSearchOptions["keyboard-shortcut"]; + const focusedEl = document.activeElement; + + const isFormElFocused = [ + "input", + "select", + "textarea", + "button", + "option", + ].find((tag) => { + return focusedEl.tagName.toLowerCase() === tag; + }); + + if ( + kbds && + kbds.includes(key) && + !isFormElFocused && + !document.activeElement.isContentEditable + ) { + event.preventDefault(); + window.quartoOpenSearch(); + } + }); + + // Remove the labeleledby attribute since it is pointing + // to a non-existent label + if (quartoSearchOptions.type === "overlay") { + const inputEl = window.document.querySelector( + "#quarto-search .aa-Autocomplete" + ); + if (inputEl) { + inputEl.removeAttribute("aria-labelledby"); + } + } + + function throttle(func, wait) { + let waiting = false; + return function () { + if (!waiting) { + func.apply(this, arguments); + waiting = true; + setTimeout(function () { + waiting = false; + }, wait); + } + }; + } + + // If the main document scrolls dismiss the search results + // (otherwise, since they're floating in the document they can scroll with the document) + window.document.body.onscroll = throttle(() => { + // Only do this if we're not detached + // Bug #7117 + // This will happen when the keyboard is shown on ios (resulting in a scroll) + // which then closed the search UI + if (!window.matchMedia(detachedMediaQuery).matches) { + setIsOpen(false); + } + }, 50); + + if (showSearchResults) { + setIsOpen(true); + focusSearchInput(); + } +}); + +function configurePlugins(quartoSearchOptions) { + const autocompletePlugins = []; + const algoliaOptions = quartoSearchOptions.algolia; + if ( + algoliaOptions && + algoliaOptions["analytics-events"] && + algoliaOptions["search-only-api-key"] && + algoliaOptions["application-id"] + ) { + const apiKey = algoliaOptions["search-only-api-key"]; + const appId = algoliaOptions["application-id"]; + + // Aloglia insights may not be loaded because they require cookie consent + // Use deferred loading so events will start being recorded when/if consent + // is granted. + const algoliaInsightsDeferredPlugin = deferredLoadPlugin(() => { + if ( + window.aa && + window["@algolia/autocomplete-plugin-algolia-insights"] + ) { + window.aa("init", { + appId, + apiKey, + useCookie: true, + }); + + const { createAlgoliaInsightsPlugin } = + window["@algolia/autocomplete-plugin-algolia-insights"]; + // Register the insights client + const algoliaInsightsPlugin = createAlgoliaInsightsPlugin({ + insightsClient: window.aa, + onItemsChange({ insights, insightsEvents }) { + const events = insightsEvents.flatMap((event) => { + // This API limits the number of items per event to 20 + const chunkSize = 20; + const itemChunks = []; + const eventItems = event.items; + for (let i = 0; i < eventItems.length; i += chunkSize) { + itemChunks.push(eventItems.slice(i, i + chunkSize)); + } + // Split the items into multiple events that can be sent + const events = itemChunks.map((items) => { + return { + ...event, + items, + }; + }); + return events; + }); + + for (const event of events) { + insights.viewedObjectIDs(event); + } + }, + }); + return algoliaInsightsPlugin; + } + }); + + // Add the plugin + autocompletePlugins.push(algoliaInsightsDeferredPlugin); + return autocompletePlugins; + } +} + +// For plugins that may not load immediately, create a wrapper +// plugin and forward events and plugin data once the plugin +// is initialized. This is useful for cases like cookie consent +// which may prevent the analytics insights event plugin from initializing +// immediately. +function deferredLoadPlugin(createPlugin) { + let plugin = undefined; + let subscribeObj = undefined; + const wrappedPlugin = () => { + if (!plugin && subscribeObj) { + plugin = createPlugin(); + if (plugin && plugin.subscribe) { + plugin.subscribe(subscribeObj); + } + } + return plugin; + }; + + return { + subscribe: (obj) => { + subscribeObj = obj; + }, + onStateChange: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.onStateChange) { + plugin.onStateChange(obj); + } + }, + onSubmit: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.onSubmit) { + plugin.onSubmit(obj); + } + }, + onReset: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.onReset) { + plugin.onReset(obj); + } + }, + getSources: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.getSources) { + return plugin.getSources(obj); + } else { + return Promise.resolve([]); + } + }, + data: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.data) { + plugin.data(obj); + } + }, + }; +} + +function validateItems(items) { + // Validate the first item + if (items.length > 0) { + const item = items[0]; + const missingFields = []; + if (item.href == undefined) { + missingFields.push("href"); + } + if (!item.title == undefined) { + missingFields.push("title"); + } + if (!item.text == undefined) { + missingFields.push("text"); + } + + if (missingFields.length === 1) { + throw { + name: `Error: Search index is missing the ${missingFields[0]} field.`, + message: `The items being returned for this search do not include all the required fields. Please ensure that your index items include the ${missingFields[0]} field or use index-fields in your _quarto.yml file to specify the field names.`, + }; + } else if (missingFields.length > 1) { + const missingFieldList = missingFields + .map((field) => { + return `${field}`; + }) + .join(", "); + + throw { + name: `Error: Search index is missing the following fields: ${missingFieldList}.`, + message: `The items being returned for this search do not include all the required fields. Please ensure that your index items includes the following fields: ${missingFieldList}, or use index-fields in your _quarto.yml file to specify the field names.`, + }; + } + } +} + +let lastQuery = null; +function showCopyLink(query, options) { + const language = options.language; + lastQuery = query; + // Insert share icon + const inputSuffixEl = window.document.body.querySelector( + ".aa-Form .aa-InputWrapperSuffix" + ); + + if (inputSuffixEl) { + let copyButtonEl = window.document.body.querySelector( + ".aa-Form .aa-InputWrapperSuffix .aa-CopyButton" + ); + + if (copyButtonEl === null) { + copyButtonEl = window.document.createElement("button"); + copyButtonEl.setAttribute("class", "aa-CopyButton"); + copyButtonEl.setAttribute("type", "button"); + copyButtonEl.setAttribute("title", language["search-copy-link-title"]); + copyButtonEl.onmousedown = (e) => { + e.preventDefault(); + e.stopPropagation(); + }; + + const linkIcon = "bi-clipboard"; + const checkIcon = "bi-check2"; + + const shareIconEl = window.document.createElement("i"); + shareIconEl.setAttribute("class", `bi ${linkIcon}`); + copyButtonEl.appendChild(shareIconEl); + inputSuffixEl.prepend(copyButtonEl); + + const clipboard = new window.ClipboardJS(".aa-CopyButton", { + text: function (_trigger) { + const copyUrl = new URL(window.location); + copyUrl.searchParams.set(kQueryArg, lastQuery); + copyUrl.searchParams.set(kResultsArg, "1"); + return copyUrl.toString(); + }, + }); + clipboard.on("success", function (e) { + // Focus the input + + // button target + const button = e.trigger; + const icon = button.querySelector("i.bi"); + + // flash "checked" + icon.classList.add(checkIcon); + icon.classList.remove(linkIcon); + setTimeout(function () { + icon.classList.remove(checkIcon); + icon.classList.add(linkIcon); + }, 1000); + }); + } + + // If there is a query, show the link icon + if (copyButtonEl) { + if (lastQuery && options["copy-button"]) { + copyButtonEl.style.display = "flex"; + } else { + copyButtonEl.style.display = "none"; + } + } + } +} + +/* Search Index Handling */ +// create the index +var fuseIndex = undefined; +var shownWarning = false; + +// fuse index options +const kFuseIndexOptions = { + keys: [ + { name: "title", weight: 20 }, + { name: "section", weight: 20 }, + { name: "text", weight: 10 }, + ], + ignoreLocation: true, + threshold: 0.1, +}; + +async function readSearchData() { + // Initialize the search index on demand + if (fuseIndex === undefined) { + if (window.location.protocol === "file:" && !shownWarning) { + window.alert( + "Search requires JavaScript features disabled when running in file://... URLs. In order to use search, please run this document in a web server." + ); + shownWarning = true; + return; + } + const fuse = new window.Fuse([], kFuseIndexOptions); + + // fetch the main search.json + const response = await fetch(offsetURL("search.json")); + if (response.status == 200) { + return response.json().then(function (searchDocs) { + searchDocs.forEach(function (searchDoc) { + fuse.add(searchDoc); + }); + fuseIndex = fuse; + return fuseIndex; + }); + } else { + return Promise.reject( + new Error( + "Unexpected status from search index request: " + response.status + ) + ); + } + } + + return fuseIndex; +} + +function inputElement() { + return window.document.body.querySelector(".aa-Form .aa-Input"); +} + +function focusSearchInput() { + setTimeout(() => { + const inputEl = inputElement(); + if (inputEl) { + inputEl.focus(); + } + }, 50); +} + +/* Panels */ +const kItemTypeDoc = "document"; +const kItemTypeMore = "document-more"; +const kItemTypeItem = "document-item"; +const kItemTypeError = "error"; + +function renderItem( + item, + createElement, + state, + setActiveItemId, + setContext, + refresh, + quartoSearchOptions +) { + switch (item.type) { + case kItemTypeDoc: + return createDocumentCard( + createElement, + "file-richtext", + item.title, + item.section, + item.text, + item.href, + item.crumbs, + quartoSearchOptions + ); + case kItemTypeMore: + return createMoreCard( + createElement, + item, + state, + setActiveItemId, + setContext, + refresh + ); + case kItemTypeItem: + return createSectionCard( + createElement, + item.section, + item.text, + item.href + ); + case kItemTypeError: + return createErrorCard(createElement, item.title, item.text); + default: + return undefined; + } +} + +function createDocumentCard( + createElement, + icon, + title, + section, + text, + href, + crumbs, + quartoSearchOptions +) { + const iconEl = createElement("i", { + class: `bi bi-${icon} search-result-icon`, + }); + const titleEl = createElement("p", { class: "search-result-title" }, title); + const titleContents = [iconEl, titleEl]; + const showParent = quartoSearchOptions["show-item-context"]; + if (crumbs && showParent) { + let crumbsOut = undefined; + const crumbClz = ["search-result-crumbs"]; + if (showParent === "root") { + crumbsOut = crumbs.length > 1 ? crumbs[0] : undefined; + } else if (showParent === "parent") { + crumbsOut = crumbs.length > 1 ? crumbs[crumbs.length - 2] : undefined; + } else { + crumbsOut = crumbs.length > 1 ? crumbs.join(" > ") : undefined; + crumbClz.push("search-result-crumbs-wrap"); + } + + const crumbEl = createElement( + "p", + { class: crumbClz.join(" ") }, + crumbsOut + ); + titleContents.push(crumbEl); + } + + const titleContainerEl = createElement( + "div", + { class: "search-result-title-container" }, + titleContents + ); + + const textEls = []; + if (section) { + const sectionEl = createElement( + "p", + { class: "search-result-section" }, + section + ); + textEls.push(sectionEl); + } + const descEl = createElement("p", { + class: "search-result-text", + dangerouslySetInnerHTML: { + __html: text, + }, + }); + textEls.push(descEl); + + const textContainerEl = createElement( + "div", + { class: "search-result-text-container" }, + textEls + ); + + const containerEl = createElement( + "div", + { + class: "search-result-container", + }, + [titleContainerEl, textContainerEl] + ); + + const linkEl = createElement( + "a", + { + href: offsetURL(href), + class: "search-result-link", + }, + containerEl + ); + + const classes = ["search-result-doc", "search-item"]; + if (!section) { + classes.push("document-selectable"); + } + + return createElement( + "div", + { + class: classes.join(" "), + }, + linkEl + ); +} + +function createMoreCard( + createElement, + item, + state, + setActiveItemId, + setContext, + refresh +) { + const moreCardEl = createElement( + "div", + { + class: "search-result-more search-item", + onClick: (e) => { + // Handle expanding the sections by adding the expanded + // section to the list of expanded sections + toggleExpanded(item, state, setContext, setActiveItemId, refresh); + e.stopPropagation(); + }, + }, + item.title + ); + + return moreCardEl; +} + +function toggleExpanded(item, state, setContext, setActiveItemId, refresh) { + const expanded = state.context.expanded || []; + if (expanded.includes(item.target)) { + setContext({ + expanded: expanded.filter((target) => target !== item.target), + }); + } else { + setContext({ expanded: [...expanded, item.target] }); + } + + refresh(); + setActiveItemId(item.__autocomplete_id); +} + +function createSectionCard(createElement, section, text, href) { + const sectionEl = createSection(createElement, section, text, href); + return createElement( + "div", + { + class: "search-result-doc-section search-item", + }, + sectionEl + ); +} + +function createSection(createElement, title, text, href) { + const descEl = createElement("p", { + class: "search-result-text", + dangerouslySetInnerHTML: { + __html: text, + }, + }); + + const titleEl = createElement("p", { class: "search-result-section" }, title); + const linkEl = createElement( + "a", + { + href: offsetURL(href), + class: "search-result-link", + }, + [titleEl, descEl] + ); + return linkEl; +} + +function createErrorCard(createElement, title, text) { + const descEl = createElement("p", { + class: "search-error-text", + dangerouslySetInnerHTML: { + __html: text, + }, + }); + + const titleEl = createElement("p", { + class: "search-error-title", + dangerouslySetInnerHTML: { + __html: ` ${title}`, + }, + }); + const errorEl = createElement("div", { class: "search-error" }, [ + titleEl, + descEl, + ]); + return errorEl; +} + +function positionPanel(pos) { + const panelEl = window.document.querySelector( + "#quarto-search-results .aa-Panel" + ); + const inputEl = window.document.querySelector( + "#quarto-search .aa-Autocomplete" + ); + + if (panelEl && inputEl) { + panelEl.style.top = `${Math.round(panelEl.offsetTop)}px`; + if (pos === "start") { + panelEl.style.left = `${Math.round(inputEl.left)}px`; + } else { + panelEl.style.right = `${Math.round(inputEl.offsetRight)}px`; + } + } +} + +/* Highlighting */ +// highlighting functions +function highlightMatch(query, text) { + if (text) { + const start = text.toLowerCase().indexOf(query.toLowerCase()); + if (start !== -1) { + const startMark = ""; + const endMark = ""; + + const end = start + query.length; + text = + text.slice(0, start) + + startMark + + text.slice(start, end) + + endMark + + text.slice(end); + const startInfo = clipStart(text, start); + const endInfo = clipEnd( + text, + startInfo.position + startMark.length + endMark.length + ); + text = + startInfo.prefix + + text.slice(startInfo.position, endInfo.position) + + endInfo.suffix; + + return text; + } else { + return text; + } + } else { + return text; + } +} + +function clipStart(text, pos) { + const clipStart = pos - 50; + if (clipStart < 0) { + // This will just return the start of the string + return { + position: 0, + prefix: "", + }; + } else { + // We're clipping before the start of the string, walk backwards to the first space. + const spacePos = findSpace(text, pos, -1); + return { + position: spacePos.position, + prefix: "", + }; + } +} + +function clipEnd(text, pos) { + const clipEnd = pos + 200; + if (clipEnd > text.length) { + return { + position: text.length, + suffix: "", + }; + } else { + const spacePos = findSpace(text, clipEnd, 1); + return { + position: spacePos.position, + suffix: spacePos.clipped ? "…" : "", + }; + } +} + +function findSpace(text, start, step) { + let stepPos = start; + while (stepPos > -1 && stepPos < text.length) { + const char = text[stepPos]; + if (char === " " || char === "," || char === ":") { + return { + position: step === 1 ? stepPos : stepPos - step, + clipped: stepPos > 1 && stepPos < text.length, + }; + } + stepPos = stepPos + step; + } + + return { + position: stepPos - step, + clipped: false, + }; +} + +// removes highlighting as implemented by the mark tag +function clearHighlight(searchterm, el) { + const childNodes = el.childNodes; + for (let i = childNodes.length - 1; i >= 0; i--) { + const node = childNodes[i]; + if (node.nodeType === Node.ELEMENT_NODE) { + if ( + node.tagName === "MARK" && + node.innerText.toLowerCase() === searchterm.toLowerCase() + ) { + el.replaceChild(document.createTextNode(node.innerText), node); + } else { + clearHighlight(searchterm, node); + } + } + } +} + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string +} + +// highlight matches +function highlight(term, el) { + const termRegex = new RegExp(term, "ig"); + const childNodes = el.childNodes; + + // walk back to front avoid mutating elements in front of us + for (let i = childNodes.length - 1; i >= 0; i--) { + const node = childNodes[i]; + + if (node.nodeType === Node.TEXT_NODE) { + // Search text nodes for text to highlight + const text = node.nodeValue; + + let startIndex = 0; + let matchIndex = text.search(termRegex); + if (matchIndex > -1) { + const markFragment = document.createDocumentFragment(); + while (matchIndex > -1) { + const prefix = text.slice(startIndex, matchIndex); + markFragment.appendChild(document.createTextNode(prefix)); + + const mark = document.createElement("mark"); + mark.appendChild( + document.createTextNode( + text.slice(matchIndex, matchIndex + term.length) + ) + ); + markFragment.appendChild(mark); + + startIndex = matchIndex + term.length; + matchIndex = text.slice(startIndex).search(new RegExp(term, "ig")); + if (matchIndex > -1) { + matchIndex = startIndex + matchIndex; + } + } + if (startIndex < text.length) { + markFragment.appendChild( + document.createTextNode(text.slice(startIndex, text.length)) + ); + } + + el.replaceChild(markFragment, node); + } + } else if (node.nodeType === Node.ELEMENT_NODE) { + // recurse through elements + highlight(term, node); + } + } +} + +/* Link Handling */ +// get the offset from this page for a given site root relative url +function offsetURL(url) { + var offset = getMeta("quarto:offset"); + return offset ? offset + url : url; +} + +// read a meta tag value +function getMeta(metaName) { + var metas = window.document.getElementsByTagName("meta"); + for (let i = 0; i < metas.length; i++) { + if (metas[i].getAttribute("name") === metaName) { + return metas[i].getAttribute("content"); + } + } + return ""; +} + +function algoliaSearch(query, limit, algoliaOptions) { + const { getAlgoliaResults } = window["@algolia/autocomplete-preset-algolia"]; + + const applicationId = algoliaOptions["application-id"]; + const searchOnlyApiKey = algoliaOptions["search-only-api-key"]; + const indexName = algoliaOptions["index-name"]; + const indexFields = algoliaOptions["index-fields"]; + const searchClient = window.algoliasearch(applicationId, searchOnlyApiKey); + const searchParams = algoliaOptions["params"]; + const searchAnalytics = !!algoliaOptions["analytics-events"]; + + return getAlgoliaResults({ + searchClient, + queries: [ + { + indexName: indexName, + query, + params: { + hitsPerPage: limit, + clickAnalytics: searchAnalytics, + ...searchParams, + }, + }, + ], + transformResponse: (response) => { + if (!indexFields) { + return response.hits.map((hit) => { + return hit.map((item) => { + return { + ...item, + text: highlightMatch(query, item.text), + }; + }); + }); + } else { + const remappedHits = response.hits.map((hit) => { + return hit.map((item) => { + const newItem = { ...item }; + ["href", "section", "title", "text", "crumbs"].forEach( + (keyName) => { + const mappedName = indexFields[keyName]; + if ( + mappedName && + item[mappedName] !== undefined && + mappedName !== keyName + ) { + newItem[keyName] = item[mappedName]; + delete newItem[mappedName]; + } + } + ); + newItem.text = highlightMatch(query, newItem.text); + return newItem; + }); + }); + return remappedHits; + } + }, + }); +} + +let subSearchTerm = undefined; +let subSearchFuse = undefined; +const kFuseMaxWait = 125; + +async function fuseSearch(query, fuse, fuseOptions) { + let index = fuse; + // Fuse.js using the Bitap algorithm for text matching which runs in + // O(nm) time (no matter the structure of the text). In our case this + // means that long search terms mixed with large index gets very slow + // + // This injects a subIndex that will be used once the terms get long enough + // Usually making this subindex is cheap since there will typically be + // a subset of results matching the existing query + if (subSearchFuse !== undefined && query.startsWith(subSearchTerm)) { + // Use the existing subSearchFuse + index = subSearchFuse; + } else if (subSearchFuse !== undefined) { + // The term changed, discard the existing fuse + subSearchFuse = undefined; + subSearchTerm = undefined; + } + + // Search using the active fuse + const then = performance.now(); + const resultsRaw = await index.search(query, fuseOptions); + const now = performance.now(); + + const results = resultsRaw.map((result) => { + const addParam = (url, name, value) => { + const anchorParts = url.split("#"); + const baseUrl = anchorParts[0]; + const sep = baseUrl.search("\\?") > 0 ? "&" : "?"; + anchorParts[0] = baseUrl + sep + name + "=" + value; + return anchorParts.join("#"); + }; + + return { + title: result.item.title, + section: result.item.section, + href: addParam(result.item.href, kQueryArg, query), + text: highlightMatch(query, result.item.text), + crumbs: result.item.crumbs, + }; + }); + + // If we don't have a subfuse and the query is long enough, go ahead + // and create a subfuse to use for subsequent queries + if ( + now - then > kFuseMaxWait && + subSearchFuse === undefined && + resultsRaw.length < fuseOptions.limit + ) { + subSearchTerm = query; + subSearchFuse = new window.Fuse([], kFuseIndexOptions); + resultsRaw.forEach((rr) => { + subSearchFuse.add(rr.item); + }); + } + return results; +} diff --git a/blog/docs/styles.css b/blog/docs/styles.css new file mode 100644 index 0000000..2ddf50c --- /dev/null +++ b/blog/docs/styles.css @@ -0,0 +1 @@ +/* css styles */ diff --git a/blog/index.qmd b/blog/index.qmd new file mode 100644 index 0000000..d690afc --- /dev/null +++ b/blog/index.qmd @@ -0,0 +1,18 @@ +--- +# title: "OpenML Blog" +listing: + contents: posts + sort: "date desc" + type: default + categories: true + sort-ui: true + filter-ui: false +page-layout: full +title-block-banner: true +--- + + +# Welcome to the Open Machine Learning blog +This blog brings you stories about OpenML: why we want to streamline machine learning research, how you can use it, and what we are doing. +We are also open to [your stories](https://github.com/openml/blog#how-to-contribute) about anything related to open machine learning research, education, and applications. +Join the conversation :). diff --git a/blog/openml-logo.png b/blog/openml-logo.png new file mode 100644 index 0000000..904e91a Binary files /dev/null and b/blog/openml-logo.png differ diff --git a/blog/posts/2016-05-02-OpenML/2016-05-02-OpenML.qmd b/blog/posts/2016-05-02-OpenML/2016-05-02-OpenML.qmd new file mode 100644 index 0000000..b976414 --- /dev/null +++ b/blog/posts/2016-05-02-OpenML/2016-05-02-OpenML.qmd @@ -0,0 +1,73 @@ +--- +toc: true +layout: post +description: Introduction to OpenML +date: 2016-05-02 +categories: [OpenML] +title: OpenML +image: openml-logo.png +author: Heidi Seibold +--- + + +[OpenML](http://www.openml.org/) is a very cool new online platform that aims at improving — as the name says — Open Machine Learning. It stands for Open Data, Open Algorithms and Open Research. OpenML is still in it’s beta phase, but already pretty awesome. + +With this blog post I would like to introduce the main concepts, show who should be interested in the platform and I will go a little into a challenge it faces. + +# Concepts + +The following four concepts form the basis of the platform: + +- data + +- task + +- flow + +- run + +The figure shows how they are connected. + +![](https://cdn-images-1.medium.com/max/1916/0*ZFQLih5r09Vd8bg3.png) + +# Who can make use of OpenML? + +#### The domain scientist + +You have data that you do not know how to analyse best? Upload your data to OpenML and you will have the whole world helping you. Write a good data and task description to make sure people understand the problem. + +#### The data analyst + +You like taking part in challenges? Being the best solver of a task? Go to OpenML and check out the many tasks and go solve! + +#### The algorithm developer + +You developed a statistical method or a machine learning algorithm and want to try it out? You will find plenty of data sets and the possibility to make your algorithm public. + +#### The student + +You study statistics, data science, machine learning? You want to know what is out there? On OpenML you will find a wide variety of algorithms and, if the solvers do a good job, info on software and implementation. + +#### The teacher + +You teach a machine learning class and want the students to participate in a challenge? Make up your own task and let the students try solving it. The platform shows who uploaded what and when. + +#### The unknown + +There are possibly many other people who will benefit from the platform, like meta analysts, benchmarkers and people I can not think of right now. + +# How to use OpenML + +Other than just browsing the website you can access OpenML through quite some interfaces such as [R](http://www.openml.org/guide#!r) or [WEKA](http://www.openml.org/guide#!plugin_weka). For an example on how to use the R interface check out the [tutorial](http://openml.github.io/openml-r/vignettes/OpenML.html). + +The whole project is of course open source. Check out the different [git repositories](https://github.com/openml) for all the code and in case you have any complaints. + +# The overfitting problem + +Platforms like [kaggle](https://www.kaggle.com/), [crowdanalytics](https://www.crowdanalytix.com/) and [innocentive](https://www.innocentive.com/) host challenges and give people only part of the data so they can evaluate the performance of the algorithm on a separate data set to (try to) prevent overfitting. So far OpenML does not do that. It always shows all the data, and algorithms are evaluated via resampling procedures (on OpenML called estimation procedures). There are big discussions about how to solve the problem of overfitting on OpenML. They go from keeping part of the data hidden for a certain time in the beginning to doing repeated cross-validation on the (overly) good performing flows on a given task. If you have ideas here, please don’t hesitate to leave me a comment. + +The platform is still in it’s childhood and may not be perfect yet (If you find issues, post them on the [github page](https://github.com/openml)). But I think it can grow to be a great thing one day. + +--- + +_Originally published at [heidiseibold.github.io](http://heidiseibold.github.io/2016/05/02/OpenML/) on May 2, 2016._ diff --git a/blog/posts/2016-05-02-OpenML/openml-logo.png b/blog/posts/2016-05-02-OpenML/openml-logo.png new file mode 100644 index 0000000..904e91a Binary files /dev/null and b/blog/posts/2016-05-02-OpenML/openml-logo.png differ diff --git a/blog/posts/2016-09-18-mlr-loves-OpenML/2016-09-18-mlr-loves-OpenML.qmd b/blog/posts/2016-09-18-mlr-loves-OpenML/2016-09-18-mlr-loves-OpenML.qmd new file mode 100644 index 0000000..499d2ab --- /dev/null +++ b/blog/posts/2016-09-18-mlr-loves-OpenML/2016-09-18-mlr-loves-OpenML.qmd @@ -0,0 +1,109 @@ +--- +toc: true +layout: post +description: OpenML with mlr +categories: [OpenML, mlr, R] +title: mlr loves OpenML +image: mlropenml.png +author: Heidi Seibold +date : 2016-09-18 +--- + +[OpenML](http://www.openml.org/) stands for Open Machine Learning and is an online platform, which aims at supporting collaborative machine learning online. It is an Open Science project that allows its users to share data, code and machine learning experiments. + +At the time of writing this blog post I am in Eindhoven at an [OpenML workshop](http://openml2016dev.openml.org/), where developers and scientists meet to work on improving the project. Some of these people are R users and they (we) are developing an [R package](https://github.com/openml/openml-r) that communicates with the OpenML platform. + +![](https://cdn-images-1.medium.com/max/2322/0*zOdJK4jpz2f6u0rW.png) + +# OpenML in R + +The OpenML R package can list and download data sets and machine learning tasks (prediction challenges). In R one can run algorithms on the these data sets/tasks and then upload the results to OpenML. After successful uploading, the website shows how well the algorithm performs. To run the algorithm on a given task the OpenML R package builds on the [mlr](https://github.com/mlr-org/mlr) package. mlr understands what a task is and can run learners on that task. So all the OpenML package needs to do is convert the OpenML objects to objects mlr understands and then mlr deals with the learning. + +# A small case study + +We want to create a little study on the [OpenML website](http://www.openml.org/), in which we compare different types of Support Vector Machines. The study gets an ID assigned to it, which in our case is 27. We use the function ksvm (with different settings of the function argument type) from package kernlab, which is integrated in mlr (“classif.ksvm”). + +![](https://cdn-images-1.medium.com/max/1836/0*Z-s6eXOPyynmd_dW.png) + +For details on installing and setting up the OpenML R package please see the [guide](https://github.com/openml/openml-r) on GitHub. + +Let’s start conducting the study: + +- Load the packages and list all tasks which have between 100 and 500 observations. + +``` +library("OpenML") library("mlr") library("farff") library("BBmisc") + +dsize = c(100, 500) taskinfo_all = listOMLTasks(number.of.instances = dsize) +``` + +- Select all supervised classification tasks that do 10-fold cross-validation and choose only one task per data set. To keep the study simple and fast to compute, select only the first three tasks. + +``` +taskinfo_10cv = subset(taskinfo_all, + task.type == "Supervised Classification" & + estimation.procedure == "10-fold Crossvalidation" & + evaluation.measures == "predictive_accuracy" & + number.of.missing.values == 0 & + number.of.classes %in% c(2, 4)) + +taskinfo = taskinfo_10cv[1:3, ] +``` + +- Create the learners we want to compare. + +``` +lrn.list = list( + makeLearner("classif.ksvm", type = "C-svc"), + makeLearner("classif.ksvm", type = "kbb-svc"), + makeLearner("classif.ksvm", type = "spoc-svc") +) +``` + +- Run the learners on the three tasks. + +``` +grid = expand.grid(task.id = taskinfo$task.id, + lrn.ind = seq_along(lrn.list)) + +runs = lapply(seq_row(grid), function(i) { + message(i) + task = getOMLTask(grid$task.id[i]) + ind = grid$lrn.ind[i] + runTaskMlr(task, lrn.list[[ind]]) +}) +``` + +- And finally upload the runs to OpenML. The upload function (uploadOMLRun) returns the ID of the uploaded run object. When uploading runs that are part of a certain study, tag it with study\_ and the study ID. After uploading the runs appear on the website and can be found using the tag or via the [study homepage](http://www.openml.org/index.php/s/27). + +``` +## please do not spam the OpenML server by uploading these +## tasks. I already did that. +run.id = lapply(runs, uploadOMLRun, tags = "study_27") +``` + +- To show the results of our study, list the run evaluations and make a nice plot. + +``` +evals = listOMLRunEvaluations(tag = "study_27") + +evals$task.id = as.factor(evals$task.id) +evals$setup.id = as.factor(evals$setup.id) + +library("ggplot2") +ggplot(evals, aes(x = setup.id, y = predictive.accuracy, + color = data.name, group = task.id)) + + geom_point() + geom_line() +``` + +![](https://cdn-images-1.medium.com/max/1008/1*Xdv2inbezSO9MVu9FJ2-qw.png) + +Now you can go ahead and create a bigger study using the techniques you have learned. + +# Further infos + +If you are interested in more, check out the OpenML [blog](https://medium.com/open-machine-learning), the [paper](https://www.researchgate.net/publication/263890323_OpenML_Networked_science_in_machine_learning) and the [GitHub repos](https://github.com/openml). + +--- + +_Originally published at [mlr-org.github.io](http://mlr-org.github.io/mlr-loves-OpenML/)._ diff --git a/blog/posts/2016-09-18-mlr-loves-OpenML/mlropenml.png b/blog/posts/2016-09-18-mlr-loves-OpenML/mlropenml.png new file mode 100644 index 0000000..71a8ee7 Binary files /dev/null and b/blog/posts/2016-09-18-mlr-loves-OpenML/mlropenml.png differ diff --git a/blog/posts/2017-03-03-Basic-components-of-OpenML/2017-03-03-Basic-components-of-OpenML.qmd b/blog/posts/2017-03-03-Basic-components-of-OpenML/2017-03-03-Basic-components-of-OpenML.qmd new file mode 100644 index 0000000..a746b43 --- /dev/null +++ b/blog/posts/2017-03-03-Basic-components-of-OpenML/2017-03-03-Basic-components-of-OpenML.qmd @@ -0,0 +1,65 @@ +--- +toc: true +layout: post +description: Understanding the building blocks of OpenML +categories: [OpenML] +title: Basic components of OpenML +author: Jan van Rijn +date : 2017-03-03 +--- + +During my PhD, we developed OpenML, an online experiment database for Machine Learning. Researchers are encouraged to upload their experimental results on it, so that these can be reused by anyone. Various high level papers have been published that overview the design goals, benefits and opportunities (for example, at [ECML/PKDD 2013](http://link.springer.com/chapter/10.1007%2F978-3-642-40994-3_46), [SIGKDD Explorations](http://dl.acm.org/citation.cfm?id=2641198) and [JLMR](http://www.jmlr.org/proceedings/papers/v41/vanschoren15.html)). However, there is no clear overview of the basic components upon which the platform is build. In this blog post I will review these, and discuss some best practises. + +# Data + +One of the core components of OpenML are datasets. People can upload their datasets, and the system automatically organises these on line. An example of a dataset is the well-known [Iris dataset](http://www.openml.org/d/61). It shows all features, once of these is identified as the ‘default target attribute’, although this concept is flexible. It also shows some automatically computed data qualities (or, meta-features). Each dataset has it’s own unique ID. Information about the dataset, the data features and the data qualities can be obtained automatically by means of the following API functions: + +- [Get all available datasets](http://www.openml.org/api_docs/#!/data/get_data_list) + +- [Get dataset](http://www.openml.org/api_docs/#!/data/get_data_id) (required the data id) + +- [Get data features](http://www.openml.org/api_docs/#!/data/get_data_features_id) (requires the data id) + +- [Get data qualities](http://www.openml.org/api_docs/#!/data/get_data_qualities_id) (requires the data id) + +# Task types and tasks + +A dataset alone does not constitute a scientific task. We must first agree on what types of results are expected to be shared. This is expressed in task types: they define what types of inputs are given, which types of output are expected to be returned, and what protocols should be used. For instance, classification tasks should include well-defined cross-validation procedures, labelled input data, and require predictions as outputs. The collection of all this information together is called a task. The Iris dataset has various tasks defined on it, [for example this one](http://www.openml.org/t/59). Although the web-interface does not show it, this task formally describes the target attribute that should be modelled (in this case the same as the default target attribute of the dataset, but this is flexible), the quality estimation procedure (10-fold cross-validation), the evaluation measure (predictive accuracy) and the cross-validation folds. Useful API operations include: + +- [Get all available tasks](http://www.openml.org/api_docs/#!/task/get_task_list) + +- [Get all available tasks of a given type](http://www.openml.org/api_docs/#!/task/get_task_list_type_id) (e.g. get all Classification tasks, requires the id of the task type) + +- [Get the details of a task](http://www.openml.org/api_docs/#!/task/get_task_id) (requires task id) + +Currently, there are a wide range of task types defined on OpenML, including classification, regression, on line learning, clustering and subgroup discovery. Although this set can be extended, this is currently not a supported API operation (meaning that we will add them by hand). If you interested in task types that are currently not supported, please contact us. + +# Flows + +Tasks can be ‘solved’ by classifiers (or algorithms, workflows, flows). OpenML stores references to these flows. It is important to stress that flows are actually ran on the computer of the user, only meta-information about the flow is stored on OpenML. This information includes basic trivialities such as the creator, toolbox and compilation instructions, but also more formal description about hyper parameter. A flow can also contain subflows, for example, the flow Bagging can have a subflow ‘Decision Tree’ which would make the flow ‘Bagging of Decision Trees’. A flow is distinguished by it’s name and ‘external version’, which are both provided by the uploader. When uploading a flow, it is important to think about a good naming convention for the both, for example, the git commit number could be used as external version, as this uniquely identifies a state of the code. Ideally, when two persons are using the same flow, they will use the same name and external version, so that results of the flows can be compared across tasks. (This is ensured when using the toolboxed in which OpenML is integrated, such as Weka, Scikit Learn and MLR). Useful API functions are: + +- [List all flows](http://www.openml.org/api_docs/#!/flow/get_flow_list) + +- [List all my flows](http://www.openml.org/api_docs/#!/flow/get_flow_owned) + +- [Give details about a given flow ](http://www.openml.org/api_docs/#!/flow/get_flow_id)(requires flow id) + +# Runs + +Whenever a flow executes a task, this is called a run. The existence of runs is actually the main contribution of OpenML. Some experiments take weeks to complete, and having the results stored on OpenML helps other researchers resuse the experiments. The task description specifies which information should be uploaded in order to have a valid run, in most cases, for each cross-validation fold the predictions on the test set. This allows OpenML to calculate basic evaluation measures, such as predictive accuracy, ROC curves and many more. Also information about the flow and hyper parameter settings should be provided. Some useful API functions: + +- [List all runs performed on a given task](http://www.openml.org/api_docs/#!/run/get_run_list_task_ids) (requires task id, e.g., the iris task is 59) + +- [Compare two flows on all tasks](http://www.openml.org/api_docs/#!/run/get_run_list_filters) (requires a comma separated list of flow ids, e.g., 1720, 1721 for comparing k-nn with a decision tree) + +- And many more … + +Usually, the result is in some XML or JSON format (depending on the preference of the user), linking together various task ids, flow ids, etc. In order for this to become meaningful, the user needs to perform other API tasks to get information about what flows were executed, what tasks and datasets were used, etc. Details about this will be provided in another post. + +# Setups + +Every run that is executed by a flow, contains information about the hyper parameter settings of the flow. A setup is the combination of all parameter settings of a given flow. OpenML internally links the result of a given run to a setup id. This way, experiments can be done across hyper parameter settings. For example, + +- [Compare two setups on all tasks](http://www.openml.org/api_docs/#!/run/get_run_list_filters) (requires a comma separated list of setup ids, e.g., 8994, 8995, 8996 for comparing multiple MLP configurations) + +As setups constitute a complex concept, most of the operations concerning setups are hidden from the user. Hence, not all setup functions are properly documented yet. A later blogpost will detail on these. diff --git a/blog/posts/2019-10-24-OpenML-workshop-at-Dagstuhl/2019-10-24-OpenML-workshop-at-Dagstuhl.qmd b/blog/posts/2019-10-24-OpenML-workshop-at-Dagstuhl/2019-10-24-OpenML-workshop-at-Dagstuhl.qmd new file mode 100644 index 0000000..d0cae5e --- /dev/null +++ b/blog/posts/2019-10-24-OpenML-workshop-at-Dagstuhl/2019-10-24-OpenML-workshop-at-Dagstuhl.qmd @@ -0,0 +1,121 @@ +--- +toc: true +layout: post +description: OpenML workshop at Dagstuhl +categories: [OpenML] +title: OpenML workshop at Dagstuhl +image: dagstuhl.jpeg +author: Heidi Seibold +date : 2019-10-24 +--- + +**October 2019** + +Twice a year the [OpenML](https://www.openml.org/) community meets for a [workshop/hackathon/unconference](http://meet.openml.org/). We improve the platform, discuss and learn for 5 days. If that sounds interesting to you, [get in touch](https://www.openml.org/contact) or follow updates on [meet.openml.org](http://meet.openml.org/). + +This time the workshop took place at [Dagstuhl](https://www.dagstuhl.de/19423), a great place for Seminars. + +![](https://cdn-images-1.medium.com/max/10944/1*eKnX3C1VLe5xx7qj0IyBtg.jpeg) + +![Group pictures](https://cdn-images-1.medium.com/max/10944/1*7ePW9vZ5IU1r40kR9aWHsA.jpeg) + +We had several breakouts where workshop attendees can join to learn, discuss and progress OpenML. In the following we discuss some of the topics we touched. + +**Science projects** + +Brainstorm on scientific projects to do with OpenML. Prioritize impactful, well-defined research ideas. +We came up with quite a long list of very promising research questions that should actually be quite easy to answer based on OpenML. Many of these are along the lines of empirically providing evidence to verify or bust commonly-held beliefs in the community. Frank would gladly hire a strong postdoc (or quite independent PhD student) and maybe a research engineer, to work on these scientific questions under the umbrella of “evidence-based machine learning with OpenML”. + +**Benchmarking using OpenML** + +Define guidelines on how to define world-class benchmarks and how to run them. + +**Diverse datasets** + +New and more diverse datasets. + +**Dataset quality** + +How to measure data quality and how to improve the quality of datasets on OpenML. + +**OpenML use cases for novices** + +Shortlist common use cases and start writing accessible blog posts for novice users. If you are a OpenML newbie we need your help with this topic. + +The output of this breakout will be at least one blog post. Keep an eye out for them here :) + +**Running a competition using OpenML** + +We assessed the current issues with running in-class competitions for teaching purposes using OpenML (biggest one: easy use for non-developers) and brainstormed on a new competition format with related competitions, one for each component of a solution, such as HPO, creating good meta-features, creating a good search space, etc. + +**Planning future workshops** + +Decide on location and timing for the next couple of workshops. The next OpenML workshop will be in Spring (week of March 30th or week of April 14th) close to Munich. For updates check [http://meet.openml.org](http://meet.openml.org/). The workshop will be cohosted with some other Open Source Machine Learning projects. + +Furthermore a workshop in Austin is being planned for next summer and a datathon is in planning. We are planning to organize dev sprints at various PyCons next year. + +**New frontend** + +Feedback session on new frontend, Additional visualization for datasets + +**Future of client APIs** + +Currently, a lot of resources are bound developing different client APIs, such as the [Python API](https://openml.github.io/openml-python/master/), [R API](https://github.com/openml/openml-r) and [Java API](https://github.com/openml/openml-java). We discussed how we can better share work and code between the different APIs and the server. For now we are working on automatically generating the [Swagger API](https://www.openml.org/api_docs#!/data/get_data_id) documentation from the PHP function documentation, which in turn will allow us to generate (documented) parts of the APIs, reduce the need for maintenance and will help to spread updates on the API faster. + +**Flow 2.0 design** + +Current flow design used in OpenML was inspired by Weka, but through time many limitations have been identified, primarily that existing flow does not allow duplicate use of same component and that it cannot express DAG-based ML programs. We started working on a new [specification](https://github.com/openml/flow2) building on insights from mlr3 and d3m projects, centered around DAG representation. Current plan is to prepare a draft specification and implement prototype converters between other systems and this new specification. Once we do that we will re-evaluate the amount of work it took to build those prototypes and how well the specification satisfied those other systems. + +**Random Bot** + +The LRZ in Munich provided us with CPU time during the SuperMUC-NG supercomputer test phase, which we used to perform experiments of popular machine learning algorithms with random hyperparameter configurations. This resulted in millions of data points on more than a hundred datasets that we will analyse and publish. The data can be used to learn about typical behaviour of different learners across different datasets, and to construct surrogate models for tuning algorithm benchmarks. + +**AutoML Benchmark (Janek)** + +A study was created containing 76 binary and multiclass tasks of reasonable difficulty. + +These can be used as a more difficult version of OpenML-100 or in [amlb](https://github.com/openml/automlbenchmark) a platform for reproducible benchmarking of AutoML systems. + +**R API** + +Short session on how the R api will (need to) change. The main issue discussed was that the OpenML R package runs with mlr and breaks when the new package (mlr3) is loaded. We will update the current OpenML R package to work with mlr3. At the same time we are thinking about a vision for a rewrite of the OpenML R package. + +**Python API** + +We made a lot of improvements to the Python API over the week, with over 20 PRs merged! We’ve added more examples on how to use the package, fixed bugs, improved documentation and refactored code. In the coming days we’re going to make all these improvements available in a new PyPI release. For those looking for a higher level overview of the package, we will publish a paper next week which highlights use-cases, its software design, and project structure. + +**Benchmarking paper** + +We are working on a comprehensive paper using sklearn, mlr and WEKA, which should demonstrate how OpenML can be used for proper benchmarking and analysis. + +**Guidelines / Overfitting / Comparable Metalearning** + +There are plans for writing a guidelines and pitfalls paper on benchmarking, meta-overfitting and statistical analysis of results on OpenML. + +**Data Formats** + +Currently OpenML supports only tabular data in ARFF data format. This is very limiting for many ML tasks. We discussed and explored other data formats we could use as the future next data format. We will post a separate blog post about our process and insights. + +**Funding** + +OpenML is looking for funding (developers). New ideas on obtaining funding are very welcome. We discussed some ideas: American funding (we need a collaboration partner); ALICE / CLAIRE; Companies. We are a foundation now, which might make it easier. + +Some of the PIs (in particular Bernd Bischl, Frank Hutter and Dawn Song) in the project offer positions with a mix of ML research and development. Contact them if you are interested! + +![](https://cdn-images-1.medium.com/max/1786/1*xoWqGuds3vKIbfDIVlURbA.jpeg) + +![Sketch of the OpenML infrastructure (left), Breakout overview of Tuesday (right)](https://cdn-images-1.medium.com/max/8536/1*zhu6XhdnubALaaCsVYA_Kg.jpeg) + +We had some talks at the workshop as well: + +- **Mitar Milutinovic**: [A short introduction to Data Driven Discovery (D3M)](https://mitar.gitlab.io/d3m-short-introduction-slides/#/) + +- **Yiwen Zhu and Markus Weimer**: Large-scale analysis of Jupyter notebooks + +- **Martin Binder, Michel Lang, Florian Pfisterer, Bernd Bischl**: [Pipelining with mlr3](https://github.com/mlr-org/mlr-outreach/blob/master/2019_dagstuhl/mlr3pipelines.pdf) + +… and lots of fun… + +![On the hike](https://cdn-images-1.medium.com/max/6048/1*50jB3NV1dg00lZXtU4wZVg.jpeg) + +Wanna join the OpenML community? [Get in touch](https://www.openml.org/contact)! diff --git a/blog/posts/2019-10-24-OpenML-workshop-at-Dagstuhl/dagstuhl.jpeg b/blog/posts/2019-10-24-OpenML-workshop-at-Dagstuhl/dagstuhl.jpeg new file mode 100644 index 0000000..daed7e1 Binary files /dev/null and b/blog/posts/2019-10-24-OpenML-workshop-at-Dagstuhl/dagstuhl.jpeg differ diff --git a/blog/posts/2019-10-26-OpenML-Machine-Learning-as-a-community/2019-10-26-OpenML-Machine-Learning-as-a-community.ipynb b/blog/posts/2019-10-26-OpenML-Machine-Learning-as-a-community/2019-10-26-OpenML-Machine-Learning-as-a-community.ipynb new file mode 100644 index 0000000..2991cf0 --- /dev/null +++ b/blog/posts/2019-10-26-OpenML-Machine-Learning-as-a-community/2019-10-26-OpenML-Machine-Learning-as-a-community.ipynb @@ -0,0 +1,2706 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "toc: true\n", + "title: OpenML - Machine Learning as a community\n", + "description: A description of how OpenML fits into traditional ML practices\n", + "badges: true\n", + "categories: [OpenML]\n", + "image: openml.png\n", + "author: Neeratyoy Mallik\n", + "date: 2019-10-26\n", + "---\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[OpenML](https://www.openml.org/) is an online Machine Learning (ML) experiments database accessible to everyone for free. The core idea is to have a single repository of datasets and results of ML experiments on them. Despite having gained a lot of popularity in recent years, with a plethora of tools now available, the numerous ML experimentations continue to happen in silos and not necessarily as one whole shared community.\n", + "In this post, we shall try to get a brief glimpse of what OpenML offers and how it can fit our current Machine Learning practices.\n", + "\n", + "Let us jump straight at getting our hands dirty by building a simple machine learning model. If it is simplicity we are looking for, it has to be the Iris dataset that we shall work with. In the example script below, we are going to load the Iris dataset available with scikit-learn, use 10-fold cross-validation to evaluate a Random Forest of 10 trees. Sounds trivial enough and is indeed less than 10 lines of code." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn import datasets\n", + "from sklearn.svm import SVC\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.model_selection import cross_val_score" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(150, 4) (150,)\n" + ] + } + ], + "source": [ + "# Loading Iris dataset\n", + "X, y = datasets.load_iris(return_X_y=True)\n", + "print(X.shape, y.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Initializing a Random Forest with \n", + "# arbitrary hyperparameters\n", + "# max_depth kept as 2 since Iris has\n", + "# only 4 features\n", + "clf = RandomForestClassifier(n_estimators=10, max_depth=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mean score : 0.94000\n" + ] + } + ], + "source": [ + "scores = cross_val_score(clf, X, y, cv=5, scoring='accuracy')\n", + "print(\"Mean score : {:.5f}\".format(scores.mean()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A simple script and we achieve a mean accuracy of **95.33%**. That was easy. It is really amazing how far we have come with ML tools that make it easy to get started. As a result, we have hundreds of thousands of people working with these tools every day. That inevitably leads to the reinvention of the wheel. The tasks that each individual ML practitioner performs often have significant overlaps and can be omitted by reusing what someone from the community has done already. At the end of the day, we didn't build a Random Forest model all the way from scratch. We gladly reused code written by generous folks from the community. The special attribute of our species is the ability to work as a collective wherein our combined intellect becomes larger than the individual sum of parts. Why not do the same for ML? I mean, can I see what other ML practitioners have done to get better scores on the Iris dataset?\n", + "\n", + "Answering this is one of the targets of this post. We shall subsequently explore if this can be done, with the help of [OpenML](https://www.openml.org/). However, first, we shall briefly familiarize ourselves with few terminologies and see how we can split the earlier example we saw into modular components." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### OpenML Components" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](openml.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Image source: https://medium.com/open-machine-learning/openml-1e0d43f0ae13" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Dataset**: OpenML houses over 2k+ active datasets for various regression, classification, clustering, survival analysis, stream processing tasks and more. Any user can upload a dataset. Once uploaded, the server computes certain meta-features on the dataset - *Number of classes*, *Number of missing values*, *Number of features*, etc. With respect to our earlier example, the following line is the equivalent of fetching a dataset from OpenML." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "X, y = datasets.load_iris(return_X_y=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Task**: A task is linked to a specific dataset, defining what the target/dependent variable is. Also specifies evaluation measures such as - accuracy, precision, area under curve, etc. or the kind of estimation procedure to be used such as - 10-fold *cross-validation*, n% holdout set, etc. With respect to our earlier example, the *parameters* to the following function call capture the idea of a task." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "scores = cross_val_score(clf, X, y, cv=5, scoring='accuracy')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Flow**: Describes the kind of modelling to be performed. It could be a flow or a series of steps, i.e., a scikit-learn pipeline. For now, we have used a simple Random Forest model which is the *flow* component here." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "clf = RandomForestClassifier(n_estimators=10, max_depth=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Run**: Pairs a *flow* and task together which results in a *run*. The *run* has the predictions which are turned into *evaluations* by the server. This is effectively captured by the *execution* of the line:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "scores = cross_val_score(clf, X, y, cv=5, scoring='accuracy')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, this may appear a little obfuscating given that we are trying to compartmentalize a simple 10-line code which works just fine. However, if we take a few seconds to go through the 4 components explained above, we can see that it makes our *training of a Random Forest* on Iris a series of modular tasks. Modules are such a fundamental concept in Computer Science. They are like Lego blocks. Once we have modules, it means we can plug and play at ease. The code snippet below attempts to rewrite the earlier example using the ideas of the OpenML components described, to give a glimpse of what we can potentially gain during experimentations." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn import datasets\n", + "from sklearn.svm import SVC\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.model_selection import cross_val_score" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### DATASET component" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# To load IRIS dataset as a dataset module/component\n", + "def dataset():\n", + " X, y = datasets.load_iris(return_X_y=True)\n", + " return X, y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### TASK component" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Tasks here define the number of cross-validation folds\n", + "# and the scoring metric to be used for evaluation\n", + "def task_1(f):\n", + " X, y = dataset() # loads IRIS\n", + " return cross_val_score(f, X, y, cv=5, \n", + " scoring='accuracy')\n", + "\n", + "def task_2(f):\n", + " X, y = dataset() # loads IRIS\n", + " return cross_val_score(f, X, y, cv=15, \n", + " scoring='balanced_accuracy')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### FLOW component" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Flows determine the modelling technique to be applied\n", + "# Helps define a model irrespective of dataset or tasks\n", + "def flow_1():\n", + " clf = RandomForestClassifier(n_estimators=10, max_depth=2)\n", + " return clf\n", + "\n", + "def flow_2():\n", + " clf = SVC(gamma='auto', kernel='linear')\n", + " return clf " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### RUN component" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# Runs essentially evaluates a task-flow pairing \n", + "# and therefore in effect executs the modelling \n", + "# of a dataset as per the task task definition\n", + "def run(task, flow):\n", + " return task(flow)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RF using task 1: 0.95333; task 2: 0.94444\n", + "SVM using task 1: 0.98; task 2: 0.97222\n" + ] + } + ], + "source": [ + "# Results for Random Forest\n", + "rf_task_1 = run(task_1, flow_1())\n", + "rf_task_2 = run(task_2, flow_1())\n", + "print(\"RF using task 1: {:<.5}; task 2: {:<.5}\".format(rf_task_1.mean(), rf_task_2.mean()))\n", + "\n", + "# Results for SVM\n", + "svm_task_1 = run(task_1, flow_2())\n", + "svm_task_2 = run(task_2, flow_2())\n", + "print(\"SVM using task 1: {:<.5}; task 2: {:<.5}\".format(svm_task_1.mean(), svm_task_2.mean()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can, therefore, compose various different tasks, flows, which are independent operations. Runs can then pair any such task and flow to construct an ML *workflow* and return the evaluated scores. This approach can help us define such components one-time, and we can extend this for any combination of a dataset, model, and for any number of evaluations in the future. Imagine if the entire ML *community* defines such tasks and various simple to complicated flows that they use in their daily practice. We can build custom working ML pipeline and even get to compare performances of our techniques on the same *task* with others! OpenML aims exactly for that. In the next section of this post, we shall scratch the surface of OpenML to see if we can actually do with OpenML what it promises." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using OpenML" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenML-Python can be installed using *pip* or by [cloning the git repo](https://openml.github.io/openml-python/develop/contributing.html#installation) and installing the current development version. So shall we then install OpenML? ;) It will be beneficial if the code snippets are tried out as this post is read. A consolidated Jupyter notebook with all the code can be found [here](https://nbviewer.jupyter.org/github/Neeratyoy/openml-python/blob/blog/OpenML%20-%20Machine%20Learning%20as%20a%20community.ipynb).\n", + "\n", + "Now that we have OpenML, let us jump straight into figuring out how we can get the Iris dataset from there. We can always browse the[OpenML website](https://www.openml.org/) and search for Iris. That is the easy route. Let us get familiar with the programmatic approach and learn how to fish instead. The OpenML-Python API can be found [here](https://openml.github.io/openml-python/develop/api.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Retrieving Iris from OpenML" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the example below, we will list out all possible datasets available in OpenML. We can choose the output format. I'll go with *dataframe* so that we obtain a pandas DataFrame and can get a neat tabular representation to search and sort specific entries." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "import openml\n", + "\n", + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(3073, 16)\n", + "did\n", + "name\n", + "version\n", + "uploader\n", + "status\n", + "format\n", + "MajorityClassSize\n", + "MaxNominalAttDistinctValues\n", + "MinorityClassSize\n", + "NumberOfClasses\n", + "NumberOfFeatures\n", + "NumberOfInstances\n", + "NumberOfInstancesWithMissingValues\n", + "NumberOfMissingValues\n", + "NumberOfNumericFeatures\n", + "NumberOfSymbolicFeatures\n" + ] + } + ], + "source": [ + "# Fetching the list of all available datasets on OpenML\n", + "d = openml.datasets.list_datasets(output_format='dataframe')\n", + "print(d.shape)\n", + "\n", + "# Listing column names or attributes that OpenML offers\n", + "for name in d.columns:\n", + " print(name)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " did name version uploader status format MajorityClassSize \\\n", + "2 2 anneal 1 1 active ARFF 684.0 \n", + "3 3 kr-vs-kp 1 1 active ARFF 1669.0 \n", + "4 4 labor 1 1 active ARFF 37.0 \n", + "5 5 arrhythmia 1 1 active ARFF 245.0 \n", + "6 6 letter 1 1 active ARFF 813.0 \n", + "\n", + " MaxNominalAttDistinctValues MinorityClassSize NumberOfClasses \\\n", + "2 7.0 8.0 5.0 \n", + "3 3.0 1527.0 2.0 \n", + "4 3.0 20.0 2.0 \n", + "5 13.0 2.0 13.0 \n", + "6 26.0 734.0 26.0 \n", + "\n", + " NumberOfFeatures NumberOfInstances NumberOfInstancesWithMissingValues \\\n", + "2 39.0 898.0 898.0 \n", + "3 37.0 3196.0 0.0 \n", + "4 17.0 57.0 56.0 \n", + "5 280.0 452.0 384.0 \n", + "6 17.0 20000.0 0.0 \n", + "\n", + " NumberOfMissingValues NumberOfNumericFeatures NumberOfSymbolicFeatures \n", + "2 22175.0 6.0 33.0 \n", + "3 0.0 0.0 37.0 \n", + "4 326.0 8.0 9.0 \n", + "5 408.0 206.0 74.0 \n", + "6 0.0 16.0 1.0 \n" + ] + } + ], + "source": [ + "print(d.head())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The column names indicate that they contain the meta-information about each of the datasets, and at this instance, we have access to **2958** datasets as indicated by the shape of the dataframe. We shall try searching for 'iris' in the column *name* and also use the *version* column to sort the results." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    didnameversionuploaderstatusformatMajorityClassSizeMaxNominalAttDistinctValuesMinorityClassSizeNumberOfClassesNumberOfFeaturesNumberOfInstancesNumberOfInstancesWithMissingValuesNumberOfMissingValuesNumberOfNumericFeaturesNumberOfSymbolicFeatures
    6161iris11activeARFF50.03.050.03.05.0150.00.00.04.01.0
    4195041950iris_test_upload14030activeARFF50.03.050.03.05.0150.00.00.04.01.0
    4226142261iris-example1348activeARFF50.0NaN50.03.05.0150.00.00.04.01.0
    451451irish12activeARFF278.010.0222.02.06.0500.032.032.02.04.0
    969969iris32activeARFF100.02.050.02.05.0150.00.00.04.01.0
    \n", + "
    " + ], + "text/plain": [ + " did name version uploader status format \\\n", + "61 61 iris 1 1 active ARFF \n", + "41950 41950 iris_test_upload 1 4030 active ARFF \n", + "42261 42261 iris-example 1 348 active ARFF \n", + "451 451 irish 1 2 active ARFF \n", + "969 969 iris 3 2 active ARFF \n", + "\n", + " MajorityClassSize MaxNominalAttDistinctValues MinorityClassSize \\\n", + "61 50.0 3.0 50.0 \n", + "41950 50.0 3.0 50.0 \n", + "42261 50.0 NaN 50.0 \n", + "451 278.0 10.0 222.0 \n", + "969 100.0 2.0 50.0 \n", + "\n", + " NumberOfClasses NumberOfFeatures NumberOfInstances \\\n", + "61 3.0 5.0 150.0 \n", + "41950 3.0 5.0 150.0 \n", + "42261 3.0 5.0 150.0 \n", + "451 2.0 6.0 500.0 \n", + "969 2.0 5.0 150.0 \n", + "\n", + " NumberOfInstancesWithMissingValues NumberOfMissingValues \\\n", + "61 0.0 0.0 \n", + "41950 0.0 0.0 \n", + "42261 0.0 0.0 \n", + "451 32.0 32.0 \n", + "969 0.0 0.0 \n", + "\n", + " NumberOfNumericFeatures NumberOfSymbolicFeatures \n", + "61 4.0 1.0 \n", + "41950 4.0 1.0 \n", + "42261 4.0 1.0 \n", + "451 2.0 4.0 \n", + "969 4.0 1.0 " + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Filtering dataset list to have 'iris' in the 'name' column\n", + "# then sorting the list based on the 'version'\n", + "d[d['name'].str.contains('iris')].sort_values(by='version').head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Okay, so the iris dataset with the version as 1 has an ID of **61**. For verification, we can check the [website for dataset ID 61](https://www.openml.org/d/61). We can see that it is the original Iris dataset which is of interest to us - 3 classes of 50 instances, with 4 numeric features. However, we shall retrieve the same information, as promised, programmatically." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "OpenML Dataset\n", + "==============\n", + "Name..........: iris\n", + "Version.......: 1\n", + "Format........: ARFF\n", + "Upload Date...: 2014-04-06 23:23:39\n", + "Licence.......: Public\n", + "Download URL..: https://www.openml.org/data/v1/download/61/iris.arff\n", + "OpenML URL....: https://www.openml.org/d/61\n", + "# of features.: 5\n", + "# of instances: 150" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "iris = openml.datasets.get_dataset(61)\n", + "iris" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{0: [0 - sepallength (numeric)],\n", + " 1: [1 - sepalwidth (numeric)],\n", + " 2: [2 - petallength (numeric)],\n", + " 3: [3 - petalwidth (numeric)],\n", + " 4: [4 - class (nominal)]}" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "iris.features" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "**Author**: R.A. Fisher \n", + "**Source**: [UCI](https://archive.ics.uci.edu/ml/datasets/Iris) - 1936 - Donated by Michael Marshall \n", + "**Please cite**: \n", + "\n", + "**Iris Plants Database** \n", + "This is perhaps the best known database to be found in the pattern recognition literature. Fisher's paper is a classic in the field and is referenced frequently to this day. (See Duda & Hart, for example.) The data set contains 3 classes of 50 instances each, where each class refers to a type of iris plant. One class is linearly separable from the other 2; the latter are NOT linearly separable from each other.\n", + "\n", + "Predicted attribute: class of iris plant. \n", + "This is an exceedingly simple domain. \n", + " \n", + "### Attribute Information:\n", + " 1. sepal length in cm\n", + " 2. sepal width in cm\n", + " 3. petal length in cm\n", + " 4. petal width in cm\n", + " 5. class: \n", + " -- Iris Setosa\n", + " -- Iris Versicolour\n", + " -- Iris Virginica\n" + ] + } + ], + "source": [ + "print(iris.description)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the appropriate dataset available, let us briefly go back to the terminologies we discussed earlier. We have only used the *dataset* component so far. The *dataset* component is closely tied with the task component. To reiterate, the task would describe *how* the dataset will be used." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Retrieving relevant tasks from OpenML" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We shall firstly list all available tasks that work with the Iris dataset. However, we are only treating Iris as a supervised classification problem and hence will filter accordingly. Following which, we will collect only the task IDs of the tasks relevant to us." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    tidttiddidnametask_typestatusestimation_procedureevaluation_measuressource_datatarget_feature...NumberOfFeaturesNumberOfInstancesNumberOfInstancesWithMissingValuesNumberOfMissingValuesNumberOfNumericFeaturesNumberOfSymbolicFeaturesnumber_samplescost_matrixquality_measuretarget_value
    5959161irisSupervised Classificationactive10-fold Crossvalidationpredictive_accuracy61class...51500041NaNNaNNaNNaN
    118118361irisLearning Curveactive10 times 10-fold Learning Curvepredictive_accuracy61class...515000414NaNNaNNaN
    289289161irisSupervised Classificationactive33% Holdout setpredictive_accuracy61class...51500041NaNNaNNaNNaN
    17581758361irisLearning Curveactive10-fold Learning Curvepredictive_accuracy61class...515000414NaNNaNNaN
    18231823161irisSupervised Classificationactive5 times 2-fold Crossvalidationpredictive_accuracy61class...51500041NaNNaNNaNNaN
    \n", + "

    5 rows × 24 columns

    \n", + "
    " + ], + "text/plain": [ + " tid ttid did name task_type status \\\n", + "59 59 1 61 iris Supervised Classification active \n", + "118 118 3 61 iris Learning Curve active \n", + "289 289 1 61 iris Supervised Classification active \n", + "1758 1758 3 61 iris Learning Curve active \n", + "1823 1823 1 61 iris Supervised Classification active \n", + "\n", + " estimation_procedure evaluation_measures source_data \\\n", + "59 10-fold Crossvalidation predictive_accuracy 61 \n", + "118 10 times 10-fold Learning Curve predictive_accuracy 61 \n", + "289 33% Holdout set predictive_accuracy 61 \n", + "1758 10-fold Learning Curve predictive_accuracy 61 \n", + "1823 5 times 2-fold Crossvalidation predictive_accuracy 61 \n", + "\n", + " target_feature ... NumberOfFeatures NumberOfInstances \\\n", + "59 class ... 5 150 \n", + "118 class ... 5 150 \n", + "289 class ... 5 150 \n", + "1758 class ... 5 150 \n", + "1823 class ... 5 150 \n", + "\n", + " NumberOfInstancesWithMissingValues NumberOfMissingValues \\\n", + "59 0 0 \n", + "118 0 0 \n", + "289 0 0 \n", + "1758 0 0 \n", + "1823 0 0 \n", + "\n", + " NumberOfNumericFeatures NumberOfSymbolicFeatures number_samples \\\n", + "59 4 1 NaN \n", + "118 4 1 4 \n", + "289 4 1 NaN \n", + "1758 4 1 4 \n", + "1823 4 1 NaN \n", + "\n", + " cost_matrix quality_measure target_value \n", + "59 NaN NaN NaN \n", + "118 NaN NaN NaN \n", + "289 NaN NaN NaN \n", + "1758 NaN NaN NaN \n", + "1823 NaN NaN NaN \n", + "\n", + "[5 rows x 24 columns]" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = openml.tasks.list_tasks(data_id=61, output_format='dataframe')\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    tidttiddidnametask_typestatusestimation_procedureevaluation_measuressource_datatarget_feature...NumberOfFeaturesNumberOfInstancesNumberOfInstancesWithMissingValuesNumberOfMissingValuesNumberOfNumericFeaturesNumberOfSymbolicFeaturesnumber_samplescost_matrixquality_measuretarget_value
    5959161irisSupervised Classificationactive10-fold Crossvalidationpredictive_accuracy61class...51500041NaNNaNNaNNaN
    289289161irisSupervised Classificationactive33% Holdout setpredictive_accuracy61class...51500041NaNNaNNaNNaN
    18231823161irisSupervised Classificationactive5 times 2-fold Crossvalidationpredictive_accuracy61class...51500041NaNNaNNaNNaN
    19391939161irisSupervised Classificationactive10 times 10-fold Crossvalidationpredictive_accuracy61class...51500041NaNNaNNaNNaN
    19921992161irisSupervised ClassificationactiveLeave one outpredictive_accuracy61class...51500041NaNNaNNaNNaN
    \n", + "

    5 rows × 24 columns

    \n", + "
    " + ], + "text/plain": [ + " tid ttid did name task_type status \\\n", + "59 59 1 61 iris Supervised Classification active \n", + "289 289 1 61 iris Supervised Classification active \n", + "1823 1823 1 61 iris Supervised Classification active \n", + "1939 1939 1 61 iris Supervised Classification active \n", + "1992 1992 1 61 iris Supervised Classification active \n", + "\n", + " estimation_procedure evaluation_measures source_data \\\n", + "59 10-fold Crossvalidation predictive_accuracy 61 \n", + "289 33% Holdout set predictive_accuracy 61 \n", + "1823 5 times 2-fold Crossvalidation predictive_accuracy 61 \n", + "1939 10 times 10-fold Crossvalidation predictive_accuracy 61 \n", + "1992 Leave one out predictive_accuracy 61 \n", + "\n", + " target_feature ... NumberOfFeatures NumberOfInstances \\\n", + "59 class ... 5 150 \n", + "289 class ... 5 150 \n", + "1823 class ... 5 150 \n", + "1939 class ... 5 150 \n", + "1992 class ... 5 150 \n", + "\n", + " NumberOfInstancesWithMissingValues NumberOfMissingValues \\\n", + "59 0 0 \n", + "289 0 0 \n", + "1823 0 0 \n", + "1939 0 0 \n", + "1992 0 0 \n", + "\n", + " NumberOfNumericFeatures NumberOfSymbolicFeatures number_samples \\\n", + "59 4 1 NaN \n", + "289 4 1 NaN \n", + "1823 4 1 NaN \n", + "1939 4 1 NaN \n", + "1992 4 1 NaN \n", + "\n", + " cost_matrix quality_measure target_value \n", + "59 NaN NaN NaN \n", + "289 NaN NaN NaN \n", + "1823 NaN NaN NaN \n", + "1939 NaN NaN NaN \n", + "1992 NaN NaN NaN \n", + "\n", + "[5 rows x 24 columns]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Filtering only the Supervised Classification tasks on Iris\n", + "df.query(\"task_type=='Supervised Classification'\").head()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "13\n" + ] + } + ], + "source": [ + "# Collecting all relevant task_ids\n", + "tasks = df.query(\"task_type=='Supervised Classification'\")['tid'].to_numpy()\n", + "print(len(tasks))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That settles the *task* component too. Notice how for one *dataset* (61), we obtain 11 task IDs which are of interest to us. This should illustrate the *one-to-many* relationship that *dataset-task components* can have. We have 2 more components to explore - *flows*, *runs*. We could list out all possible flows and filter out the ones we want, i.e., Random Forest. However, let us instead fetch all the evaluations made on the Iris dataset using the 11 tasks we collected above.\n", + "\n", + "We shall subsequently work with the scikit-learn based task which has been uploaded/used the most. We shall then further filter out the list of evaluations from the selected task (task_id=59 in this case), depending on if Random Forest was used." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    run_idtask_idsetup_idflow_idflow_namedata_iddata_namefunctionupload_timeuploaderuploader_namevaluevaluesarray_data
    081591267weka.BayesNet_K2(1)61irispredictive_accuracy2014-04-07 00:05:111janvanrijn@gmail.com0.940000NoneNone
    1161591370weka.SMO_PolyKernel(1)61irispredictive_accuracy2014-04-07 00:55:321janvanrijn@gmail.com0.960000NoneNone
    223459156weka.ZeroR(1)61irispredictive_accuracy2014-04-07 01:33:241janvanrijn@gmail.com0.333333NoneNone
    344759661weka.REPTree(1)61irispredictive_accuracy2014-04-07 06:26:271janvanrijn@gmail.com0.926667NoneNone
    4473591877weka.LogitBoost_DecisionStump(1)61irispredictive_accuracy2014-04-07 06:39:271janvanrijn@gmail.com0.946667NoneNone
    \n", + "
    " + ], + "text/plain": [ + " run_id task_id setup_id flow_id flow_name \\\n", + "0 81 59 12 67 weka.BayesNet_K2(1) \n", + "1 161 59 13 70 weka.SMO_PolyKernel(1) \n", + "2 234 59 1 56 weka.ZeroR(1) \n", + "3 447 59 6 61 weka.REPTree(1) \n", + "4 473 59 18 77 weka.LogitBoost_DecisionStump(1) \n", + "\n", + " data_id data_name function upload_time uploader \\\n", + "0 61 iris predictive_accuracy 2014-04-07 00:05:11 1 \n", + "1 61 iris predictive_accuracy 2014-04-07 00:55:32 1 \n", + "2 61 iris predictive_accuracy 2014-04-07 01:33:24 1 \n", + "3 61 iris predictive_accuracy 2014-04-07 06:26:27 1 \n", + "4 61 iris predictive_accuracy 2014-04-07 06:39:27 1 \n", + "\n", + " uploader_name value values array_data \n", + "0 janvanrijn@gmail.com 0.940000 None None \n", + "1 janvanrijn@gmail.com 0.960000 None None \n", + "2 janvanrijn@gmail.com 0.333333 None None \n", + "3 janvanrijn@gmail.com 0.926667 None None \n", + "4 janvanrijn@gmail.com 0.946667 None None " + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Listing all evaluations made on the 11 tasks collected above\n", + "# with evaluation metric as 'predictive_accuracy'\n", + "task_df = openml.evaluations.list_evaluations(function='predictive_accuracy', task=tasks, output_format='dataframe')\n", + "task_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    run_idtask_idsetup_idflow_idflow_namedata_iddata_namefunctionupload_timeuploaderuploader_namevaluevaluesarray_data
    144184904359290155500sklearn.ensemble.forest.RandomForestClassifier...61irispredictive_accuracy2017-03-03 17:10:121janvanrijn@gmail.com0.946667NoneNone
    145185340959309505873sklearn.pipeline.Pipeline(Imputer=openml.utils...61irispredictive_accuracy2017-03-21 22:08:011janvanrijn@gmail.com0.960000NoneNone
    14661301265941636337108sklearn.model_selection._search.RandomizedSear...61irispredictive_accuracy2017-08-21 11:07:401janvanrijn@gmail.com0.960000NoneNone
    14761301285941636347108sklearn.model_selection._search.RandomizedSear...61irispredictive_accuracy2017-08-21 11:08:061janvanrijn@gmail.com0.946667NoneNone
    14867153835947472897117sklearn.model_selection._search.RandomizedSear...61irispredictive_accuracy2017-09-01 02:56:441janvanrijn@gmail.com0.960000NoneNone
    \n", + "
    " + ], + "text/plain": [ + " run_id task_id setup_id flow_id \\\n", + "144 1849043 59 29015 5500 \n", + "145 1853409 59 30950 5873 \n", + "146 6130126 59 4163633 7108 \n", + "147 6130128 59 4163634 7108 \n", + "148 6715383 59 4747289 7117 \n", + "\n", + " flow_name data_id data_name \\\n", + "144 sklearn.ensemble.forest.RandomForestClassifier... 61 iris \n", + "145 sklearn.pipeline.Pipeline(Imputer=openml.utils... 61 iris \n", + "146 sklearn.model_selection._search.RandomizedSear... 61 iris \n", + "147 sklearn.model_selection._search.RandomizedSear... 61 iris \n", + "148 sklearn.model_selection._search.RandomizedSear... 61 iris \n", + "\n", + " function upload_time uploader uploader_name \\\n", + "144 predictive_accuracy 2017-03-03 17:10:12 1 janvanrijn@gmail.com \n", + "145 predictive_accuracy 2017-03-21 22:08:01 1 janvanrijn@gmail.com \n", + "146 predictive_accuracy 2017-08-21 11:07:40 1 janvanrijn@gmail.com \n", + "147 predictive_accuracy 2017-08-21 11:08:06 1 janvanrijn@gmail.com \n", + "148 predictive_accuracy 2017-09-01 02:56:44 1 janvanrijn@gmail.com \n", + "\n", + " value values array_data \n", + "144 0.946667 None None \n", + "145 0.960000 None None \n", + "146 0.960000 None None \n", + "147 0.946667 None None \n", + "148 0.960000 None None " + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Filtering based on sklearn (scikit-learn)\n", + "task_df = task_df[task_df['flow_name'].str.contains(\"sklearn\")]\n", + "task_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "59 1985\n", + "10107 25\n", + "289 1\n", + "Name: task_id, dtype: int64" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Counting frequency of the different tasks used to\n", + "# solve Iris as a supervised classification using scikit-learn\n", + "task_df['task_id'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "OpenML Classification Task\n", + "==========================\n", + "Task Type Description: https://www.openml.org/tt/1\n", + "Task ID..............: 59\n", + "Task URL.............: https://www.openml.org/t/59\n", + "Estimation Procedure.: crossvalidation\n", + "Evaluation Measure...: predictive_accuracy\n", + "Target Feature.......: class\n", + "# of Classes.........: 3\n", + "Cost Matrix..........: Available" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Retrieving the most used task\n", + "t = openml.tasks.get_task(59)\n", + "t" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# Filtering for only task_id=59\n", + "task_df = task_df.query(\"task_id==59\")" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    run_idtask_idsetup_idflow_idflow_namedata_iddata_namefunctionupload_timeuploaderuploader_namevaluevaluesarray_data
    144184904359290155500sklearn.ensemble.forest.RandomForestClassifier...61irispredictive_accuracy2017-03-03 17:10:121janvanrijn@gmail.com0.946667NoneNone
    145185340959309505873sklearn.pipeline.Pipeline(Imputer=openml.utils...61irispredictive_accuracy2017-03-21 22:08:011janvanrijn@gmail.com0.960000NoneNone
    14661301265941636337108sklearn.model_selection._search.RandomizedSear...61irispredictive_accuracy2017-08-21 11:07:401janvanrijn@gmail.com0.960000NoneNone
    14761301285941636347108sklearn.model_selection._search.RandomizedSear...61irispredictive_accuracy2017-08-21 11:08:061janvanrijn@gmail.com0.946667NoneNone
    19069464995949783977109sklearn.pipeline.Pipeline(imputation=openmlstu...61irispredictive_accuracy2017-09-02 22:06:321janvanrijn@gmail.com0.920000NoneNone
    \n", + "
    " + ], + "text/plain": [ + " run_id task_id setup_id flow_id \\\n", + "144 1849043 59 29015 5500 \n", + "145 1853409 59 30950 5873 \n", + "146 6130126 59 4163633 7108 \n", + "147 6130128 59 4163634 7108 \n", + "190 6946499 59 4978397 7109 \n", + "\n", + " flow_name data_id data_name \\\n", + "144 sklearn.ensemble.forest.RandomForestClassifier... 61 iris \n", + "145 sklearn.pipeline.Pipeline(Imputer=openml.utils... 61 iris \n", + "146 sklearn.model_selection._search.RandomizedSear... 61 iris \n", + "147 sklearn.model_selection._search.RandomizedSear... 61 iris \n", + "190 sklearn.pipeline.Pipeline(imputation=openmlstu... 61 iris \n", + "\n", + " function upload_time uploader uploader_name \\\n", + "144 predictive_accuracy 2017-03-03 17:10:12 1 janvanrijn@gmail.com \n", + "145 predictive_accuracy 2017-03-21 22:08:01 1 janvanrijn@gmail.com \n", + "146 predictive_accuracy 2017-08-21 11:07:40 1 janvanrijn@gmail.com \n", + "147 predictive_accuracy 2017-08-21 11:08:06 1 janvanrijn@gmail.com \n", + "190 predictive_accuracy 2017-09-02 22:06:32 1 janvanrijn@gmail.com \n", + "\n", + " value values array_data \n", + "144 0.946667 None None \n", + "145 0.960000 None None \n", + "146 0.960000 None None \n", + "147 0.946667 None None \n", + "190 0.920000 None None " + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Filtering based on Random Forest\n", + "task_rf = task_df[task_df['flow_name'].str.contains(\"RandomForest\")]\n", + "task_rf.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Retrieving top-performing models from OpenML" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since we are an ambitious bunch of ML practitioners who settle for nothing but the best, and also since most results will not be considered worth the effort if not matching or beating *state-of-the-art*, we shall aim for the best scores. We'll sort the filtered results we obtained based on the score or '*value*' and then extract the components from that run - *task* and *flow*." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    run_idtask_idsetup_idflow_idflow_namedata_iddata_namefunctionupload_timeuploaderuploader_namevaluevaluesarray_data
    35495239265935262629sklearn.ensemble.forest.RandomForestClassifier(8)61irispredictive_accuracy2016-02-11 22:05:23869p.gijsbers@student.tue.nl0.966667NoneNone
    435389553705968909887257sklearn.ensemble.forest.RandomForestClassifier...61irispredictive_accuracy2018-04-06 16:32:223964clear.tsai@gmail.com0.960000NoneNone
    3587185268259292635500sklearn.ensemble.forest.RandomForestClassifier...61irispredictive_accuracy2017-03-15 22:55:181022rso@randalolson.com0.960000NoneNone
    437588866085968351397961sklearn.pipeline.Pipeline(Imputer=sklearn.prep...61irispredictive_accuracy2018-03-17 16:46:275032rashmi.kamath01@gmail.com0.960000NoneNone
    3107184327259240714830sklearn.ensemble.forest.RandomForestClassifier...61irispredictive_accuracy2016-12-08 20:10:032joaquin.vanschoren@gmail.com0.960000NoneNone
    \n", + "
    " + ], + "text/plain": [ + " run_id task_id setup_id flow_id \\\n", + "3549 523926 59 3526 2629 \n", + "4353 8955370 59 6890988 7257 \n", + "3587 1852682 59 29263 5500 \n", + "4375 8886608 59 6835139 7961 \n", + "3107 1843272 59 24071 4830 \n", + "\n", + " flow_name data_id data_name \\\n", + "3549 sklearn.ensemble.forest.RandomForestClassifier(8) 61 iris \n", + "4353 sklearn.ensemble.forest.RandomForestClassifier... 61 iris \n", + "3587 sklearn.ensemble.forest.RandomForestClassifier... 61 iris \n", + "4375 sklearn.pipeline.Pipeline(Imputer=sklearn.prep... 61 iris \n", + "3107 sklearn.ensemble.forest.RandomForestClassifier... 61 iris \n", + "\n", + " function upload_time uploader \\\n", + "3549 predictive_accuracy 2016-02-11 22:05:23 869 \n", + "4353 predictive_accuracy 2018-04-06 16:32:22 3964 \n", + "3587 predictive_accuracy 2017-03-15 22:55:18 1022 \n", + "4375 predictive_accuracy 2018-03-17 16:46:27 5032 \n", + "3107 predictive_accuracy 2016-12-08 20:10:03 2 \n", + "\n", + " uploader_name value values array_data \n", + "3549 p.gijsbers@student.tue.nl 0.966667 None None \n", + "4353 clear.tsai@gmail.com 0.960000 None None \n", + "3587 rso@randalolson.com 0.960000 None None \n", + "4375 rashmi.kamath01@gmail.com 0.960000 None None \n", + "3107 joaquin.vanschoren@gmail.com 0.960000 None None " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "task_rf.sort_values(by='value', ascending=False).head()" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "OpenML Flow\n", + "===========\n", + "Flow ID.........: 2629 (version 8)\n", + "Flow URL........: https://www.openml.org/f/2629\n", + "Flow Name.......: sklearn.ensemble.forest.RandomForestClassifier\n", + "Flow Description: Flow generated by openml_run\n", + "Upload Date.....: 2016-02-11 21:17:08\n", + "Dependencies....: None" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Fetching the Random Forest flow with the best score\n", + "f = openml.flows.get_flow(2629)\n", + "f" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "OpenML Run\n", + "==========\n", + "Uploader Name...: Pieter Gijsbers\n", + "Uploader Profile: https://www.openml.org/u/869\n", + "Metric..........: predictive_accuracy\n", + "Result..........: 0.966667\n", + "Run ID..........: 523926\n", + "Run URL.........: https://www.openml.org/r/523926\n", + "Task ID.........: 59\n", + "Task Type.......: Supervised Classification\n", + "Task URL........: https://www.openml.org/t/59\n", + "Flow ID.........: 2629\n", + "Flow Name.......: sklearn.ensemble.forest.RandomForestClassifier(8)\n", + "Flow URL........: https://www.openml.org/f/2629\n", + "Setup ID........: 3526\n", + "Setup String....: None\n", + "Dataset ID......: 61\n", + "Dataset URL.....: https://www.openml.org/d/61" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Fetching the run with the best score for\n", + "# Random Forest on Iris\n", + "r = openml.runs.get_run(523926)\n", + "r" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Okay, let's take a pause and re-assess. From multiple users across the globe, who had uploaded runs to OpenML, for a Random Forest run on the Iris, the best score seen till now is **96.67%**. That is certainly better than the naive model we built at the beginning to achieve **95.33%**. We had used a basic 10-fold cross-validation to evaluate a Random Forest of 10 trees with a max depth of 2. Let us see, what the best run uses and if it differs from our approach." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'predictive_accuracy'" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# The scoring metric used\n", + "t.evaluation_measure" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'type': 'crossvalidation',\n", + " 'parameters': {'number_repeats': '1',\n", + " 'number_folds': '10',\n", + " 'percentage': '',\n", + " 'stratified_sampling': 'true'},\n", + " 'data_splits_url': 'https://www.openml.org/api_splits/get/59/Task_59_splits.arff'}" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# The methodology used for estimations\n", + "t.estimation_procedure" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'sklearn.ensemble.forest.RandomForestClassifier'" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# The model used\n", + "f.name" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "warm_start : False \n", + "oob_score : False \n", + "n_jobs : 1 \n", + "verbose : 0 \n", + "max_leaf_nodes : None \n", + "bootstrap : True \n", + "min_samples_leaf : 1 \n", + "n_estimators : 10 \n", + "min_samples_split : 2 \n", + "min_weight_fraction_leaf : 0.0 \n", + "criterion : gini \n", + "random_state : None \n", + "max_features : auto \n", + "max_depth : None \n", + "class_weight : None \n" + ] + } + ], + "source": [ + "# The model parameters\n", + "for param in r.parameter_settings:\n", + " name, value = param['oml:name'], param['oml:value']\n", + " print(\"{:<25} : {:<10}\".format(name, value))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As evident, our initial approach is different on two fronts. We didn't explicitly use stratified sampling for our cross-validation. While the Random Forest hyperparameters are slightly different too (*max_depth=None*). That definitely sounds like a *to-do*, however, there is no reason why we should restrict ourselves to Random Forests. Remember, we are aiming *big* here. Given the [number of OpenML users](https://www.openml.org/search?type=user), there must be somebody who got a better score on Iris with some other model. Let us then retrieve that information. Programmatically, of course.\n", + "\n", + "In summary, we are now going to sort the performance of all scikit-learn based models on Iris dataset as per the task definition with *task_id=59*." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    run_idtask_idsetup_idflow_idflow_namedata_iddata_namefunctionupload_timeuploaderuploader_namevaluevaluesarray_data
    36302039748591809226048sklearn.pipeline.Pipeline(dualimputer=helper.d...61irispredictive_accuracy2017-04-09 01:09:011104jmapvhoof@gmail.com0.986667NoneNone
    36312039750591809246048sklearn.pipeline.Pipeline(dualimputer=helper.d...61irispredictive_accuracy2017-04-09 01:17:391104jmapvhoof@gmail.com0.986667NoneNone
    36242012939591576226048sklearn.pipeline.Pipeline(dualimputer=helper.d...61irispredictive_accuracy2017-04-06 23:29:281104jmapvhoof@gmail.com0.986667NoneNone
    36182012930591576136048sklearn.pipeline.Pipeline(dualimputer=helper.d...61irispredictive_accuracy2017-04-06 23:00:241104jmapvhoof@gmail.com0.986667NoneNone
    36262012941591576246048sklearn.pipeline.Pipeline(dualimputer=helper.d...61irispredictive_accuracy2017-04-07 01:36:001104jmapvhoof@gmail.com0.986667NoneNone
    \n", + "
    " + ], + "text/plain": [ + " run_id task_id setup_id flow_id \\\n", + "3630 2039748 59 180922 6048 \n", + "3631 2039750 59 180924 6048 \n", + "3624 2012939 59 157622 6048 \n", + "3618 2012930 59 157613 6048 \n", + "3626 2012941 59 157624 6048 \n", + "\n", + " flow_name data_id data_name \\\n", + "3630 sklearn.pipeline.Pipeline(dualimputer=helper.d... 61 iris \n", + "3631 sklearn.pipeline.Pipeline(dualimputer=helper.d... 61 iris \n", + "3624 sklearn.pipeline.Pipeline(dualimputer=helper.d... 61 iris \n", + "3618 sklearn.pipeline.Pipeline(dualimputer=helper.d... 61 iris \n", + "3626 sklearn.pipeline.Pipeline(dualimputer=helper.d... 61 iris \n", + "\n", + " function upload_time uploader uploader_name \\\n", + "3630 predictive_accuracy 2017-04-09 01:09:01 1104 jmapvhoof@gmail.com \n", + "3631 predictive_accuracy 2017-04-09 01:17:39 1104 jmapvhoof@gmail.com \n", + "3624 predictive_accuracy 2017-04-06 23:29:28 1104 jmapvhoof@gmail.com \n", + "3618 predictive_accuracy 2017-04-06 23:00:24 1104 jmapvhoof@gmail.com \n", + "3626 predictive_accuracy 2017-04-07 01:36:00 1104 jmapvhoof@gmail.com \n", + "\n", + " value values array_data \n", + "3630 0.986667 None None \n", + "3631 0.986667 None None \n", + "3624 0.986667 None None \n", + "3618 0.986667 None None \n", + "3626 0.986667 None None " + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Fetching top performances\n", + "task_df.sort_values(by='value', ascending=False).head()" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "OpenML Flow\n", + "===========\n", + "Flow ID.........: 6048 (version 1)\n", + "Flow URL........: https://www.openml.org/f/6048\n", + "Flow Name.......: sklearn.pipeline.Pipeline(dualimputer=helper.dual_imputer.DualImputer,nusvc=sklearn.svm.classes.NuSVC)\n", + "Flow Description: Automatically created scikit-learn flow.\n", + "Upload Date.....: 2017-04-06 22:42:59\n", + "Dependencies....: sklearn==0.18.1\n", + "numpy>=1.6.1\n", + "scipy>=0.9" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Fetching best performing flow\n", + "f = openml.flows.get_flow(6048)\n", + "f" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "steps : [('DualImputer', ), ('nusvc', NuSVC(cache_size=200, class_weight=None, coef0=0.0,\n", + " decision_function_shape=None, degree=3, gamma='auto', kernel='linear',\n", + " max_iter=-1, nu=0.3, probability=True, random_state=3, shrinking=True,\n", + " tol=3.2419092644286417e-05, verbose=False))]\n", + "cache_size : 200 \n", + "class_weight : None \n", + "coef0 : 0.0 \n", + "decision_function_shape : None \n", + "degree : 3 \n", + "gamma : auto \n", + "kernel : linear \n", + "max_iter : -1 \n", + "nu : 0.3 \n", + "probability : True \n", + "random_state : 3 \n", + "shrinking : True \n", + "tol : 3.24190926443e-05\n", + "verbose : False \n" + ] + } + ], + "source": [ + "# Fetching best performing run\n", + "r = openml.runs.get_run(2012943)\n", + "\n", + "# The model parameters\n", + "for param in r.parameter_settings:\n", + " name, value = param['oml:name'], param['oml:value']\n", + " print(\"{:<25} : {:<10}\".format(name, value))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The highest score obtained among the uploaded results is **98.67%** using a [variant of SVM](https://scikit-learn.org/stable/modules/generated/sklearn.svm.NuSVC.html#sklearn.svm.NuSVC). However, if we check the corresponding flow description, we see that it is using an old scikit-learn version (0.18.1) and therefore may not be possible to replicate the exact results. However, in order to improve from our score of 95.33%, we should try running a *nu-SVC* on the same problem and see where we stand. Let's go for it. Via OpenML, of course." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Running best performing flow on the required task" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "import openml\n", + "import numpy as np\n", + "from sklearn.svm import NuSVC" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "# Building the NuSVC model object with parameters found\n", + "clf = NuSVC(cache_size=200, class_weight=None, coef0=0.0,\n", + " decision_function_shape=None, degree=3, gamma='auto', kernel='linear',\n", + " max_iter=-1, nu=0.3, probability=True, random_state=3, shrinking=True,\n", + " tol=3.2419092644286417e-05, verbose=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "OpenML Classification Task\n", + "==========================\n", + "Task Type Description: https://www.openml.org/tt/1\n", + "Task ID..............: 59\n", + "Task URL.............: https://www.openml.org/t/59\n", + "Estimation Procedure.: crossvalidation\n", + "Evaluation Measure...: predictive_accuracy\n", + "Target Feature.......: class\n", + "# of Classes.........: 3\n", + "Cost Matrix..........: Available" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Obtaining task used earlier\n", + "t = openml.tasks.get_task(59)\n", + "t" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "OpenML Flow\n", + "===========\n", + "Flow Name.......: sklearn.svm.classes.NuSVC\n", + "Flow Description: Nu-Support Vector Classification.\n", + "\n", + "Similar to SVC but uses a parameter to control the number of support\n", + "vectors.\n", + "\n", + "The implementation is based on libsvm.\n", + "Dependencies....: sklearn==0.21.3\n", + "numpy>=1.6.1\n", + "scipy>=0.9" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Running the model on the task\n", + "# Internally, the model will be made into \n", + "# an OpenML flow and we can choose to retrieve it\n", + "r, f = openml.runs.run_model_on_task(model=clf, task=t, upload_flow=False, return_flow=True)\n", + "f" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.9866666666666667\n" + ] + } + ], + "source": [ + "# To obtain the score (without uploading)\n", + "## r.publish() can be used to upload these results\n", + "## need to sign-in to https://www.openml.org/\n", + "score = []\n", + "evaluations = r.fold_evaluations['predictive_accuracy'][0]\n", + "for key in evaluations:\n", + " score.append(evaluations[key])\n", + "print(np.mean(score))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lo and behold! We hit the magic number. I personally would have never tried out NuSVC and would have stuck around tweaking hyperparameters of the Random Forest. This is a new discovery of sorts for sure. I wonder though if anybody has tried XGBoost on Iris?\n", + "\n", + "In any case, we can now upload the results of this run to OpenML using:" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "OpenML Run\n", + "==========\n", + "Uploader Name: None\n", + "Metric.......: None\n", + "Run ID.......: 10464835\n", + "Run URL......: https://www.openml.org/r/10464835\n", + "Task ID......: 59\n", + "Task Type....: None\n", + "Task URL.....: https://www.openml.org/t/59\n", + "Flow ID......: 18579\n", + "Flow Name....: sklearn.svm.classes.NuSVC\n", + "Flow URL.....: https://www.openml.org/f/18579\n", + "Setup ID.....: None\n", + "Setup String.: Python_3.6.9. Sklearn_0.21.3. NumPy_1.16.4. SciPy_1.4.1. NuSVC(cache_size=200, class_weight=None, coef0=0.0,\n", + " decision_function_shape=None, degree=3, gamma='auto', kernel='linear',\n", + " max_iter=-1, nu=0.3, probability=True, random_state=3, shrinking=True,\n", + " tol=3.241909264428642e-05, verbose=False)\n", + "Dataset ID...: 61\n", + "Dataset URL..: https://www.openml.org/d/61" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "r.publish()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One would need to sign-in to https://www.openml.org/ and generate their respective *apikey*. The results would then be available for everyone to view and who knows, you can have your name against the *best-ever* performance measured on the Iris dataset!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This post was in no ways intended to be a be-all-end-all guide to OpenML. The primary goal was to help form an acquaintance with the OpenML terminologies, introduce the API, establish connections with the general ML practices, and give a sneak-peek into the potential benefits of working together as a *community*. For a better understanding of OpenML, please explore the [documentation](https://openml.github.io/openml-python/develop/usage.html#usage). If one desires to continue from the examples given in this post and explore further, kindly refer to the [API](https://openml.github.io/openml-python/develop/api.html).\n", + "\n", + "OpenML-Python is an open-source project and contributions from everyone in the form of Issues and Pull Requests are most welcome. Contribution to the OpenML community is in fact not limited to code contribution. Every single user can make the community richer by sharing data, experiments, results, using OpenML.\n", + "\n", + "As ML practitioners, we may be dependent on tools for our tasks. However, as a collective, we can juice out its potential to a larger extent. Let us together, make ML more transparent, more democratic!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Special thanks to Heidi, Bilge, Sahithya, Matthias, Ashwin for the ideas, feedback, and support." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Related readings:\n", + "* [To get started with OpenML-Python](https://openml.github.io/openml-python/develop/)\n", + "* [OpenML-Python Github](https://github.com/openml/openml-python)\n", + "* [The OpenML website](https://www.openml.org/)\n", + "* [Miscellaneous reading on OpenML](https://openml.github.io/blog/)\n", + "* [To get in touch!](https://www.openml.org/contact)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/blog/posts/2019-10-26-OpenML-Machine-Learning-as-a-community/openml.png b/blog/posts/2019-10-26-OpenML-Machine-Learning-as-a-community/openml.png new file mode 100644 index 0000000..82ef4bb Binary files /dev/null and b/blog/posts/2019-10-26-OpenML-Machine-Learning-as-a-community/openml.png differ diff --git a/blog/posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/2020-03-23-Finding a-standard-dataset-format-for-machine-learning.qmd b/blog/posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/2020-03-23-Finding a-standard-dataset-format-for-machine-learning.qmd new file mode 100644 index 0000000..d49cf76 --- /dev/null +++ b/blog/posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/2020-03-23-Finding a-standard-dataset-format-for-machine-learning.qmd @@ -0,0 +1,170 @@ +--- +toc: true +layout: post +description: Exploring new dataset format options for OpenML.org +categories: [OpenML, Data] +title: Finding a standard dataset format for machine learning +image: format.jpg +author: Pieter Gijsbers, Mitar Milutinovic, Prabhant Singh, Joaquin Vanschoren +date: 2020-03-23 +--- + +Machine learning data is commonly shared in whatever form it comes in (e.g. images, logs, tables) without being able to make strict assumptions on what it contains or how it is formatted. This makes machine learning hard because you need to spend a lot of time figuring out how to parse and deal with it. Some datasets are accompanied with loading scripts, which are language-specific and may break, and some come with their own server to query the dataset. These do help, but are often not available, and still require us to handle every dataset individually. + +With OpenML, we aim to take a stress-free, 'zen'-like approach to working with machine learning datasets. To make training data easy to use, OpenML serves thousands of datasets in the same format, with the same rich meta-data, so that you can directly load it (e.g. in numpy,pandas,...) and start building models without manual intervention. For instance, you can benchmark algorithms across hundreds of datasets in a simple loop. + +For historical reasons, we have done this by internally storing all data in the [ARFF](https://www.cs.waikato.ac.nz/ml/weka/arff.html) data format, a CSV-like text-based format that includes meta-data such as the correct feature data types. However, this format is loosely defined, causing different parsers to behave differently, and the current parsers are memory-inefficient which inhibits the use of large datasets. A more popular format these days is [Parquet](https://parquet.apache.org/), a binary single-table format. However, many current machine learning tasks require multi-table data. For instance, image segmentation or object detection tasks have both images and varying amounts of annotations per image. + +In short, we are looking the best format to *internally* store machine learning datasets in the foreseeable future, to extend OpenML towards all kinds of modern machine learning datasets and serve them in a uniform way. This blog post presents out process and insights. We would love to hear your thoughts and experiences before we make any decision on how to move forward. + +**Scope** + +We first define the general scope of the usage of the format: + +- It should be **useful for data storage and transmission**. We can always convert data during upload or download in OpenML's client APIs. For instance, people may upload a Python pandas dataframe to OpenML, and later get the same dataframe back, without realizing or caring how the data was stored in the meantime. If people want to store the data locally, they can download it in the format they like (e.g. a memory-mapped format like Arrow/Feather for fast reading or TFRecords for people using TensorFlow). Additional code can facilitate such conversions. +- There should be a **standard way to represent specific types of data**, i.e. a fixed schema that can be verified. For instance, all tabular data should be stored in a uniform way. Without it, we would need dataset-specific code for loading, which requires maintenance, and it will be harder to check quality and extract meta-data. +- The format should **allow storing most (processed) machine learning datasets,** including images, video, audio, text, graphs, and multi-tabular data such as object recognition tasks and relational data. Data such as images can be converted to numeric formats (e.g. pixel values) for storage in this format (and usage in machine learning). + +**Impact on OpenML (simplicity, maintenance)** + +Since OpenML is a community project, we want to keep it as easy as possible to use and maintain: + +- We aim to host datasets in an *S3* object store (min.io). +- We prefer a **single internal data format** to reduce maintenance both server-side and client-side. +- We need **machine-readable schemas** (in a specific language) that describe how a certain type of data is formatted. Examples would be a schema for tabular data, a schema for annotated image data, etc. Every dataset should specify the schema it satisfies, and we should be able to **validate** this. We aim to gradually roll out support form different types of data, starting with tabular, and including others only after schemas are defined. +- We need to support batch data now, but ideally the format should allow data appending (streaming) in the future. + +When no agreed upon schema exists, we could offer a forum for the community to discuss and agree on a standard schema, in collaboration with other initiatives (e.g. [frictionlessdata](https://frictionlessdata.io/)). For instance, new schemas could be created in a github repo to allow people to do create pull requests. They could be effectively used once they are merged. + +**Requirements** + +To draw up a shortlist of data formats, we used the following (soft) requirements: + +- The format should be stable and **fully maintained** by an active community. +- **Parsers in various programming languages**, including well-maintained and stable libraries. +- **Streaming read/writes**, for easy conversion and memory efficiency. +- **Version control**, some way to **see differences** between versions. +- Ideally, there is a way to **detect bitflip errors** during storage or transmission. +- Ideally, **fast read/writes** and **efficient storage**. +- Ideally, there should be support for storing **sparse data**. +- Support for storing binary blobs and vectors of different lengths. +- If possible, support for multiple 'resources' (e.g. collections of files or multiple relational tables). +- Potentially, store some meta-data inside the file. + +**Shortlist** + +We decided to investigate the following formats in more detail: + +[**Arrow**](https://arrow.apache.org/) **/** [**Feather**](https://github.com/wesm/feather) + +Benefits: + +- Great for locally caching files after download +- Memory-mapped, so very fast reads + +Drawbacks: + +- Not stable enough yet and not ideal for long-term storage. The authors also discourage it for long-term storage. +- Limited to one data structure per file, but that data structure can be complex (e.g. dict). + +[**Parquet**](https://parquet.apache.org/) + +Benefits: + +- Used in industry a lot, active developer community. Good community of practice. +- Well-supported and maintained. +- Has parsers in different languages, but not all Parquet features are supported in every library (see below). +- Built-in compression (columnar storage), very efficient long-term data storage +- Simple structure +- Sparse data + +Drawbacks: + +- The Python libraries ([Arrow](https://arrow.apache.org/docs/python/parquet.html), [fastparquet](https://fastparquet.readthedocs.io/)) **do not support partial read/writes**. The Java/Go implementations do. Splitting up parquet files into many small files can be cumbersome. +- **No version control, no meta-data storage, no schema enforcement.** There are layers on top (e.g. delta lake) that do support this. Simple file versioning can also be done with S3. +- The different parsers (e.g. [Parquet support inside Arrow](https://arrow.apache.org/docs/python/parquet.html), [fastparquet](https://fastparquet.readthedocs.io/)) implement different parts of the Parquet format and different set of compression algorithms. Hence, parquet files **may not be compatible between parsers** (see [here](https://fastparquet.readthedocs.io/en/latest/#caveats-known-issues) and [here](https://kb.databricks.com/data/wrong-schema-in-files.html). +- Support **limited to single-table storage**. For instance, there doesn't seem to be an apparent way to store an object detection dataset (with images and annotations) as a single parquet file. + +[**SQLite**](https://www.sqlite.org/index.html) + +Benefits: + +- Easy to use and comparably fast to HDF5 in our tests. +- Very good support in all languages. It is [built-in](https://docs.python.org/3.7/library/sqlite3.html) in Python. +- Very flexible access to parts of the data. SQL queries can be used to select any subset of the data. + +Drawback: + +- It supports **only 2000 columns**, and we have quite a few datasets with more than 2000 features. Hence, storing large tabular data will require mapping data differently, which would add a lot of additional complexity. +- Writing SQL queries **requires knowledge of the internal data structure** (tables, keys,...). + +[**HDF5**](https://www.hdfgroup.org/solutions/hdf5/) + +Benefits: + +- Very good support in all languages. Has well-tested parsers, all using the same C implementation. +- Widely accepted format in the deep learning community to store data and models. +- Widely accepted format in many scientific domains (e.g. astronomy, bioinformatics,...) +- Provides built-in compression. Constructing and loading datasets was reasonably fast. +- Very flexible. Should allow to store any machine learning dataset as a single file. +- Allows easy inclusion of meta-data inside the file, creating a self-contained file. +- Self-descriptive: the structure of the data can be easily read programmatically. For instance, 'dump -H -A 0 mydata.hdf5' will give you a lot of detail on the structure of the dataset. + +Drawbacks: + +- Complexity. We **cannot make any a priori assumptions about how the data is structured**. We need to define schema and implement code that automatically validates that a dataset follows a specific schema (e.g. using h5dump to see whether it holds a single dataframe that we could load into pandas). We are unaware of any initiatives to define such schema. +- The format has a **very long and detailed specification**. While parsers exist we don't really know whether they are fully compatible with each other. +- Can become corrupt if not carefully used. + +**CSV** + +Benefits: + +- Very good support in all languages. +- Easy to use, requires very little additional tooling +- Text-based, so easy versioning with git LFS. Changes in different versions can be observed with a simple git diff. +- The current standard used in [frictionlessdata](https://frictionlessdata.io/). +- There exist schema to express certain types of data in CSV (see [frictionlessdata](https://frictionlessdata.io/)). + +Drawbacks: + +- **Not very efficient** for storing floating point numbers +- **Not ideal for very large datasets** (when data does not fit in memory/disk) +- **Many different dialects exist**. We need to decide on a standardized dialect and enforce that only that dialect is used on OpenML ([https://frictionlessdata.io/specs/csv-dialect/](https://frictionlessdata.io/specs/csv-dialect/)). The dialect specified in [RFC4180](https://tools.ietf.org/html/rfc4180), which uses the comma as delimiter and the quotation mark as quote character, is often recommended. + + + +**Overview** + +| | Parquet | HDF5 | SQLite | CSV | +| --- | --- | --- | --- | --- | +| Consistency across
    different platforms | ? | ✅ | ✅ | ✅ (dialect) | +| Support and documentation | ✅ | ✅ | ✅ | ✅ | +| Read/write speed | ✅ | so-so | ❌ | ❌ | +| Incremental
    reads/writes | Yes, but not
    supported by current
    Python libs | ✅ | ✅ | Yes (but not
    random access) | +| Supports very large and high-dimensional datasets | ✅ | ✅ | ❌ (limited nr. columns
    per table) | ✅ Storing tensors
    requires flattening. | +| Simplicity | ✅ | ❌ (basically full
    file system) | ✅ (it's a database) | ✅ | +| Metadata support | Only minimal | ✅ | ✅ | ❌ (requires separate
    metadata file) | +| Maintenance | Apache project, open
    and quite [active](https://www.slideshare.net/Hadoop_Summit/the-columnar-roadmap-apache-parquet-and-apache-arrow-102997214) | Closed group,
    but [active](https://www.slideshare.net/HDFEOS/hdf5-roadmap-20192020) community on
    Jira and conferences | Run by a [company](https://www.sqlite.org/prosupport.html).
    Uses an email list. | ✅ | +| Available examples of
    usage in ML | ✅ | ✅ | ❌ | ✅ | +| Flexibility | Only tabular | Very flexible,
    maybe too flexible | Relational multi-table | Only tabular | +| Versioning/Diff | Only via S3 or delta lake | ❌ | ❌ | ✅ | +| Different length vectors | As blob | ✅ | ❌ ? | ✅ | + +**Performance benchmarks** + +There exist some prior benchmarks ([here](https://tech.blueyonder.com/efficient-dataframe-storage-with-apache-parquet/) and [here](https://towardsdatascience.com/the-best-format-to-save-pandas-data-414dca023e0d)) on storing dataframes. These only consider single-table datasets. For reading/writing, CSV is clearly slower and Parquet is clearly faster. For storage, Parquet is most efficient but zipped CSV as well. HDF requires a lot more disk space. We also ran our own [benchmark](https://gitlab.com/mitar/benchmark-dataset-formats) to compare the writing performance of those data formats for very large and complex machine learning datasets, but could not find a way to store these in one file in Parquet. + +**Version control** + +Version control for large datasets is tricky. For text-based formats (CSV), we could use [git LFS](https://git-lfs.github.com/) store the datasets and have automated versioning of datasets. We found it quite easy to export all current OpenML dataset to GitLab: [https://gitlab.com/data/d/openml](https://gitlab.com/data/d/openml). + +The binary formats do not allow us to track changes in the data, only to recover the exact versions of the datasets you want (and their metadata). Potentially, extra tools could still be used to export the data to dataframes or text and then compare them. Delta Lake has version history support, but seemingly only for Spark operations done on the datasets. + +**We need your help!** +If we have missed any format we should investigate, or misunderstood those we have investigated, or missed some best practice, please tell us. +You are welcome to comment below, or send us an email at openmlhq@googlegroups.com + + +**Contributors to this blog post:** +Mitar Milutinovic, Prabhant Singh, Joaquin Vanschoren, Pieter Gijsbers, Andreas Mueller, Matthias Feurer, Jan van Rijn, Marcus Weimer, Marcel Wever, Gertjan van den Burg, Nick Poorman diff --git a/blog/posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/format.jpg b/blog/posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/format.jpg new file mode 100644 index 0000000..a604427 Binary files /dev/null and b/blog/posts/2020-03-23-Finding a-standard-dataset-format-for-machine-learning/format.jpg differ diff --git a/blog/posts/2020-05-06-Reproducible-deep-learning-with-OpenML/2020-05-06-Reproducible-deep-learning-with-OpenML.ipynb b/blog/posts/2020-05-06-Reproducible-deep-learning-with-OpenML/2020-05-06-Reproducible-deep-learning-with-OpenML.ipynb new file mode 100644 index 0000000..4644afe --- /dev/null +++ b/blog/posts/2020-05-06-Reproducible-deep-learning-with-OpenML/2020-05-06-Reproducible-deep-learning-with-OpenML.ipynb @@ -0,0 +1,528 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "toc: true\n", + "layout: post\n", + "description: Releasing OpenML Deep learning libraries compatible with keras, pytorch and mxnet.\n", + "categories: [openml, deep learning]\n", + "title: Reproducible deep learning with OpenML\n", + "date: 2020-05-06\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "FQZYOJPHguvK" + }, + "source": [ + "Deep learning is facing a reproducibility crisis right now[1]. The scale of experiments and there are numerous hyperparameters that affect performance, which makes it hard for the author to write a reproducibility document. The current best way to make an experiment reproducible is to upload the code. However, that's not optimal in a lot of situations where we have a huge undocumented codebase and someone would like to just reproduce the model.\n", + "OpenML[2] is an online machine learning platform for sharing and organizing data, machine learning algorithms and experiments. Until now we only provided support for classical machine learning and libraries like Sklearn and MLR. We see there is a huge need for reproducible deep learning now. To solve this issue OpenML is launching its deep learning plugins for popular deep learning libraries like Keras, MXNet, and Pytorch." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "x7Z1D17sguvO" + }, + "source": [ + "Here we have a small tutorial on how to use our pytorch extension with MNIST dataset. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "mTaJboRlguvR" + }, + "source": [ + "**Setup**
    \n", + "To install openml and openml pytorch extension execute this instruction in your terminal\n", + "
    \n", + "```pip install openml openml_pytorch```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 694 + }, + "colab_type": "code", + "id": "0XxYmCLygyJ9", + "outputId": "3475b9d6-9951-4b93-f084-167ba44ca9a9" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting openml\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/68/5b/cd32bb85651eccebfb489cc6ef7f060ce0f62350a6239127e398313090cc/openml-0.10.2.tar.gz (158kB)\n", + "\r\n", + "\u001b[K |██ | 10kB 28.5MB/s eta 0:00:01\r\n", + "\u001b[K |████▏ | 20kB 6.1MB/s eta 0:00:01\r\n", + "\u001b[K |██████▏ | 30kB 8.6MB/s eta 0:00:01\r\n", + "\u001b[K |████████▎ | 40kB 10.9MB/s eta 0:00:01\r\n", + "\u001b[K |██████████▎ | 51kB 7.2MB/s eta 0:00:01\r\n", + "\u001b[K |████████████▍ | 61kB 8.4MB/s eta 0:00:01\r\n", + "\u001b[K |██████████████▍ | 71kB 9.6MB/s eta 0:00:01\r\n", + "\u001b[K |████████████████▌ | 81kB 10.7MB/s eta 0:00:01\r\n", + "\u001b[K |██████████████████▌ | 92kB 8.5MB/s eta 0:00:01\r\n", + "\u001b[K |████████████████████▋ | 102kB 9.3MB/s eta 0:00:01\r\n", + "\u001b[K |██████████████████████▊ | 112kB 9.3MB/s eta 0:00:01\r\n", + "\u001b[K |████████████████████████▊ | 122kB 9.3MB/s eta 0:00:01\r\n", + "\u001b[K |██████████████████████████▉ | 133kB 9.3MB/s eta 0:00:01\r\n", + "\u001b[K |████████████████████████████▉ | 143kB 9.3MB/s eta 0:00:01\r\n", + "\u001b[K |███████████████████████████████ | 153kB 9.3MB/s eta 0:00:01\r\n", + "\u001b[K |████████████████████████████████| 163kB 9.3MB/s \n", + "\u001b[?25hCollecting openml_pytorch\n", + " Downloading https://files.pythonhosted.org/packages/5b/a4/8c69a041e7929d93460db17cf276abfb7b49af9c3d5077bee1c52101ba4c/openml_pytorch-0.0.1-py3-none-any.whl\n", + "Collecting liac-arff>=2.4.0\n", + " Downloading https://files.pythonhosted.org/packages/e9/35/fbc9217cfa91d98888b43e1a19c03a50d716108c58494c558c65e308f372/liac-arff-2.4.0.tar.gz\n", + "Collecting xmltodict\n", + " Downloading https://files.pythonhosted.org/packages/28/fd/30d5c1d3ac29ce229f6bdc40bbc20b28f716e8b363140c26eff19122d8a5/xmltodict-0.12.0-py2.py3-none-any.whl\n", + "Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from openml) (2.21.0)\n", + "Requirement already satisfied: scikit-learn>=0.18 in /usr/local/lib/python3.6/dist-packages (from openml) (0.22.2.post1)\n", + "Requirement already satisfied: python-dateutil in /usr/local/lib/python3.6/dist-packages (from openml) (2.8.1)\n", + "Requirement already satisfied: pandas>=0.19.2 in /usr/local/lib/python3.6/dist-packages (from openml) (1.0.3)\n", + "Requirement already satisfied: scipy>=0.13.3 in /usr/local/lib/python3.6/dist-packages (from openml) (1.4.1)\n", + "Requirement already satisfied: numpy>=1.6.2 in /usr/local/lib/python3.6/dist-packages (from openml) (1.18.2)\n", + "Collecting torch==1.2.0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/30/57/d5cceb0799c06733eefce80c395459f28970ebb9e896846ce96ab579a3f1/torch-1.2.0-cp36-cp36m-manylinux1_x86_64.whl (748.8MB)\n", + "\u001b[K |████████████████████████████████| 748.9MB 14kB/s \n", + "\u001b[?25hRequirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->openml) (3.0.4)\n", + "Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->openml) (1.24.3)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->openml) (2020.4.5.1)\n", + "Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->openml) (2.8)\n", + "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.6/dist-packages (from scikit-learn>=0.18->openml) (0.14.1)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil->openml) (1.12.0)\n", + "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.19.2->openml) (2018.9)\n", + "Building wheels for collected packages: openml, liac-arff\n", + " Building wheel for openml (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for openml: filename=openml-0.10.2-cp36-none-any.whl size=190318 sha256=50c2fd823d13904f246bf30997a2464379c393377cfd77f74b5dace4935db99c\n", + " Stored in directory: /root/.cache/pip/wheels/71/ec/5f/aaad9e184680b0b8f1a02ff0ec640cace5adf5bff7bb0af1b4\n", + " Building wheel for liac-arff (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for liac-arff: filename=liac_arff-2.4.0-cp36-none-any.whl size=13335 sha256=fca5bc5e07e3fe4f591cbe79968a42e43f535b3bd3e4be77b62c901d46feaaa9\n", + " Stored in directory: /root/.cache/pip/wheels/d1/6a/e7/529dc54d76ecede4346164a09ae3168df358945612710f5203\n", + "Successfully built openml liac-arff\n", + "\u001b[31mERROR: torchvision 0.5.0 has requirement torch==1.4.0, but you'll have torch 1.2.0 which is incompatible.\u001b[0m\n", + "Installing collected packages: liac-arff, xmltodict, openml, torch, openml-pytorch\n", + " Found existing installation: torch 1.4.0\n", + " Uninstalling torch-1.4.0:\n", + " Successfully uninstalled torch-1.4.0\n", + "Successfully installed liac-arff-2.4.0 openml-0.10.2 openml-pytorch-0.0.1 torch-1.2.0 xmltodict-0.12.0\n" + ] + } + ], + "source": [ + "!pip install openml openml_pytorch" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Tyo-7h5SguvU" + }, + "source": [ + "Let's import the necessary libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "IDuG2ztmguvb" + }, + "outputs": [], + "source": [ + "import torch.nn\n", + "import torch.optim\n", + "import openml\n", + "import openml_pytorch\n", + "\n", + "import logging" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "cdpxXA6Vguvm" + }, + "source": [ + "Set the apikey for openml python library, you can find your api key in your openml.org account" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "11zZHpx5guvn" + }, + "outputs": [], + "source": [ + "openml.config.apikey = 'key'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "WHfw7Ng9guvy" + }, + "source": [ + "Define a sequential network that does initial image reshaping and normalization model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 86 + }, + "colab_type": "code", + "id": "nlmQxq06guv1", + "outputId": "9f013408-a1b4-43f7-dd7e-56ba7594031a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sequential(\n", + " (0): Functional()\n", + " (1): BatchNorm2d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + ")\n" + ] + } + ], + "source": [ + "processing_net = torch.nn.Sequential(\n", + " openml_pytorch.layers.Functional(function=torch.Tensor.reshape,\n", + " shape=(-1, 1, 28, 28)),\n", + " torch.nn.BatchNorm2d(num_features=1)\n", + ")\n", + "print(processing_net)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "6xZJ4UY1guwA" + }, + "source": [ + "Define a sequential network that does the extracts the features from the image." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 156 + }, + "colab_type": "code", + "id": "26HniwCgguwE", + "outputId": "15ed0f7f-ae03-41e2-85d5-e77b2da6cdd8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sequential(\n", + " (0): Conv2d(1, 32, kernel_size=(5, 5), stride=(1, 1))\n", + " (1): LeakyReLU(negative_slope=0.01)\n", + " (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", + " (3): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1))\n", + " (4): LeakyReLU(negative_slope=0.01)\n", + " (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", + ")\n" + ] + } + ], + "source": [ + "features_net = torch.nn.Sequential(\n", + " torch.nn.Conv2d(in_channels=1, out_channels=32, kernel_size=5),\n", + " torch.nn.LeakyReLU(),\n", + " torch.nn.MaxPool2d(kernel_size=2),\n", + " torch.nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5),\n", + " torch.nn.LeakyReLU(),\n", + " torch.nn.MaxPool2d(kernel_size=2),\n", + ")\n", + "print(features_net)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ahCdZXo8guwK" + }, + "source": [ + "Define a sequential network that flattens the features and compiles the results into probabilities for each digit.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 139 + }, + "colab_type": "code", + "id": "J6ENeGJRguwN", + "outputId": "01f34f9f-0d53-434a-af3a-a17af5ad4a0a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sequential(\n", + " (0): Functional()\n", + " (1): Linear(in_features=1024, out_features=256, bias=True)\n", + " (2): LeakyReLU(negative_slope=0.01)\n", + " (3): Dropout(p=0.5, inplace=False)\n", + " (4): Linear(in_features=256, out_features=10, bias=True)\n", + ")\n" + ] + } + ], + "source": [ + "results_net = torch.nn.Sequential(\n", + " openml_pytorch.layers.Functional(function=torch.Tensor.reshape,\n", + " shape=(-1, 4 * 4 * 64)),\n", + " torch.nn.Linear(in_features=4 * 4 * 64, out_features=256),\n", + " torch.nn.LeakyReLU(),\n", + " torch.nn.Dropout(),\n", + " torch.nn.Linear(in_features=256, out_features=10),\n", + ")\n", + "print(results_net)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "BgYGnsD8guwV" + }, + "source": [ + " The main network, composed of the above specified networks." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 382 + }, + "colab_type": "code", + "id": "rNjNKjPqguwX", + "outputId": "e30af6e6-d0af-4774-a2ff-1c6e2a888df0" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sequential(\n", + " (0): Sequential(\n", + " (0): Functional()\n", + " (1): BatchNorm2d(1, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (1): Sequential(\n", + " (0): Conv2d(1, 32, kernel_size=(5, 5), stride=(1, 1))\n", + " (1): LeakyReLU(negative_slope=0.01)\n", + " (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", + " (3): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1))\n", + " (4): LeakyReLU(negative_slope=0.01)\n", + " (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", + " )\n", + " (2): Sequential(\n", + " (0): Functional()\n", + " (1): Linear(in_features=1024, out_features=256, bias=True)\n", + " (2): LeakyReLU(negative_slope=0.01)\n", + " (3): Dropout(p=0.5, inplace=False)\n", + " (4): Linear(in_features=256, out_features=10, bias=True)\n", + " )\n", + ")\n" + ] + } + ], + "source": [ + "model = torch.nn.Sequential(\n", + " processing_net,\n", + " features_net,\n", + " results_net\n", + ")\n", + "print(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "4I45-iX2guwf" + }, + "source": [ + "Download the OpenML task for the mnist 784 dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "ESrsSEa1guwh" + }, + "outputs": [], + "source": [ + "task = openml.tasks.get_task(3573)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "zaW2xEHqguwo" + }, + "source": [ + "Run the model on the task and publish the results on openml.org" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "PuZm9BPCguwq", + "outputId": "323a186a-d28c-45b0-d9a3-c47b336986a8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "URL for run: https://www.openml.org/api/v1/xml/run/10452577\n" + ] + } + ], + "source": [ + "\n", + "run = openml.runs.run_model_on_task(model, task, avoid_duplicate_runs=False)\n", + "\n", + "run.publish()\n", + "\n", + "print('URL for run: %s/run/%d' % (openml.config.server, run.run_id))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "PY64ePWYguwz" + }, + "source": [ + "By going to the published URL you can check the model performance and other metadata" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "_B2GVU9bguw2" + }, + "source": [ + "![](run.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Oo3rdpP2j-cv" + }, + "source": [ + "We hope that openml deep learning plugins can help in reproducing deep learning experiments and provide a universal reproducibility platform for the experiments.\n", + "Here are the links of all supported deep learning plugins right now:\n", + "\n", + "* MXNet: https://github.com/openml/openml-mxnet\n", + "\n", + "* Keras: https://github.com/openml/openml-keras\n", + "\n", + "* Pytorch: https://github.com/openml/openml-pytorch\n", + "\n", + "* ONNX: https://github.com/openml/openml-onnx\n", + "\n", + "There are examples of how to use these libraries in the Github repos. These libraries are in the development stage right now so we would appreciate any feedback on Github issues of these libraries. Links:\n", + "\n", + "1. https://www.wired.com/story/artificial-intelligence-confronts-reproducibility-crisis/\n", + "2. https://www.openml.org" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "DquJnZ4UkkFI" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "name": "DL Blog Post.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/blog/posts/2020-05-06-Reproducible-deep-learning-with-OpenML/run.png b/blog/posts/2020-05-06-Reproducible-deep-learning-with-OpenML/run.png new file mode 100644 index 0000000..b7fa23e Binary files /dev/null and b/blog/posts/2020-05-06-Reproducible-deep-learning-with-OpenML/run.png differ diff --git a/blog/posts/Experiments-with-temperature/experiments_with_temp.ipynb b/blog/posts/Experiments-with-temperature/experiments_with_temp.ipynb new file mode 100644 index 0000000..3c5c6f2 --- /dev/null +++ b/blog/posts/Experiments-with-temperature/experiments_with_temp.ipynb @@ -0,0 +1,682 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "toc: true\n", + "layout: post\n", + "description: Experimenting with LLM temperature and its effects on answer quality\n", + "categories: [llm]\n", + "title: Experiments with Temperature\n", + "# image: \n", + "author: Subhaditya Mukherjee\n", + "date : 2024-07-08\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Over the past few months at OpenML, we have been experimenting with LLM models in an attempt to improve the search experience for our users. While our existing implementation uses ElasticSearch, we wanted to also have the option of having a more \"semantic\" search experience. \n", + "\n", + "Aside from the usual RAG pipeline that everyone and their grandparents seems to be using these days, we also wanted to experiment with using an LLM to semi-automatically generate filters for our search queries. While it may not seem like a big feature, it is something that has always been a bit of an annoyance for some of our users. \n", + "\n", + "So what does this entail? Consider the interface we have at the moment. We have a search bar at the top, and subsequently a bunch of filters that users can use to narrow down their search. While this works pretty well as is, how about trying to automate it a bit.\n", + "\n", + "In summary, we want a query like \"find me a large dataset with multiple classes of flowers\" to automatically generate filters like \"classification\", \"multiclass\", \"sort by size of dataset\" etc.\n", + "\n", + "![](search.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Temperature\n", + "\n", + "Think about the first time you used ChatGPT. What stood out to you? Was it how well it could elaborate on a topic? Or was it how creative it could be? The temperature parameter in LLMs is what controls this. \n", + "\n", + "How can we control creativity? Well, saying that we can directly control creativity is a bit of a stretch. We can however use a workaround.\n", + "\n", + "Do you remember the softmax function? The function that takes a vector of arbitrary real-valued scores and squashes it into a vector of probabilities that sum to 1. The inputs to the softmax function are the unnormalized log likelikhoods or the raw per class score assigned by the model. \n", + "\n", + "The softmax function is defined as:\n", + "$$ \\text{softmax}(x_i) = \\frac{e^{x_i}}{\\sum_{j=1}^{k} e^{x_j}} $$\n", + "\n", + "If we want more control over the distribution of the probabilities, we can use a temperature parameter. This would look like:\n", + "$$ \\text{softmax}(x_i) = \\frac{e^{x_i/T}}{\\sum_{j=1}^{k} e^{x_j/T}} $$\n", + "where $T$ is the temperature parameter.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- If $T = 1$, the softmax function is the same as the original softmax function.\n", + "\n", + "- If $T > 1$, the probabilities will become \"flatter\". Since the difference between the probabilities will be less, the model can be more exploratory aka more creative.\n", + "\n", + "- If $T < 1$, the distribution of the probabilities are \"peakier\". There will be a higher difference between the probabilities, leading to the model being more confident in its predictions, but also less creative." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualizing Temperature using Softmax" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm\n", + "import regex as re\n", + "# LangChain supports many other chat models. Here, we're using Ollama\n", + "from langchain_community.chat_models import ChatOllama\n", + "from langchain_core.output_parsers import StrOutputParser\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from typing import List, Dict, Any\n", + "import numpy as np \n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd \n", + "sns.set_theme(style=\"white\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "def softmax(input, t=1.0):\n", + " ex = np.exp(input/t)\n", + " sum = np.sum(ex, axis=0)\n", + " return ex / sum" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAr8AAAImCAYAAABacOJlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAACLbElEQVR4nOzdeXhU1f3H8ffMJDOTfd8I+yIIympABBTRInWpe+uOWrQuLYq71SJoW7XQUhFBtCq1FfVnVSqKS8UNF1ZxQfY9kBWyJ5OZZOb+/piFhARIQpLJ8nk9zzz3zr1nZr4zE+DDybnnmAzDMBARERER6QTMwS5ARERERKS1KPyKiIiISKeh8CsiIiIinYbCr4iIiIh0Ggq/IiIiItJpKPyKiIiISKeh8CsiIiIinYbCr4iIiIh0Ggq/IgKA1rtpGn1uHYO+x+ahz1HaA4VfkXZg69atTJs2jTFjxnDSSScxduxY7rzzTjZv3tyk55s1axYjR45k6NChLFmyhOXLl3P//fc3c9XN69prr6V///5HvP3444+tXtP8+fN54YUXAveffvpp+vfv3yqvXV1dzQMPPMCwYcMYPnw4K1eubNbnf+utt+p8xieffDITJkzgD3/4Azk5ObXaH/7ey8rKuOWWWxgyZAgZGRns3r2bRYsWMWbMGAYPHsz8+fObtd6mKikp4b777mPt2rX1nq+srGTEiBHcfPPNR3yOAwcOMGjQIJ566qljvt6+ffvo378/b731VpNrbm31fZeHy8nJ4eabb2b//v2tX6BII4UEuwARObpt27bxq1/9iqFDh/Lwww+TkJBATk4O//73v/nlL3/Jyy+/zNChQxv8fFu3buUf//gHv/zlL7nwwgvp3bs3d9xxR8u9gWY0cOBAHnnkkXrP9enTp5Wrgaeeeorf/va3gfuXX34548aNa5XXXrFiBW+//Ta33XYbp512GgMHDmyR15k3bx5JSUkAOBwOtm3bxnPPPcfHH3/M66+/Tvfu3YG6733JkiV8+umnTJ8+nX79+pGYmMiTTz7J+PHjufHGG+natWuL1NtYmzZt4r///S+XXnppveftdjvnnXceb775JgUFBcTHx9dps3TpUtxu9xGfo707/Lus77v7+uuv+fzzz4NQnUjjKfyKtHEvvfQScXFxPP/884SEHPoje/bZZzNp0iTmz5/Pc8891+DnKyoqAuC8887jlFNOae5yW1RkZGSjgn5rS01NJTU1tVVey/89XnLJJXTr1q3FXufEE0+sFXZGjx7NhAkTuOSSS3jkkUd46aWXgLrv3V/fVVddhclkYv/+/Xg8Hs4++2wyMjJarN6WcNlll/H666/z/vvvc/XVV9c5//bbbzN69Og2E+ib2+HfpUh7p2EPIm3cgQMHMAwDj8dT63h4eDi///3v+fnPf17r+LJly7jkkksYNmwYY8aMYfr06RQXFwPeX01fe+21AEyePJkJEyZw7bXXsnr1alavXk3//v1ZtWoVq1aton///nzzzTdce+21DB48mPHjx/PGG2+Ql5fHb3/7W4YNG8YZZ5zBokWLar3+5s2b+e1vf8upp57KoEGDGDduHH/84x+prKwE4OWXX67za9+VK1cyYMAAnnnmmeP+vPr378/TTz9d69jhv5J/4IEHuP7663nzzTc555xzOOmkk7jwwgv54osvaj1u586d/Pa3v2XkyJFkZGTwm9/8hh07dgReB7w9o/79+oY9HO378D/mZz/7GZ999hkXXHABJ510Eueccw5Lliw54nt84IEHeOCBBwDvf4L836nT6eSZZ55h0qRJnHzyyUycOJHnnnuu1s/Otddeyz333MPUqVMZOnQoN9xwQ4M+15q6du3Kr371K77++mv27t1b571fe+21ge9gwIABTJgwgQkTJgDw+9//vtZn9PHHH3PJJZdw8sknM2bMGP74xz9SUVFR5/OZN28eI0eOZOzYsYHP74033uC8887jpJNOYvz48Tz99NO43e5an9PRvudVq1Zx3XXXAXDdddcFPsfDDR48mH79+rF06dI65zZt2sSWLVu47LLLgGP//B/uSENlDv85djqd/OUvf+GMM87gpJNO4oILLmDZsmW1HrNhwwYmT57MiBEjGDZsGNdffz3fffddva9b83mP9jNz+Hfp/7mr6a233uLBBx8E4Kyzzqq3jUhbovAr0saNHz+erKwsrrjiCl555RV27NgRuKhk0qRJXHzxxYG28+fP56677mLo0KHMnTuX22+/nQ8//JBrr72WyspKLr/8cqZPnw7A9OnTmTdvHo888ggDBw5k4MCBvP766wwaNCjwfHfddRcTJkxg4cKF9OrVi0ceeYTrrruOfv36MX/+fAYPHszjjz/ODz/8AEBeXh5XX301DoeDJ554gueff57zzjuPf/3rX7z88suA9x/TjIwMnnzySQoKCigrK+P3v/89Q4cO5ZZbbjnqZ2EYBtXV1XVuTbnIZsOGDbzwwgtMnTqVZ555BovFwu9+97tAsMrNzeVXv/oVu3fvZsaMGcyaNYsDBw4wefJkioqKeP3114FDvYL1Odb34Zefn8+jjz7Kddddx3PPPUfXrl25//77A0H7cLfddhu33norQOA7NAyDW265hX/84x9cfvnlPPvss0yaNIm///3vdYaKvP/++0RERLBgwQKmTJnS6M8OYMyYMQCsW7euzrlHHnkkEAZff/115syZw7x58wC49dZbA5/X0qVLuf322+nduzfPPPMMv/3tb3nnnXe47bbban2nWVlZfP7558yZM4cHH3yQmJgYFi5cyB/+8AdGjx7Ns88+y9VXX83zzz/PH/7wh1q1HO17HjRoUK0/D0caUgNw6aWXsn79ejIzM2sdX7JkCbGxsfzsZz9r0M9/UxiGwe23385rr73GDTfcwIIFCxg2bBjTpk0L/CeprKyMKVOmEBcXx9NPP82cOXNwOBz8+te/prS09IjPe6yfmcO/y9tuu63O84wfP77Wz2N9bUTaEg17EGnjrrrqKvLz83nhhRd49NFHAYiLi2Ps2LFcd911DB48GIDi4mIWLFjAL3/5y8A/6AAnnHACV199NW+++SZXX301ffv2BaBv376BcaKRkZEAdYYUXHrppYGewfDwcH75y18yePDgwBjhAQMG8NFHH/Htt98yePBgtm7dyoknnshTTz0VeM7TTjuNr776ilWrVnHzzTdjMpl4/PHH+cUvfsGsWbOwWCwUFRXxz3/+E4vFctTPYs2aNbXCud/f/vY3zjvvvEZ9rqWlpbz11luBMavh4eFcc801rFy5knPOOYdFixbhcrl46aWXAmNeBwwYwJVXXsn333/PGWecAXh/3V/fUIyGfh/gHUv7pz/9idGjRwPQs2dPzjzzTD7//PN6xzJ37949ULd/WMLnn3/O119/XeuzGDNmDHa7naeeeirwnxaA0NBQZs6cidVqbdRnVpP/M8nPz69zrm/fvoEhEP7PZt++fYHahw4dimEYzJ49m3HjxjF79uzAY3v27Mn111/P559/zvjx4wHvxX33339/YJhOaWkp8+fP51e/+hUPP/wwAGPHjiU2NpaHH36YG264IfBej/U91/zz4N+vz4UX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+OGHH5g7dy7jxo0jPj6e4cOH4/F4uP3227n55puJiIjg/fffp7S0lIkTJ9b72s35M+Pvjf/f//7H6aefHpRFZ0QaSuFXpI0bP348//d//8cLL7zAs88+S0FBAVarlYEDBzJnzpxa/7D97ne/IzExkX//+9+8/vrrxMbGMmnSJO68807Cw8OP+BpXX301GzZs4KabbuLxxx8nOTm5SbX+5je/obCwkJdffplnnnmGtLQ0LrzwQkwmEwsXLqSkpISZM2ficDhqjfOcPn065557Lg899FCt5YKb4sEHH6S6uponn3ySkJAQzj33XO6+++7ArAANlZaWxuLFi5k1axYPPPAAVquVUaNGMWfOnMB/Nm655Rbmz5/PTTfdVGfOVWj699EU/s947ty5LFq0iIKCArp27cpdd93VpLl8/WquYBcaGkp6ejo/+9nPuPnmm2tdDNgUl19+OREREfzjH//g9ddfJzw8nOHDhzN79uxjDgu58847SUpKYvHixfzjH/8gJiaG0aNHc9ddd9U7s8GR9OvXj/PPP59XXnmFFStW1OmpP1zPnj3JyMhgzZo1/OlPf6p1riE//4fr1asXTz75JAsWLODmm2+mT58+PPbYYzz22GOBNmazmeeee46nnnqKhQsXcvDgQVJSUrjhhhu4/fbbAUhOTuYf//gHTz31FA899BAOh4N+/frx9NNPc+qpp9b7XprzZ2bUqFGcdtpp/PWvf+Wbb75p1MI7Iq3NZDRlgkwRERERkXZIg3REREREpNNQ+BURERGRTkPhV0REREQ6DYVfEREREek0FH5FREREpNNQ+BURERGRTkPz/DbAKaecgsvlOu45LUVERESkZeTn52O1Wlm7du1R2yn8NoDT6cTtdge7DBERERE5gurqahqyfIXCbwP4V7tavnx5kCsRERERkfqcddZZDWqnMb8iIiIi0mko/IqIiIhIp6HwKyIiIiKdhsKviIiIiHQaCr8iIiIi0mlotodm5Ha7qaqqCnYZbVpoaCgWiyXYZYiIiEgnpfDbDAzDICcnh6KiomCX0i7ExsaSmpqKyWQKdikiIiLSySj8NgN/8E1OTiY8PFyh7ggMw6CiooK8vDwA0tLSglyRiIiIdDYKv8fJ7XYHgm9CQkKwy2nzwsLCAMjLyyM5OVlDIERERKRV6YK34+Qf4xseHh7kStoP/2el8dEiIiLS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5WYATho7AJPJFORqgk/hV0RERKQD2/DlJgAGjRkQ5EraBoVfERERkQ7K7Xaz8eutgLfnVxR+RURERDqsXT/upaLUQXh0GL1O7h7sctoEhV8RERGRDso/3nfQaf2xWDr34hZ+Cr8iIiIiHdRPX/nCr8b7Bhx3+HU6nRw4cIDq6urmqEdEREREmoFhGPy4wnuxm8b7HhLSlAd9/vnnLF26lJUrV3Lw4EEATCYTiYmJjBs3jp///OeMHTu2WQsVERERkYbL3ZPPwaxCQkItWta4hkaF35UrV/L444+zbds2hg4dynnnnUd6ejphYWGUlJSQk5PDunXrWLJkCf379+fuu+9mzJgxLVW7iIiIiByBf7xvvxG9sYfbglxN29Hg8Dtz5kw++eQTJk+ezHnnnUdKSsoR2+bn5/N///d/PPDAA5x11lnMmDGjOWoVERERkQba4B/yoPG+tTQ4/MbFxfHhhx9it9uP2TYpKYnbb7+d66+/nueff/64ChQRERGRxtvwlX9ltxODXEnb0uDwO3Xq1EY/eUREBHfeeWejHyciIiIiTVdysJQ9G/cBMGhM/yBX07Y0abaHBQsWYBhGvedyc3O56aabjqsoEREREWm6n77eAkD3E9OJSYwOcjVtS5PC79y5c7nmmmvYv39/reNvv/02559/Pt99911z1CYiIiIiTeC/2E3jfetqUvh96aWXyM7O5sILL2TJkiXk5+dzyy238OCDDzJq1Cjefffd5q5TRERERBpI432PrEnz/J566qm88847PPnkkzz44INYrVbi4uKYN28eZ599dnPXKCIiIiIN5HQ42bpmO6DFLerT5BXeqqurcbvdgHcFEZfLRWVlZbMVJiIiIiKNt3XtTqqr3MSnxZHaKznY5bQ5TQq/S5Ys4ec//zkffPABf/jDH/jiiy8YPXo099xzDzfffDPZ2dnNXaeIiIiINEBgvO/YAZhMpiBX0/Y0Kfw+8MAD9O3bl//+979cddVVxMbG8te//pW5c+eyYcMGzj///OauU0REREQa4McvtbjF0TQp/D700EP861//olu3brWOT5w4kXfffZdx48Y1S3EiIiIi0nBut5uNvmnOTh6ni93q0+DwW1hYGNi/9tprj9guPj6ev//97/U+TkRERERazp6f9lFeXEF4VBi9Tu4e7HLapAaH30svvZR//etfVFVVNai9w+Hg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LBYLL7zwAqGhoWRnZzN27FiWLVsGgMlkYt68eXTt2pXJkydz5513cvrppx9xkQsRERGR9sI/5GHExCGERTTst+jSeCbDMIymPLCsrIwdO3bQr1+/wMVlH374IcOHDycpKalZiwy2s846C6DBs1iIiIiINNZNg+9i94ZM7nnxNs65/sxgl9PuNDSvNXme38jISIYMGVLr2DnnnNPUpxMRERHptHb9uIfdGzIJtYYw5iJNcdaSNHOyiIiISJB98upXAIw8dxiRsRFBrqZjU/gVERERCSLDMPj01S8BOPPKcUGupuNT+BUREREJoo3fbCV3Tz5hkXZOPX94sMvp8BR+RURERILok8UrAO9yxrYwW5Cr6fgUfkVERESCxF3t5os3vgFgwpVjg1xN56DwKyIiIhIk3y7/kaL8EmISoxh21snBLqdTUPgVERERCRL/hW6nX34aIaFNnoFWGkHhV0RERCQInA5nYFW3CVdpyENrUfgVERERCYJV731LRamD5O6JDBx9QrDL6TQUfkVERESC4BP/3L5XjMFsViRrLfqkRURERFpZWVE5q5etB2DCVVrYojUp/IqIiIi0si/fXk2Vs4oeA7vS6+TuwS6nU1H4FREREWlln77qXdjizCvHYjKZglxN56LwKyIiItKKCnIK+e6TDYAWtggGhV8RERGRVvTZa1/j8RgMGNWPtN4pwS6n01H4FREREWklhmHw/ovLATj7mtODXE3npPArIiIi0kq2rNnO7g2ZWO2hWtgiSBR+RURERFrJBy98AsC4S08lKi4yyNV0Tgq/IiIiIq3AUV7Jp699BcCkGycEuZrOS+FXREREpBWs+M9KKkodpPVOYfAZA4NdTqel8CsiIiLSCj540Tvk4ZwbztRyxkGkT15ERESkhe3bmsWPKzZhNps45/rxwS6nU1P4FREREWlh/l7fUyYNJTE9IcjVdG4KvyIiIiItyF3t5n8vfw7ApBvPCnI1ovArIiIi0oJWLfuWgpwiYpNjOPX84cEup9NT+BURERFpQe+/4F3R7WfXnk6oNTTI1YjCr4iIiEgLOZhdyOpl6wGY9GsNeWgLFH5FREREWsj//vkZHreHgaf1p/uA9GCXIyj8ioiIiLQIwzD44KVPAfi5VnRrMxR+RURERFrAd59uYP+2bMIi7Zzxy9HBLkd8FH5FREREWsCSp98H4OxrzyAs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PW8PxWoPxWr3HQurvbWFW7GH27CF2wL7obZQzWQgItIIQQ2/DocDoM7YXpvNRnFxcb3t6xsHbLPZcDqdVFZWHvH5nE5nc5XdoipKKlj+7y+oclUHuxTpBEwmEyYTmMzmWluz2YzJbPKer7E1m02YzGbMZhP4Hmu2mAPtzWYTZosZk8m3NZtqnTOZzb72tc+bLYduFv/xGvdrnjebDx2zhFgOtQs5dKzm8ZBQS+CYJeTQeUuoJXAuJNSC2bcNCQ2pcy7EGkJIaIhva6m1tVgswf4aRUSkEYIafu127+TiLpcrsA/gdDprzd5Qs73LVfeCDKfTSXh4ODabLfB8h5+v7/naooiYCJ7f8Df2bc2u93xjeniO2PQIJ4703PUdPmIdx3iOmo878nPU/zq19+u+Xr3nj9CmVj1HeNyhtiYwHXa/nhr8QbLO/cNex2Tyn6v7vP7H17tf43kCz+EPpjXaHwqmR2hXY19ERKSzCWr49Q9hyMvLo3v37oHjeXl59O/fv0771NRUPv7441rHXC4XRUVFJCcnExsbS3h4OHl5ebXa5OXlkZKS0gLvoGWk900jvW/asRuKiIiISKOYg/niAwYMIDIyklWrVgWOlZSUsHHjRjIyMuq0z8jIICcnhz17Do2HXb16NQAjRozAZDIxfPjwwDG/VatWccopp7TQuxARERGR9iKoPb9Wq5VrrrmG2bNnEx8fT3p6OrNmzSI1NZWJEyfidrspKCggKioKu93OkCFDGD58ONOmTWPGjBlUVFQwffp0LrrookDP7g033MDNN9/MwIEDOf3003nzzTfZtGkTf/rTn4L5VkVERESkDQhqzy94F6247LLLePjhh7nyyiuxWCy88MILhIaGkp2dzdixY1m2bBngHbs4b948unbtyuTJk7nzzjs5/fTTmTFjRuD5xo4dy5///GdeffVVLr74YlauXMmzzz6rBS5EREREJLiLXLQXWuRCREREpG1raF4Les+viIiIiEhrUfgVERERkU5D4VdEREREOg2FXxERERHpNBR+RURERKTTUPgVERERkU5D4VdEREREOg2FXxERERHpNBR+RURERKTTUPgVERERkU5D4VdEREREOg2FXxERERHpNBR+RURERKTTCAl2Ae1BXl4ebrebs846K9iliIiIiEg9srOzsVgsx2ynnt8GsNlshITo/wkiIiIibVVI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", + "text/plain": [ + "
    " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot softmax over a range of inputs\n", + "x = np.arange(0,1.0, 0.01)\n", + "t = np.array([0.1,.5, .8, 1.0])\n", + "y = np.array([softmax(x, ti) for ti in t])\n", + "\n", + "# Create a DataFrame for Seaborn\n", + "data = pd.DataFrame({\n", + " 'x': np.tile(x, len(t)),\n", + " 'softmax': np.concatenate(y),\n", + " 't': np.repeat(t, len(x))\n", + "})\n", + "\n", + "# Plotting with Seaborn\n", + "plt.figure(figsize=(8, 6))\n", + "sns.lineplot(data=data, x='x', y='softmax', hue='t', palette='viridis')\n", + "plt.xlabel('x')\n", + "plt.ylabel('softmax(x)')\n", + "plt.title('Softmax Function for Different Values of t')\n", + "plt.legend(title='t')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating the Experimental Setup\n", + "Now, we can focus on testing the effects of temperature for our use case. We are using the `llama3` model for our experiments. The experiments are being run on a 2023 MacBook Pro with an M3 chip and 18GB memory." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Defining a Prompt\n", + "We need to first think of a prompt that we can use for our experiments. This prompt can be thought of as an instruction that the model uses along with the query to generate answers. To make it easier for us to use, we only want one/two word answers and for now we are only focusing on a small subset of the filters that we want our model to understand." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "prompt = \"\"\"User Query : {query}\n", + "Based on the query, answer the following questions one by one in one or two words only and a maximum of two with commas only if asked for. Use only the information given and do not make up answers - \n", + "Does the user care about the size of the dataset? Yes/No and if yes, ascending/descending.\n", + "Does the user want to sort by number of downloads? Yes/No.\n", + "Does the user care about missing values? Yes/No.\n", + "If it seems like the user wants a classification dataset, is it binary/multi-class/multi-label? If not, say none.\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "query = \"Find me a big classification dataset about mushrooms\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating a Chain\n", + "Since we are using the `langchain` and `ollama` libraries for our experiments, we follow their API and create a chain. The template uses string formatting to insert the prompt and the query into the chain." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "def create_chain(prompt , temperature, llm_model = \"llama3\"):\n", + " prompt = ChatPromptTemplate.from_template(prompt)\n", + " llm = ChatOllama(model=llm_model, temperature=temperature)\n", + " chain = prompt | llm | StrOutputParser()\n", + " return chain" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Parsing the Results\n", + "To make it easier for us to analyze the results, we generate an example answer and then see see if any further processing is needed." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "# functiont to parse responses like this to a list of yes/no/none/yes,aescending/no etc\n", + "def parse_response(response):\n", + " # split by new line and remove first two lines (here are the answers:)\n", + " response = response.split('\\n')[2::]\n", + " # if response has a question mark, split by question mark and remove empty strings\n", + " for i in range(len(response)):\n", + " if '?' in response[i]:\n", + " response[i] = response[i].split('?')[1].strip()\n", + " # replace full stops with empty strings\n", + " response = [x.replace('.','') for x in response]\n", + " response = [x for x in response if x]\n", + " return response" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Here are the answers:\n", + "\n", + "1. Does the user care about the size of the dataset?\n", + "Yes, ascending.\n", + "\n", + "2. Does the user want to sort by number of downloads?\n", + "No\n", + "\n", + "3. Does the user care about missing values?\n", + "No\n", + "\n", + "4. Is it a classification dataset? If so, is it binary/multi-class/multi-label?\n", + "Yes, multi-class\n" + ] + } + ], + "source": [ + "chain = create_chain(prompt, 0.5)\n", + "response = chain.invoke({\"query\": query})\n", + "print(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Yay, it works. We now write a function to generate results for different temperatures." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_results_for_temp(query:str, range_of_temps : np.ndarray) -> List[List[str]]:\n", + " results = []\n", + " for temperature in tqdm(range_of_temps):\n", + " chain = create_chain(prompt, temperature)\n", + " response = chain.invoke({\"query\": query})\n", + " results.append(parse_response(response))\n", + " return results\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running the Experiments and Plotting Results\n", + "It is time to run the experiments and plot the results. \n", + "We write a function to plot the results in a `stripplot` to see the distribution of the answers for different temperatures." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_yes_no(df: pd.DataFrame, title:str) -> None:\n", + " fig, axs = plt.subplots(2, 2, figsize=(15, 15))\n", + " fig.suptitle(title)\n", + " sns.stripplot(data=df, x='size', y='temperature', ax=axs[0, 0], hue='size')\n", + " sns.stripplot(data=df, x='sort_by_downloads', y='temperature', ax=axs[0, 1], hue='sort_by_downloads')\n", + " sns.stripplot(data=df, x='missing_values', y='temperature', ax=axs[1, 0], hue='missing_values')\n", + " sns.stripplot(data=df, x='classification_type', y='temperature', ax=axs[1, 1], hue='classification_type')\n", + " # tilt x axis labels\n", + " for ax in axs.flat:\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sometimes, the model returns an extra field, we combine the last two fields to plot the results. (This is a bit of a hack, but it works for now and is ONLY used for plotting)" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [], + "source": [ + "def combine_last_two_elements(lst):\n", + " # Check if the list has at least two elements\n", + " if len(lst) > 4:\n", + " # Combine the last two elements with a space separator\n", + " combined_element = lst[-2] + ' ' + lst[-1]\n", + "\n", + " # Create a new list with combined element instead of the last two\n", + " return lst[:-2] + [combined_element]\n", + " else:\n", + " return lst" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Experiment 1\n", + "Out first experiment is a rather simple query, \"Find me a big classification dataset about mushrooms\". As you can probably guess, we are looking for a dataset that is large, is a classification dataset and is about mushrooms." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 20/20 [00:49<00:00, 2.49s/it]\n" + ] + } + ], + "source": [ + "range_of_temps = np.linspace(0, 1, 20)\n", + "query = \"Find me a big classification dataset about mushrooms\"\n", + "results1 = generate_results_for_temp(query, range_of_temps)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "results1 = [[y for y in x if all(sub not in y for sub in [\"If\", \":\"])] for x in results1]" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n", + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n", + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n", + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABNUAAAWQCAYAAAB9NHJ5AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeZid88E+8HuyTBZJECSRBLElQYhYQkhsIZbSolpLKW15S6mt+9uFqvq1Ra1VpWjtLapqSYXYi4h9jTUiyEZC9kySOb8/8mZqzIR5sszJJJ/Pdbku832ec859zplz5vvceZaKUqlUCgAAAADQYM3KHQAAAAAAmhqlGgAAAAAUpFQDAAAAgIKUagAAAABQkFINAAAAAApSqgEAAABAQUo1AAAAAChIqQYAAAAABSnVAAAAAKAgpRoAtfzjH/9Ir169Pve/e++9t9b6f/nLX5ZqjnvvvTe9evXKRRddtFTvd3k1YsSI9OrVK7/+9a8btH6vXr3ypS99aRmnWv4e+9MW9bpddtll2WWXXdKnT58MGjQob7zxRnr16pXvfOc7yzzT6NGjM3To0Fpjy9Nr9klL43NW3/NdHjzyyCN5/vnnl+p9HnHEEenVq1emTp26VO+3qGnTpuXaa68ta4Ylsaz+bgBAY2tR7gAALJ/69++f/v37L3L5+uuvnyTZZJNNcsIJJ2TLLbdspGQkyQknnJA111yz3DHKrlu3bjnhhBPSt2/fmrGHH3445557bjp16pSvf/3radWqVTp16pQTTjghG2ywwTLNM2rUqBx00EE59NBDs/fee9eMr6jv16Keb7ldf/31+eUvf5k//OEP5Y6yTOy5555Za621cvjhh5c7CgCs1JRqANSrf//++e53v/u5622yySbZZJNNGiERn9SQ92Zl0L179zqvxcsvv5wkOfHEE/OVr3ylZrwxXrOPP/44c+fOrTO+or5fi3q+5fbhhx+WO8Iy9eGHH2attdYqdwwAWOk5/BMAWKFUVVUlSVZfffUyJwEAYEWmVANgidR3bpzddtstRxxxRN58880ce+yx2XrrrdOvX78cc8wxGTVqVJ37ePLJJ3PkkUdm6623zg477JDf/OY3mT17doMe/913302vXr1yySWXZNiwYTnggAOyxRZbZLfddstVV12VJHnqqady2GGHZcstt8xuu+2Wiy66KPPmzat1P6VSKTfccEPN7bfddtsce+yxNXs9NcRTTz2VE044IQMHDkyfPn2y7bbb5hvf+EYef/zxBt9Hktxwww0ZMmRINt988+y333658cYb66xT3zm6Pvjgg/ziF7/IoEGD0rdv3xx22GF5+umnc9RRR2W33XZr0GOPGjUqp5xySnbcccf069cvBxxwQG6++eaUSqXPvN3kyZPz29/+NnvvvXf69u2bvn375gtf+EIuvfTSOq/1I488kiOPPDIDBgzIFltskf322y9/+tOfasqwIut9+pxqvXr1ysUXX5wkOf7449OrV6/84x//qPk9+fQ51SZPnpyzzjoru+22W7bYYovsueeeOe+88zJjxoxa67322mv5wQ9+kJ133jl9+vTJVlttlUMOOSR33313zToXXXRRvv71rydJrr766vTq1SsjRoyoyfXp92vatGn53e9+l9133z19+vTJDjvskO9973sZPXp0rfUWfsYee+yxXHHFFRkyZEj69OmT3XffPX/84x8zf/78z3xvFiryOVvS55sk//znP3PEEUdk2223TZ8+fTJw4MB873vfy9ixY2s91gcffJD//d//zR577JHNN988AwcOzA9+8IOMGTOmTq4xY8bk+9//fnbYYYf06dMne++9d/70pz/V2lvuiCOOqPM78HmKfnbff//9HH/88enXr1+22267ep9X0vD3+KKLLqp1rspP2m233bLNNtsk+e/ve7Lgs/p558NbuP5tt92Wv//979l7772z+eabZ6+99sptt92WJBk+fHgOPPDA9O3bN3vuuWeuu+66Wvfx4x//OL169corr7xS5/7r+72+4447csghh2TbbbdNv3798uUvfznXX399vd8hpVIpV111Vfbcc8/06dMngwcPziWXXFLrO2Phc7j++utz6qmnZosttsjAgQPz1FNPFXqNkwWF+6WXXpp99tknffr0yXbbbZfjjjsuL7zwwlJ/3ZLkmmuuyYEHHph+/fplq622ymGHHbZcnn8QgMXn8E8Alolx48blkEMOSY8ePfLVr341o0ePzv33359nn302d999dzp27Jgkeeihh/Kd73wnlZWV2XPPPdO8efPceuutueOOOwo93rBhw3LJJZdkr732yjbbbJN//etf+c1vfpP33nsvf/vb37LTTjvl0EMPzb///e9cfPHF6dChQ4488sia2//oRz/Kbbfdlo033jiHHHJIZs2alaFDh+aQQw7Jn/70pwwYMOAzH//ee+/NiSeemI4dO2b33XfPKqusktdffz0PPfRQnnjiidx8880NOkx26NChmTJlSvbee+8MGjQow4cPz2mnnZZ333033//+9xd5uylTpuSwww7LmDFjMnDgwPTq1SuPP/54jjzyyKy22mpp2bLl5z72Y489lmOPPTbz58/P4MGD07Vr1zzwwAP56U9/mvfffz8nnnhivbebNm1avvrVr2bcuHHZbbfdsvvuu2fy5Mm55557ct555+Xjjz/Oj370oyQLip1jjz02q6++evbZZ5+0atUqjz76aH7/+99nzJgxOeusswqt92knnHBCnnjiiTzxxBPZZ599ssEGGyzydZ80aVIOPvjgvPfee9luu+2y55575uWXX86ll16a5557Ln/+85/TokWLPP/88zniiCNSWVmZIUOGpGPHjhkzZkyGDx+eE088MZdeeml23XXX9O/fPwcccEBuvfXW9O3bN4MGDUq3bt0W+X4deuihGT16dLbccssMHjw4Y8eOzV133ZUHHnggV155Za3zxCXJ2WefndGjR2evvfbKrrvumjvvvDPnn39+Zs+enVNOOeUz39sin7Ol8Xx/+9vf5sorr0zv3r1zwAEHpKKiIiNHjswdd9yRp556Kv/+97/TunXrzJkzJ8ccc0xee+217LHHHtlrr73yzjvv5M4778wjjzySoUOHZrXVVkuSvPTSSznyyCMze/bsDBkyJF27ds2TTz6Z3//+9xk5cmT+9Kc/pXnz5jnggAOSpNbvwGdZnM/u0UcfnXbt2uWQQw7J6NGjc8cdd+Sxxx7LzTffnK5duy72e/x5Fp5D8OKLL86aa66ZQw455DPPfbnQVVddlTFjxuQLX/hCtt9++9x666354Q9/mFGjRuWaa66p9b15xhlnpHPnztl9990LZUuSO++8M9/73vfSo0ePHHDAAWnWrFmGDx+eX/7yl5kyZUqOP/74WutffvnlmTVrVvbee+/stNNOGTZsWC644IJ8/PHH+clPflJr3T/84Q9p27ZtDj/88LzxxhvZbLPNCr3Gc+bMyTe+8Y089dRT6dmzZw499NB88MEHuffee/Pwww/n/PPPr/Ocl+R1u+yyy3Luuedms802yyGHHJK5c+fm3//+d04++eTMmTMn+++/f+HXF4DlUAkAPuGWW24p9ezZs3T44YeXLrzwwnr/Gzt2bJ31r7rqqpqxXXfdtdSzZ8/SL3/5y1J1dXXN+M9+9rNSz549S9dff32pVCqV5s2bV9ptt91KW265ZenVV1+tWW/MmDGlHXbYodSzZ8/ShRde+Jl5x44dW+rZs2epZ8+epXvuuadm/OGHH64Zv/baa+usf9BBB9WM3XXXXaWePXuWTj311NLcuXNrxt95551S//79S4MGDSrNmTPnM3Psueeepf79+5cmTZpUa/yyyy4r9ezZs3Tuued+5u0ff/zxmrz33ntvzfjkyZNLX/jCF0q9e/cuvfnmmzXjPXv2LH3xi1+s+fmMM84o9ezZs/TnP/+5Zmz+/Pmlk046qdSzZ8/Srrvu+pmPP2/evNKuu+5a2nzzzUtPP/10zfjs2bNL++23X2nTTTctffDBB/U+9p/+9KdSz549S3//+99r3ef7779f6tOnT2nHHXesGfvud79b6tmzZ+mdd96pGauqqip96UtfKm2yySaladOmFVpv4et25pln1qx34YUX1vl9WPi+H3fccTVjP/jBD+r87pZKpdLPf/7zUs+ePUt33313qVQqlb75zW+WNt1009Ibb7xRa70777yz5vdmofry1Pea/eQnPyn17NmzdN5559Va74EHHij16tWrNGTIkNK8efNKpdJ/P2Nbb7116e233671nDbbbLPSDjvsUPosRT9nS/p8x48fX+rdu3fpa1/7Ws1zWOiYY44p9ezZs/Twww+XSqVS6b777iv17NmzdMEFF9Ra789//nOtz251dXVp3333LW2++ealF154oda6Z511Vp3PeX2/A4tS5LN7+OGHl3r27Fk6+OCDS7Nnz64Zv+GGG+q8NkXe48/Ku+uuu5a23nrrWmOf/n1alIXvzyabbFLrdbvxxhtrvm/uv//+mvERI0aUevbsWTrppJNqxn70ox+VevbsWXr55Zfr3P+ncxxwwAGlLbfcsubzWSqVStOmTSvtuOOOpe23377m78HC3+ktt9yy1vfa+PHjS1tssUVpm222Kc2fP7/Wc+jbt29p4sSJtR6/yGt88cUXl3r27Fn68Y9/XOt7/sUXX6x5zE9/ryzJ69a/f//S7rvvXuuxxo0bV+rTp0/pwAMPrPNaAtA0OfwTgHo98cQTufjii+v977333mvQfRxzzDGpqKio+XnnnXdOkprbP/fcc3n33XdzwAEHpGfPnjXrrbvuurX2ImuIbt261drLYKuttkqStG3bNoccckjNePfu3bPmmmvWeg4333xzkuSnP/1pWrT4707c66yzTg455JBMmDAhjz766CIfu7q6Ot/73vfyu9/9rs4VHrfbbrskDT9xev/+/TN48OCan1dfffUcd9xxqa6uzp133lnvbebPn5/bb7893bp1y1FHHVUz3qxZs/zwhz9M8+bNP/dxn3322bz33nv50pe+lH79+tWMt2rVKj/+8Y9zwgknZM6cOfXeduDAgfnlL39ZZ8+LtddeO+uss04mT55cM1ZdXZ0ktQ63atmyZS6//PKMGDEi7dq1K7Te4qqqqso999yTHj161HrNkuTb3/52jj322JoTwR911FE5++yzs+GGG9Zar+h7+8nHvvPOO9OtW7c6e//tvPPOGTJkSN5+++08+eSTtZYNGTIk6623Xs3P3bt3z4YbbpgPPvhgke9NUvxztqTPt7KyMr/73e/y05/+tM7v3rbbblvrPha+z6+++mqt53DYYYflgQceyGGHHVbzHF577bUcdNBB6dOnT637POmkk9KyZcv84x//+Mxc9Vncz+6pp56aVq1a1fx8yCGHZP3118+wYcNSVVW12O/xsrL11lvXet0Wfj+uv/762WWXXWrGF+7V1dDv+E8rlUqZPXt2Xn/99Zqxdu3a5eabb87w4cNr/T1Ikr333rvWnoSdO3fOZpttlqlTp+bjjz+ute5WW21V6+IMRV/jW2+9NW3atKnzPb/ZZpvlsMMOy9SpUzNs2LBa97Mkr1upVMrkyZNrHRbcpUuXDB06NNdff319Lx8ATZDDPwGo1wknnLBEVyxs1apV1l577VpjC4uQhefEWnh+tU9vJCf/3XhpqE+WDcmCMi1ZsBHz6Q37Vq1aZerUqTU/v/TSS2nVqlW958RZeF6eV155pdZG1Cc1a9Yse+yxR5IFG1Wvv/563nnnnbzxxhs155haWB58nvqe9xZbbJEk9Z6PLllwnqmPP/4422+/fZ3n2rVr13Tp0uVzH3fhfW+55ZZ1lu2www7ZYYcdFnnbTTfdNJtuumlmzJiR5557LmPGjMnbb7+dF154IWPGjKl1zq+vfOUruffee3PKKafkggsuyKBBg7LTTjtl++23T2VlZeH1Ftc777yTmTNn1vt8u3XrVutwykGDBiVZcLjoqFGj8s4772T06NE153Rq6DnNFho9enRmz56drbbaKs2a1f33za233jp33313Ro0aVVPsJEmPHj3qrNu+ffskCz5Tnyx5Pqno52xJn+/qq6+e/fbbL9XV1Xnttdfy5ptvZuzYsXn11VdryumFn4cddtgh66yzTu69996a37Oddtopu+yyS63vj5deeinJgvetvnOIrbLKKnn11VdTKpXqFDefZXE+uxUVFfX+3myxxRYZPXp03nrrrVRUVCzWe7ysfPr7sU2bNkkWFLOftPB36NPnN2yogw8+OKeddloOOeSQ9OrVKzvttFN23nnnbL311vW+DvX9Ti883HfmzJm1Ljby6axFPkebbbZZxo4dm6222qreQn7rrbfOlVdeWec7dklet4MPPjiXXXZZ9tlnn2y++eY1r8Xmm29e5/EBaLqUagAsE/UVHws3dkv/d8LqhcXWKqusUmfdVVddtdDjLdzYaUiOT5s2bVrmzZtXc3Lz+nx6r4lPe/XVV3PmmWfmiSeeSLJgr6oNN9wwffr0ydtvv/25J/pf6NN7yyT/fX1mzpxZ722mTJmyyNsmSadOnTJx4sTPfNyF78Xi7AE2Z86c/P73v8/f/va3zJo1K8mCPU623XbbrL766pk0aVLNujvvvHOuvvrqXHHFFXn00UdzzTXX5Jprrslqq62WE044IUcccUSh9RbXwvezIc/3/fffz5lnnpn77rsvpVIpzZo1S48ePbL11lsXupDFQtOnT0/y30Ls0zp16pQkdS4i0JDPVH2Kfs6WxvMdNmxYzj333Lz99ttJFpTcffr0Se/evfPoo4/W5G3Tpk3+/ve/549//GOGDh2aYcOGZdiwYTVl1xlnnJHVVlut5jk8/PDDefjhhxf5uDNmzCj8O1z0s7vqqqvW+14sfH0/eZGLou/xsrIk349FHHLIIVljjTVy9dVX56mnnsqrr76ayy+/PJ07d86Pf/zj7LPPPg1+/E+/7p8ujYt8jha+J0XfjyV53U499dSst956ufHGG/P888/nueeey0UXXZT1118/p5122ueepxOApkGpBkDZdOjQIcmCUuvTFlUgLQtt27bNKquskgceeGCxbj99+vR885vfzLRp0/KjH/0oO+ywQzbYYINUVlbmueeeK3TRhU/uQbfQwkJsUUXjwhJh4Ubmp336Spb1WbhnX33rzp07N6VSaZEbkr/5zW9y/fXXZ88998zXvva19OrVq2Zvk7333rtWqZYsOMS1f//+mTlzZp588sk88MADufXWW3PmmWdm3XXXrTlMuKHrLY76CpBPmjlzZtq2bZtSqZRvf/vbeeONN/Ltb387u+++ezbeeOO0bt06H3zwQW666abFfuwJEybUu3zh78DC13BJFfmcLY3n+9xzz+Wkk05Kly5d8vvf/z6bb7551llnnVRUVOSyyy6rcyh1x44d89Of/jT/+7//m1dffTUPP/xwbrvtttx9991p1qxZzj///Jrfz1//+tc56KCDFvelqGNxPrvTp0+vd4+4hZ/T1VZbreZqpA19jxfeV317tC4sqstlUdkWlWuPPfbIHnvskalTp2bEiBG57777cvvtt+d73/teNtpoo1qHIC+JIp+jxv7MJQtet4MOOigHHXRQPvzwwzz66KO55557MmzYsBx33HG57777ai7YA0DT5ZxqAJTNwsPRnn766TrLXnzxxUbL0atXr4wfP75O+ZMkDzzwQM4777xFHnqZJI8//ng++OCDfO1rX8s3v/nN9O7du6aAevPNN5N89p5En/TJc4gt9MwzzyRZcO6f+mywwQZp27Ztnn/++TrLpk6dWnMI62dZuKFb330MHTo0ffv2zT//+c96b3vHHXdkjTXWyAUXXJDtttuuZsN09uzZef/995P89/n/9a9/zfnnn59kQZG300475Re/+EVOO+20JKk5xLCh6y2u9ddfPy1btqz3+U6YMCH9+vXLz3/+87z66qs1V6Y85ZRTsvnmm6d169ZJ6n9vG3Lo4QYbbJBWrVrlhRdeqPcwu5EjRyZJNtpoo8V6bp9W5HO2NJ7vnXfemerq6px22mn5whe+kHXXXbdmvbfeeqvWfYwcOTJnnnlm3nnnnVRUVKR379455phjctNNN6Vt27Y158Pq1atXvXmTBaXvb37zm1xzzTWfmas+i/PZnTdvXp099ubOnZsXX3wxbdu2TY8ePQq/xwuvzvvpknPq1Kn56KOPGvRclpWF2T5dor3zzju1fq6qqsof//jH/OUvf0myoMzdY4898v/+3/+rOS/kwu+ypaHIa9yuXbt07949b7/9dq1zPNa37tIwZcqUXHTRRbn11luTJGussUb222+/XHjhhTnwwAMza9asxdrLFYDlj1INgLLZfPPNs9FGG+X222+vtcE/ceLEXHnllY2W44ADDkipVMqvfvWrWhtnEydOzGmnnZbLLrus3kPnFlp4WNKnT2j+/vvv1xxSOm/evAZlefjhh2tteE6cODGXX355Kisrs99++9V7m5YtW2a//fbL6NGjc8MNN9SMV1dX5+yzz67Za+azbLvttll77bVz22235ZVXXqkZr6qqyl/+8pc0b958kYcrtWrVKnPmzKm1l938+fPz61//uuZwqoUZHnnkkVx66aV59tlna93HwhN8d+3atdB6i6tVq1bZc8898+abb+bvf/97rWWXXnppkmTAgAE1BcunN8Q/+uij/O53v0tS+71deAL0z3rNKysr84UvfCETJ07MhRdeWGvZQw89lKFDh2a99dYrfF7BRSnyOVsaz3fh5+GDDz6odR+PPfZYzZ5fC+9j0qRJueaaa+rkWHjxhW7duiVZ8PvZvXv33HzzzXWKmcsuuyxXXXVVzXnXPpnr884Ntrif3YsvvrjWueX+/Oc/Z/z48TnggAPSvHnzwu/xwpP1f3pv2UsvvbTevddatmzZoM/10rAw2/33318zVl1dXfM5WaiysjJ33HFHLrjgglon50+W3uf2049X5DU+4IADMnv27Jx11lm13tOXXnop1157bTp06JDddtttqWRbZZVVcvXVV+e8886rU4ou/IeGpflaAFA+Dv8EoGwqKipy1lln5aijjsqRRx6ZPffcM+3atcs999xTc7hXYzjwwANz33335e67786rr76aQYMGZd68eRk6dGg++uijfO9738s666yzyNtvvfXW6datW2677bZMmTIlvXv3zrhx4zJ8+PC0atUqFRUVDd7bZOEVPPfdd9+0bNky99xzTz744IOcfvrpn3nBgZNPPjkPP/xwTj/99AwfPjwbbbRRRo4cmbfeeiutW7eu90Ten9SiRYucddZZ+fa3v51DDjkke+yxR9ZYY4088MADefvtt/OTn/wknTt3rve2++23X6688sp8+ctfzu6775558+blkUceyejRo9OxY8dMnjw5H330UTp16pTvfve7GTFiRL7+9a9nr732SufOnfPGG2/k/vvvz4YbbpgvfvGLSdLg9ZbED3/4wzz11FP5+c9/nmHDhmXjjTfOCy+8kJEjR2b33XfPPvvsk+rq6myxxRYZOXJkDjvssGy11VaZMmVK7r333lRVVaVNmzY157RLUvMaDR06NG3bts0BBxyQjTfeuM5j/+AHP8jTTz+dyy+/PCNHjky/fv0yduzY3HfffVlllVVy9tlnFzrh/mcp8jnr0aPHEj/fffbZJ1dddVV++ctfZuTIkVlrrbXy6quv5pFHHsnqq6+eDz/8sObzsPvuu6dfv3654YYb8tprr2XLLbfM9OnTc/fddydJzVUdmzdvnt/+9rc55phjcvjhh2fw4MFZZ5118uKLL+bxxx9P9+7dc+qpp9bJ9cc//jGvvPJKTjjhhHov5LA4n91WrVrlpZdeyle+8pVsv/32GTVqVP7zn/9kgw02yMknn1yzXpH3eOedd06nTp0ydOjQTJs2Lb17984zzzyT119/PT179sy4ceNqZejUqVPeeuutnHbaadl5552XWhlUn3333TcXXHBBrrjiiowdOzbdu3fPf/7zn0ybNq1OMXTqqafm+OOPzwEHHJC99torq666as171L9//+y4445LNVuR1/iYY47JI488kttvvz2vvvpqtt9++3z44Ye59957UyqVct555y3xVYUXqqyszIknnpgzzzwz++67b/bYY4+0bt06I0eOzAsvvJAvfelLta56CkDTZU81AMqqb9++ueGGG7LjjjvmgQceyJ133plddtklZ511VqNlqKioyIUXXpif/vSnadOmTW666aYMHTo0G220Uf7whz/kf/7nfz7z9m3bts1VV12VIUOG1Oz18PLLL+eLX/xi/vWvf6V379558sknG3Rus8MOOyzf/e5385///Ce33HJLunTpkj/84Q859NBDP/N2HTt2zA033JD99tsvL7zwQq6//vq0bds2V199dVZZZZVFnnD7k3bYYYfccMMNGTBgQB588MFcd911adOmTX7729/mqKOOWuTtTjnllHz3u99Ns2bNcv311+fee+9Nt27dcsUVV+TYY49Nkjz44INJFlwh8dprr82OO+6Yxx9/PFdddVVeffXVfP3rX891111XU/I0dL0l0blz59x00005+OCD8+qrr+bqq6/O+++/n+OOOy7nnXdekgVXh7zkkkty4IEH5t13380111yTJ598MjvttFNuueWW7Ljjjnn77bdrDoXr1q1bTj755FRUVOS6666r9/DSZMH79fe//z3f/OY3M2nSpFx77bV54YUXsv/+++cf//hH+vbtu8TP75Ma+jlbGs93k002yWWXXZbNNtss9957b/7+97/n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Pr/61a9y4403prq6OkcffXSqqqrqXf/kk0/O+++/n6uuuipXXXVV3n///Rx//PGNnBoAgM9jngcArMjKWqpVVVXlyiuvzIknnphddtklvXv3znnnnZfx48dn2LBhddafOnVqnnjiiRxzzDHZZJNNsummm+Z//ud/8sILL+Sjjz5q/CcAAEC9zPMAgBVdWUu1UaNGZcaMGRkwYEDNWIcOHbLppptm5MiRddZv3bp1Vllllfzzn//M9OnTM3369Nx2221Zf/3106FDh8aMDgDAZzDPAwBWdC3K+eDjx49Pkqy99tq1xjt16lSz7JMqKyvzm9/8Jr/4xS+yzTbbpKKiIp06dcq1116bZs3KfiQrAAD/xzwPAFjRlXWGMmvWrCQLJlGf1KpVq8yZM6fO+qVSKa+88kr69euX6667Ln/961/TtWvXfOc738n06dMbJTMAAJ/PPA8AWNGVdU+11q1bJ1lwzo2F/58kc+bMSZs2beqsP3To0Fx77bW5//77065duyTJpZdeml133TU333xzjjrqqEbJzcrj3YnTMndeddbr0iHNmlWUOw4ANBnmeQBLX3V1KWPGT02L5s2yTuf25Y4DK72ylmoLDweYOHFi1l133ZrxiRMnplevXnXWf/LJJ7P++uvXTLSSZNVVV83666+fMWPGLPvArDTenTgt5173VN549+MkSeeObfPdr26ZvhuvVeZkANA0mOcBLF3PvzEpF/7t2UyYPDNJsmH3VfO9w7ZWrkEZlfXwz969e6ddu3YZMWJEzdjUqVPz8ssvZ9ttt62zfpcuXTJmzJhahwzMnDkz7777bnr06NEYkVkJzK8u5Yw/j6gp1JJkwuSZOfPKEZkydXYZkwFA02GeB7D0TJk2O7+6YkRNoZYkb777cX7558czv7pUxmSwcitrqVZZWZnDDz8855xzToYPH55Ro0bllFNOSZcuXTJkyJDMnz8/kyZNyuzZC4qM/fffP0ly8sknZ9SoURk1alROPfXUtGrVKgceeGAZnwkrkudem5RxH86oMz67an7uf+rdMiQCgKbHPA9g6XngqXczu2p+nfEJk2fmmVcnliERkJS5VEuSE088MQcddFB+9rOf5dBDD03z5s1zxRVXpGXLlhk3blwGDhyYu+66K8mCq0Vdf/31KZVKOfLII/ONb3wjLVu2zPXXX5/27e3yytLx8Yy6J0+u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Xtq2buHqOAAAQJOyxqpt8tNvbJc5c+enVCqldaVNcmjKfIJpUpo3q8gqbVqWOwYAAMBia9XSnmmwInD4JwAAAAAUpFQDAAAAgIKUagAAAABQkFINAAAAAAoqe6lWXV2dCy+8MIMGDcqWW26ZY445JmPHjl3k+nPnzs25555bs/7hhx+eV155pRETAwDQEOZ5AMCKrOyl2iWXXJLrr78+v/rVr3LjjTemuro6Rx99dKqqqupd//TTT88//vGPnHXWWbnlllvSsWPHHHPMMZk2bVojJwcA4LOY5wEAK7KylmpVVVW58sorc+KJJ2aXXXZJ7969c95552X8+PEZNmxYnfXHjh2bW265Jb/+9a8zaNCgbLjhhjnzzDNTWVmZF198sQzPAACA+pjnAQArurKWaqNGjcqMGTMyYMCAmrEOHTpk0003zciRI+us/5///Cft27fPTjvtVGv9++67r9Z9AABQXuZ5AMCKrqyl2vjx45Mka6+9dq3xTp061Sz7pNGjR2edddbJsGHDcuCBB2bHHXfMMccckzfffLNR8gIA0DDmeQDAiq6spdqsWbOSJJWVlbXGW7VqlTlz5tRZf/r06RkzZkwuueSSnHrqqfnjH/+YFi1a5LDDDsuHH37YKJkBAPh85nkAwIqurKVa69atk6TOyWrnzJmTNm3a1Fm/RYsWmT59es4777wMHDgwW2yxRc4777wkya233rrsAwMA0CDmeQDAiq6spdrCwwEmTpxYa3zixInp3LlznfW7dOmSFi1aZMMNN6wZa926ddZZZ528++67yzYsAAANZp4HAKzoylqq9e7dO+3atcuIESNqxqZOnZqXX3452267bZ31t91228ybNy8vvPBCzdjs2bMzduzYrLfeeo2SGQCAz2eeBwCs6FqU88ErKytz+OGH55xzzknHjh3TrVu3nH322enSpUuGDBmS+fPnZ/LkyWnfvn1at26dbbbZJjvssEN+9KMf5Ywzzshqq62WCy+8MM2bN8+XvvSlcj4VAAA+wTwPAFjRlXVPtSQ58cQTc9BBB+VnP/tZDj300DRv3jxXXHFFWrZsmXHjxmXgwIG56667ata/6KKL0r9//5xwwgk56KCDMn369Fx99dXp2LFjGZ8FAACfZp4HAKzIKkqlUmlxblhdXZ3XXnstEydOzFZbbZV58+ZltdVWW8rxlr3BgwcnSYYP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nhw1IW+993G6rLFKdtxi7bRs0bzcsWCF1tA5ROE91ZJkv/32y3777Ze33norH330UTp06JANNtggzZoVPpoUmqQrb38ptz7wRs3Pf7njpfzwiG2yXZ+1y5gKAJaceR7A8mPm7Lk57bLHMmrMlJqx6/7dNr8+dsd06ti2jMmAZDHOqbbQ6NGj8+STT+bJJ5/Mc889l3Hjxi3NXLDceumtD2sVaklSNa8659/4TObMnV+mVACw9JjnASwfbr7v9VqFWpKM/3Bm/vyvF8uUCPikwnuqVVVV5cc//nGGDh2aTx452qxZsxx88MH5xS9+UesS7LCiefT59+sdnz5rbp5/fVK23bRLIycCgKXDPA9g+bKobY8RL43PvPnVadHcXsRQToVLtXPOOSfDhw/Pj3/84+y5557p2LFjPvzww/z73//O+eefny5duuTb3/72ssgKy4VmzRa9MfFZywBgeWeeB7B8WdT2RbOKxJYHlF/hWvvOO+/MKaeckiOPPDJdunRJZWVl1l577XzjG9/ICSeckL/97W/LIicsNwZt2a3e8dXatcoWG63VyGkAYOkxzwNYvgzasnu94zts3jXN7aUGZVf4Uzhz5sxssMEG9S7bZJNNMmXKlHqXwYqi57qr54i9N8kn/9FoldYt8oMjtk7LFv6wAdB0mecBLF++vOtG2ap3p1pjPdbukKP371OmRMAnFT78c88998y1116bgQMH1rkK1G233ZZdd911qYWD5dVXd++ZXbbqnqdGTUjrVi2y3WZd0rZ1y3LHAoAlYp4HsHypbNk8vzxmQF4ZPTlvvfdRuqy5Svr17OS0M7CcKFyqbb755rnggguy7777Zr/99kunTp0yZcqUDB8+PM8991yOPPLIXHzxxUmSioqKHH/88Us9NCwPOnVsm713WL/cMQBgqTHPA1g+bbJ+x2yyfsdyxwA+paL0yUs7NUDv3r0bfucVFXnllVcKh2pMgwcPTpIMHz68zEkAgKZkRZxDmOcBADR8DlF4T7VRo0YtXiIAAJZr5nkAAA3nrOoAAAAAUFDhPdWqqqpy7bXX5umnn87UqVPrLK+oqMhf//rXpRIOAIDGY54HANBwhUu1M844IzfffHM23njjrLbaanWWFzxFGwAAywnzPACAhitcqt1zzz357ne/62pPAAArGPM8AICGK3xOtWbNmqVfv37LIgsAAGVkngcA0HCFS7X9998/N998c6qrq5dFHgAAysQ8DwCg4Qof/nnyySdn//33z5577pnNNtssbdq0qbW8oqIiZ5111lILCABA4zDPAwBouMKl2jnnnJPRo0enTZs2ef755+ssr6ioWCrBAABoXOZ5AAANV7hU+9e//pWjjjoqP/zhD9OsWeGjRwEAWE6Z5wEANFzh2dL8+fOz6667mmgBAKxgzPMAABqu8Ixpjz32yNChQ5dFFgAAysg8DwCg4Qof/tm3b9+cc845GTVqVPr165dVVlml1vKKioocf/zxSy0gAACNwzwPAKDhCpdqp59+epLk2WefzbPPPltnuckWAEDTZJ4HANBwhUu1UaNGLYscAACUmXkeAEDDLdFZaKdNm5Y333wzVVVVmT9//tLKBIWUSqU8/8ak3PfkO3l/0vRyxwGAFYJ5HkBxk6bMyn1Pjs1ToyZkfnWp3HGAZazwnmpJMmLEiJxzzjl58cUXU1FRkZtuuimXX355unTpkh//+MdLOyMs0ocfz8rplz+et8dNTZJUVCRDtlsv3/ly3zRrVlHmdADQ9JjnASyeq+96Obfc/0aq/69M67JG2/ziW9tnnc7ty5wMWFYK76n22GOP5Vvf+lZat26d73//+ymVFnxh9O7dO1dffXWuuuqqpR4SFuXim56rKdSSpFRK7n58TO4d+U4ZUwFA02SeB7B4nnxlQm4a/npNoZYk4z+cmXOue6qMqYBlrXCpdv7552fw4MG55pprcuSRR9ZMto499tgcffTRuemmm5Z6SKjPtJlVeWrUhHqXPfDUu42cBgCaPvM8gMWzqO2Pt977OO+Mn1rvMqDpK1yqvfLKK/nyl7+cZMEVoD5pxx13zHvvvbd0ksHnmDevOqVFnKZg7jznfgGAoszzABZP1Wdsf8ydV92ISYDGVLhUa9++fSZNmlTvsnHjxqV9e8eL0zhW79A6Pdddrd5l2/VZu3HDAMAKwDwPYPFs36dLveOdOrbN+l1XbeQ0QGMpXKoNHjw45513Xl544YWasYqKiowfPz6XXnppdtlll6WZDz7TcV/um/ZtW9Ya23T9jtl34PplSgQATZd5HsDi2blf92y3We1irVVl85z4lS1dQA1WYBWl0qIOoKvfxx9/nK9//et57bXXsuaaa2bSpEnp0aNHxo8fn65du+baa69Nx44dl1XepW7w4MFJkuHDh5c5CYtr2syqPPDUu/ngo1np3aNj+m/WJc394QJgGVsR5xDmeQCLr1Qq5ZnXJuX51yelwyqtsuvW3bN6h9bljgUshobOIVoUvePXXnst1113Xe666648/vjj+eijj9K+ffscccQR2X333fPYY4/lC1/4wuKlhsXQvm1l9hu0QbljAECTZ54HsPgqKiqyVa9O2apXp3JHARpJ4cM/v/71r+ett97KV7/61fz+97/PlVdemQsuuCBf+9rXMnr06PzkJz8pdH/V1dW58MILM2jQoGy55ZY55phjMnbs2Abd9l//+ld69eqVd991pUcAgCVlngcA0HAN2lPtRz/6UcaNG5dkwS6tp59+etq1a1dnvbfffjtrrrlmoQCXXHJJrr/++vzmN79Jly5dcvbZZ+foo4/O7bffnsrKykXe7r333ssZZ5xR6LEAAKjNPA8AYPE0aE+1PffcM6VSKZ88/drCnxf+16xZs2y55Zb5f//v/zX4wauqqnLllVfmxBNPzC677JLevXvnvPPOy/jx4zNs2LBF3q66ujo/+MEPstlmmzX4sQAAqMs8DwBg8TRoT7Xddtstu+22W5LkiCOOyOmnn54NN9xwiR981KhRmTFjRgYMGFAz1qFDh2y66aYZOXJk9t1333pvd+mll2bu3Lk54YQT8vjjjy9xDgCAlZV5HgDA4il8oYJrrrlmqT34+PHjkyRrr712rfFOnTrVLPu0559/PldeeWVuvvnmTJgwYallAQBY2ZnnAQA0XOELFSxNs2bNSpI659Ro1apV5syZU2f9mTNn5vvf/36+//3vp0ePHo0REQCAxWCeBwCs6MpaqrVu3TrJgnNufNKcOXPSpk2bOuufeeaZWX/99XPIIYc0Sj4AABaPeR4AsKIrfPjn0rTwcICJEydm3XXXrRmfOHFievXqVWf9W265JZWVlenXr1+SZP78+UmSfffdN8cee2yOPfbYRkgNAMDnMc8DAFZ0ZS3VevfunXbt2mXEiBE1k62pU6fm5ZdfzuGHH15n/U9fKeq5557LD37wg1x22WXp2bNno2QGAODzmecBACu6spZqlZWVOfzww3POOeekY8eO6datW84+++x06dIlQ4YMyfz58zN58uS0b98+rVu3znrrrVfr9gtPctu1a9esttpqZXgGAADUxzwPAFjRlfWcakly4okn5qCDDsrPfvazHHro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agAAAABQUItyB4DlybsTp+XGYa/lpbc+yGodWucLO/TI7v3XK3csAABYKQ0f+U7u/M/oTJk6O5uuv0YOGdIr63RuX+5YAEmUalBj4pSZ+eFFj2TazKokyQcfz84Ff3s2H06dnYN371XmdAAAsHK5+b7X89c7X675+aFn38vTr07MeafsnC5rrFLGZAALOPwT/s/tD79VU6h90j/ufyOz58wrQyIAAFg5zZk7Pzff93qd8emz5ub2h98qQyKAupaLUq26ujoXXnhhBg0alC233DLHHHNMxo4du8j1X3/99fzP//xPtttuuwwYMCAnnnhi3n///UZMzIpo9Psf1zs+c/a8TJg8s5HTAMCKwTwPWBwTJ8/MjFlz61321iLm7QCNbbko1S655JJcf/31+dWvfpUbb7wx1dXVOfroo1NVVXevoSlTpuQb3/hGWrdunWuuuSaXX355Jk+enKOPPjpz5swpQ3pWFGuv2a7e8coWzbLGam0aOQ0ArBjM84DFscaqrdOqsnm9y9Z26CewnCh7qVZVVZUrr7wyJ554YnbZZZf07t075513XsaPH59hw4bVWf/ee+/NzJkz87vf/S49e/ZMnz59cvbZZ+fNN9/M008/XYZnwIpiv4Hrp7JF3Y/EkO3XS7s2LcuQCACaNvM8YHG1bd0ye23fo854yxbNst+gDRo/EEA9yl6qjRo1KjNmzMiAAQNqxjp06JBNN900I0eOrLP+gAEDcskll6R169Y1Y82aLXgaU6dOXfaBWWGt26VDzvj2DtmkR8ckSYdVKnPwHj1z9Bf7lDkZADRN5nnAkvjGfpvlsCG9smq7yiRJr/VWzy+PGZD1u65a5mQAC5T96p/jx49Pkqy99tq1xjt16lSz7JO6d++e7t271xq77LLL0rp162y77bbLLigrhc02WCO/++6gzJ9fnebNy945A0CTZp4HLInmzSpy6J69c+ievc3PgeVS2b+VZs2alSSprKysNd6qVasGnTvjmmuuybXXXpvvf//76dix4zLJyMrHH2wAWHLmecDSYn4OLI/Kvqfawt37q6qqau3qP2fOnLRps+iTw5dKpVxwwQX54x//mOOOOy5HHHHEMs8KAEDDmecBACuystf9Cw8HmDhxYq3xiRMnpnPnzvXeZu7cufnBD36QSy+9ND/5yU9y8sknL+uYAAAUZJ4HAKzIyl6q9e7d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smBvlI022iht27Ytc0KgnMaOHZuTTjopH3/8cbbeeuvMmDEjI0aMyD//+c/sv//+5Y4HANRj/PjxueGGG3LsscemTZs2SRbM+1999dWceeaZmTVrVubNm5eDDz44gwcPTqdOnVJdXV1z5ArA0uAbhRXOp080Xl1dnYsvvjjrr79+br755vz0pz/NT3/60/zjH//I448/XqaUQDnUd17FO+64I+3atcu//vWv/O53v8sNN9yQfv365ZZbbsnkyZPLkBIA+DzDhg3LLbfckr/97W9JFmwD3H///fnOd76TXr165Vvf+lY23njj/OlPf8pvfvObJFGoAUudbxVWGJ8+L9JCr732Wh544IEcfPDBad++fTbZZJMcccQR2XPPPfOHP/zBRjOsBD59XsWFpk+fnpEjR6Zbt25ZZZVVkiTrrLNOvvKVr6Sqqio33HBDo2cFAOpXKpVq/gF93333zYABAzJ06NCMGTMmFRUVufPOO9OvX7/87Gc/y957752zzz47hx12WJ599tncddddNfcBsLQo1WjyFv5xXXj+hEcffTT//Oc/M2HChCRJhw4d0rp165o9VBaeW+HUU0/NqFGjMmzYsMybN6884YFlZuG5VZL/njfttttuy+mnn55rr702SdKuXbt89NFHad26dZL/lm+77rpr2rZtm6FDh+att94qQ3oAYKGxY8cmWfCP5xUVFamurk7Hjh0zZMiQzJ07t2ZvtYcffjj9+/dP8t85/5AhQ7Luuuvm7rvvTnV1tSt9A0uVUo0mZ9SoURk+fHjNzwv/uE6YMCFf+9rXctJJJ+U3v/lNjjvuuDz00ENp3bp11llnnQwbNixVVVWprKxMsuAPbUVFRW688ca899575Xo6wFL09ttv56STTsrYsWNTUVFRs2fanDlz8q1vfStnn3123nrrrZx55pn5yU9+kiT54he/mNtvvz1jxoypKd+aNWuWioqKvPvuu7nmmmvK9nwAYGV35plnZo899siZZ56ZJ554Isl/9zzfdddds9VWW+Whhx7Ko48+mi222KLmCt4L1+nRo0fat2+fGTNmKNSApU6pRpNz1VVX5fnnn6/5uaqqKg8++GCuuuqqbLjhhrnnnntywQUXpF27drniiivSrl277LLLLnn66adz22231dzu9ddfz8CBAzN27NjcfvvtSewODk3Vwn+NHj16dDbffPN07949pVIp8+fPz2mnnZbLL7886623Xu655578+c9/zu9///v8f/buMzrKan/7+DVpJKQQEkih9wSQEkqQ3osU4VBEVASkiXSRKkcQOSjSpAgIAkpHVIoKKALSO0gREASkhwRCSUhIm3le8GT+xgTNQMid8v2s5Vone98z87uTQ2bPlV3WrVunX375Rc2bN5e/v7/GjRtn/d1y8OBBmc1mNWnSRGfOnNFvv/1m5O0BAJBttWrVSpL01VdfqVevXhoxYoTOnDmj2NhYOTg4qFmzZsqVK5eWL1+u4OBgHThwQEeOHJGDg4MsFovi4uL04MEDFSpUiFANQJojVEOm8NNPP+nDDz+UJH344YcaPHiwtW/Hjh0aNWqU1q1bp+bNm8vT01PVqlVT69atdfv2ba1atUrdu3dXxYoV9d577+mtt97S4MGDNWLECLVp00bdu3e3hm280QKZz759+/TCCy/o8uXLql+/vnr06CGTyaTQ0FDZ29vrwYMHmjVrlsxms1xcXOTk5KTmzZurZs2a+vTTT+Xq6qrJkyfr5s2b6tWrl15++WV17txZ9erV00svvaRLly6leMABAAB49ipUqKDGjRvrueee0wsvvKDz58+rQ4cOGjBggM6ePasqVaqoXr16unXrlsLDw1WrVi0NGTJE69ev1++//67p06fr0qVLevHFF42+FQBZEKEaMoUdO3Zo69at2rt3r+zs7HTlyhV16NBBJ0+eVKNGjdSkSRNFR0crJibG+pgmTZqoXLlyWrNmjcLCwvTBBx9owoQJKly4sOzs7LRkyRI1a9ZM9+7dU6FChRQTE8MHZyATKlasmMLDw7Vq1SrFxsYqMjLSGpxLUr9+/eTn52ddBpL47/ydd97R6dOn9c033yggIEBffPGFJk2apJYtW2rDhg3q2rWrHBwclDNnTushBgAAIP2NHj1aISEhKlu2rJYtW6bRo0fr4sWL6tixo4YNGyY3Nzd5e3vr1KlT6t69u0qVKqWpU6eqf//+2r59uyZPnqyKFSsafRsAsiBCNWRoiQcIvPbaa/L399fSpUtlsViUP39+XblyRQsWLJAkdezY0bpvWnR0tCTJ3d1dzZo1k5OTk+bMmSNJatOmjXr16qXRo0erfPny2r9/v/bs2aMGDRooR44cHLMNZCKJSzp8fHz0zjvvaOnSpTpz5ozc3NxUrFgx3bp1S99//72KFCmiTp066euvv9aff/4pOzs7WSwWBQQE6LXXXtOsWbN0/vx55cmTR0WKFFGpUqXk4OCgnTt3asSIEapdu7YKFChg9O0CAJBt+fr6qlWrVlq3bp3OnTunjh076quvvtL777+vY8eO6dNPP9WOHTt0/vx5/fbbb/rss8+0Zs0azZgxQ999952CgoKMvgUAWRQJAjIss9ksBwcHSVJgYKCCg4N148YNffvtt7Kzs9O4ceO0adMmbdu2TYGBgWrQoIFOnjyZ5BCDunXrqlSpUjp16pSuXr2qiIgIff3112rYsKG6du2q3r17q0GDBnr11VeNuk0AT8hkMsnR0VEPHz5UlSpVlDdvXi1evFjx8fFq166d8ufPr6+++kr379/Xq6++qoIFC2rq1KnWx0pSz5495ebmpvDwcEmPThd799131atXL40cOVItW7bUmDFjrAecAAAAY7z11lu6efOmNm3apIiICOXKlUsvvviilixZouHDh6tEiRK6deuWvvzyS4WHhyt37twqXbq00WUDyOJMFnZmRwa3ePFiff/998qVK5d2796tihUratasWfLy8lK3bt10//59rVixQvfu3dOAAQPk4+OjUaNGydfXV5J0/fp1ubu7y93dXZIUFhamQ4cO6c6dO2rSpIny5Mlj5O0BeArLli3T5MmTVatWLe3atUtxcXGaMmWKmjZtqjVr1mjBggVq1aqVevfurQ0bNmjYsGGaP3++qlevLovFIpPJpPj4eGuAL0m3b9/WlStXVLJkSZZ9AgCQgWzYsEEzZ87UiBEjVLdu3SR9cXFx2rp1qypUqCA/Pz+DKgSQ3RCqIUNbvXq15syZo379+snf318//PCDtm/frvbt22vgwIE6deqUOnTooBEjRqhz585avXq1Zs+erQ4dOuitt95K8lzx8fGyt7fnMAIgE0oMwP7q/Pnzeuutt9S7d281b95cx48f12effabQ0FAtX75cdnZ2Gj9+vH7//XdNnjxZxYoV02uvvabr16/r559/TrLcOyEhQXZ2dvx+AAAgA7NYLGrXrp0CAwM1aNAg+fj48B4OwFAs/0SGkLh32t9t2bJFlSpVUtu2bVW9enWNHz9eLVq00I4dO/Tbb7+pTJky6tChgxYtWqQbN27oP//5j4KDg1PciNTBwYE3WyATio+PT/Hf7o8//qi4uDi98MILypEjh4KD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6tatW8keExYWliyUSUuJYVaihIQE3blzx/oZQpLatWunUaNG6fz589q7d68mT55s02sk1n/r1i3ly5cvxddOnN31b9+DggULqlixYtq7d68uXryo4OBgOTo6qlKlStq/f7/s7e1VtWpV65JMW7m7u8tkMj22jsQ6582bpy+++ELvv/++mjRpInd3d0lS+/btbbrvxNccOnSohg4dqgsXLmjLli2aPXu23n//fc2bN++J7gPIbpg6hCQuXryozZs3a+7cuRo3bpz69OmjokWL6siRI1qxYoUkKTY2VosXL9bp06d17do1/e9//7Nu4Ckp2Yw0PjADmY+/v79atmyprVu36s8//7T+O96xY4eqV6+ut99+W4GBgbpz546uXbumSpUqKSoqSpGRkZoxY4bGjx+vXbt2aeTIkVq5cqWaN2+e4uswgxUAgGdr06ZNev755xUWFiZ7e3sFBQVp7Nix8vDwUFhYmPLmzavvv/8+yWOuXLmiX3/91boH2+M8zfv47t27FR8fb/36xx9/VHx8vKpVq2Zta9q0qVxcXDR27Fi5urpa9/5Kreeff17So+/BX23bts36v4sWLZrq70G9evW0f/9+HT582FpntWrVtH//fu3cuVP169e3qb6/ypkzp5577jlt3LgxyennERER+uWXX6yHMxw+fFglSpRQu3btrIHazZs3dfbsWetWPqm572vXrqlu3brWa4oVK6aePXuqRo0aun79+hPfB5DdMFMNSZw6dUpms1lFixbV+fPn9fnnn+vPP/9U/fr1tWjRIrVs2VIeHh7avHmzVq5cqfj4ePn5+WnmzJkqVaqU0eUDeEpms1lms1m5c+fWCy+8oBMnTmjq1KmaMWOGpEcb8I4aNUq7du3SqFGj5OnpqTlz5sjf318//fST2rVrJzc3N+3Zs0f79++Xj4+PVq1apSJFihh7YwAAZFOVKlWS2WxW37591atXL7m6umrjxo2KiIhQs2bNVL58eetpni+++KLu3LmjWbNmKVeuXOrWrds/PreHh4du3bql7du3q3Tp0sn2Uf4nYWFh6t+/vzp37qw///xTU6dOVc2aNa1/qJckFxcXtWjRQqtWrVKnTp1s3kC/cOHC6tixo6ZNm6b4+HiVLl1a69at0++//269xs7OTm+//Xaqvgd169bVwoULJT3a1F96FGAlHnDwNKGaJA0ZMkTdu3dXr1699MorryguLk7z5s1TbGys+vbtK0kqX768Zs+erXnz5qlixYq6dOmSPvvsM8XGxio6OjrV950/f375+flp/PjxioyMVKFChXTy5Elt375dvXv3fqr7ALITQjUkUbp0aY0ePVoxMTFavHixXF1dNWvWLP32228aOHCgvvzyS/Xr109z5sxRaGio4uLikhwZzawTIHOzs7OTnZ2dzp49q19++UV+fn7avHmz9u7dq+rVq6tkyZLq27evfHx81KNHD3Xs2FE5cuTQtGnTtHPnTr344ovq0qWLunXrppCQEPn7+0t6tKQj8aRgAACQfnx8fPT5559r+vTpevfddxUdHa2SJUtq5syZ1hlNrq6u+uyzz9S3b1+5ubmpdu3aevvtt5PtwfV3bdu21fbt29W3b18NGDDAppM5X3nlFUVERKhv375ycnJSq1atNHTo0GRjhXr16mnVqlVq27at7TcvacyYMcqTJ4+WLl2qe/fuqXbt2nrzzTf1ySefJLmP1HwPKleuLHd3d+XJk8faXrZsWbm5ucnX19e6Hc6Tql69uhYtWqQZM2bo7bfflpOTk6pUqaKJEyeqZMmSkqTevXvrzp07Wrx4sT799FP5+/urdevWMplM+uyzz6z71qbmvmfNmqWpU6dq+vTpunPnjvz9/dWvXz+bfo5AdmeypLRLIrK9jz76SEePHtX777+vwMBAbdiwQW+//bYk6ZNPPlGzZs2SXM++aUDWYLFYNHfuXH366adq06aNbt26pV9++UVVqlTR0qVL9c0332jSpEkaMGCAXnnlFevjEn8/TJkyJdlgmN8PAADgSY0ZM0bHjh3T2rVrjS4FAJJhploWZ7FYbJ4ZEh4ergMHDqhly5YKDAzUw4cPtXXrVvXv318FChRQzZo1kz2GD8xA1hASEqLNmzdr4sSJatGihSRpxYoVmjdvnlavXq02bdpoz549mjx5siIjI1W6dGlt375d+/bt04cffpji7xt+PwAAkPUlbiHxbxwcUvcRdPHixbpw4YK++uorTZo06Zm+FgA8KX7LZFEWi+WJT9Xz8vJSjhw5tHDhQh07dky//vqrihQpooEDB1qnND9JWAcg47t27ZouXryY5Bj1pk2b6vLly5o/f75eeOEFffjhhxozZoy+++47rVu3Tp6enlq4cKECAwMNrBwAABjp008/1axZs/71ui1b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oi+++EIvvPCCypcvr8aNG2vBggWyWCzJrg0PD9f777+v+vXr67nnnlNwcLD69u2rq1evWq+5fPmy3nzzTVWrVk0VKlRQx44dk8y4evjwocaOHas6deroueeeU7NmzbRgwQJr/1+Xf86cOdO6/LRLly5q0KCBJCVb/hkZGakPPvhAtWvXVsWKFdWuXTv98ssvSV5zypQpatKkiZ577jlVqlRJ3bp10+nTpyVJM2fO1KxZsyQlXfL59+WfoaGhGjlypOrWravy5curffv22rJlS5LvUUBAgJYtW6Z3331XwcHBCgoK0sCBA3Xr1q1U/0y+/fZbjRw5UpLUsGFDjRgxQhMnTlT58uUVERGR5NrZs2ercuXKio6O1syZM9WgQQNt27ZNzZo1U4UKFfTSSy8lWUorPQoq33vvPdWoUUPlypXTSy+9pL1796a6vmeFUA0AAAAAAGQaH3/8sT7++GM1aNBAc+fOVfv27TV58mTNmzcvyXUWi0W9e/fW7t279c4772jBggXq16+f9u7dqzFjxkiSzGazevfurejoaH388ceaPXu2PD091adPH126dEmSNGHCBO3YsUPDhw/XggUL1LBhQ3388cf65ptvktXWoUMHvffee5Kk9957zxp8/VVCQoLeeOMNfffdd+rdu7dmz56tYsWKqW/fvjp06JAkadiwYfrmm2/Uq1cvLVy4UCNHjtS5c+c0ZMgQWSwWdejQQe3bt5f0aMlnhw4dkr3OrVu31L59ex06dEiDBw/WzJkzlT9/fvXt21fr169Pcu20adNkNps1depUDRs2TNu2bdOECRNS/TOpV6+e+vTpI0maNWuW3nrrLbVv314xMTHatGlTkmvXrVun5s2by8XFRdKj4HP48OF65ZVXNH36dDk7O6t79+7WADEmJkZdunTRli1bNHjwYM2aNUt+fn7q0aOH4cEayz8BAAAAAECmcP/+fS1evFivvfaahg4dKkmqUaOGwsLCdPDgwSTXhoaGysXFRcOHD7cuw6xWrZouX76sVatWSZJu376tCxcu6K233lLdunUlSeXLl9esWbMUGxsrSTpw4IBq1qypFi1aWJ8jZ86c8vb2Tlafn5+fdW+1EiVKqEyZMsmu2bFjh44dO6ZPP/1UjRo1kiQ9//zzunLlivbt26fy5cvrwYMHGj16tJo3by5JCg4OVmRkpD766CPdunVL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/sDpOU9ERETexOs+5yX7nmrW1takSJHsc4siIiKSRClSpMDa2trUYci/0HOeiIiIvInXfc4zMxgMhvcQj4iIiIiIiIiIyCcj2fdUExERERERERERSSol1URERERERERERJJISTUREREREREREZEkUlJNREREREREREQkiZRUExERERERERERSSIl1URERERERERERJJISTUREREREREREZEkUlJNREREREREREQkiZRUExERERERERERSSIl1URERERERERERJJISTUREREREREREZEkUlJNREREREREREQkiZRUExERERERERERSSIl1URERERERERERJJISTURSXZiYmJMHYKIiMgHLTo62tQhiLyx2NhYU4cg8p/o+8rHQ0k1EUkWYmNjMRgMxMbGYmFhAcC9e/eIiooycWQiIiIfjrhkRIoUKQC4cOECjx49MmVIIq8tLhFhbq6vufJxivsMjvu+cvnyZX1f+cCZGQwGg6mDEBF5F27fvs3ixYvp0qULKVOmNJafPXuW0aNHExERQXR0NM2aNaNy5cpkzpyZ2NhYPYiJiEiyFxwczKRJk7CxseHhw4f89NNPFCxY0NRhibySwWDAzMwMgC1btnDw4EHSpk1LgwYNyJIli4mjE0ma33//nZkzZ2JhYUHq1KkZPXq0PoM/UClMHYCIyLuyYcMGli1bRrp06WjXrh0Gg4Ft27YxevRoKlWqRPHixdmyZQs//fQTBw8eZMqUKUqoiYhIshcYGMjPP/9Mq1atKFu2LPv37ydDhgymDkvkX5mZmREaGsrAgQP5888/qVixImvWrCFPnjxkzpzZmHAT+dD5+vqyatUq+vTpg729PY8ePSJr1qymDkteQUk1EfmkxHW+NTMzo06dOpw4cYI//viDSpUqkTNnTtatW4e7uzvDhw8HoGbNmsyaNYslS5YQFBRErVq14v3SKSIi8qmKjo42DvP8u0OHDtGgQQM6dOgAvByGdP/+fe7fv0/u3LmxsbF536GKJBATE4OFhUW857bly5djbW3Njh07sLGx4cGDB6ROnVrPdfJBSuwz+MGDB5w4cYL+/ftTp04doqKiuHDhAnfu3OH27dsUKFDARNHKqyipJiKfhGvXruHk5GR8aIqNjSV9+vRUq1aNGTNmsHTpUgYOHMjOnTvp168fAFFRUVhZWVGtWjX27NlDcHAwNWrUUG81ERH5pMX9ABX3ZS4kJISMGTOSMWNGLCwseP78OXv27CEmJobdu3cTExPD2bNnyZIlC1988QW9evUyZfiSzMXGxmJmZmaccyru2c9gMHDx4kWio6OxsbHhjz/+4MyZM9y4cQMzMzPq1atH+fLl9eOpmFzcNRj3GXz06FEyZsxI9uzZSZcuHYcOHSJt2rQcOXKEo0ePYjAYOHfuHGZmZvj7++Pp6WniFsjf6ZujiHz0Ro8eTdWqVRk9ejQHDhwA/n+C2kqVKlGsWDF27NjBnj17cHNzY+fOnfHq5MqVCzs7O54+faqHLBER+eSZmZlhZmbG7t27qV69OkOHDqVx48YsWrSIlClT0qRJEzJkyMCGDRsoUaIETZs2ZdWqVbi4uHD8+HGePHli6iZIMmZubo6ZmRk7d+6kT58+DB06lKCgIMzMzMiZMydXr17F1dWV0aNHc+zYMR4+fMhff/3FrFmzCAsL07OemFzcNbh+/XoqVqzIgAEDqFOnDr/99hsA33//PaGhoRw4cIAyZcrQtGlTVq5ciaurK0uWLDFl6JII9VQTkY9e3bp1WbBgAb/++iu///47NWrUoF27duTOnRsrKytq1KjB6dOnWbRoER4eHgQEBHD48GGKFSuGwWAgOjqap0+fkitXLj1oiYhIshASEsLo0aOpW7cuX375Jfv378fFxQWAypUrU7ly5QT7pEqVivTp02NnZ/e+wxUxevbsGd988w3btm2jSZMmnDx5klu3bgHQtm1bypUrx927d8mdOzfW1tY4Ojryww8/sHv3bqysrEwcvchLq1evZurUqXTt2pXSpUtz+fJlnJ2dAahRowbVq1dP8L3Ezs6O4sWLmyJc+RdKqonIR69IkSJUrVqV+/fvkzNnTs6fP0+TJk0oW7Ys3t7efP7551SsWJHNmzcTFhZGuXLl6NevH3379iVfvnysXbuWK1euaDiLiIh8cuLmnfqnnTt3ki1bNnr06AFAunTpuHDhAidPnsTNzQ17e3t++eUXnj59StWqVZk3bx7Hjh1j3Lhx77sJkowldv0ePXqU+/fvs3r1ahwdHXn69CkxMTEYDAasra1xc3Pj2rVrREREkDt3bm7evMmJEyfw8PDA1tbWRC2R5OpVc1eeO3cODw8PmjVrRnR0NPfv3+f69eucPXuWMmXK8PDhQ/z8/HB3dyd79uwEBgZy6dIl+vbta4JWyL9RUk1EPgnDhw+nRYsW1KpVi2+//ZYVK1Ywd+5cmjVrRtWqVXF3dydDhgycOnWKQYMGER4ezpQpU7C0tMTGxoZJkyZRtGhRUzdDRETkrYibNy0uIbF7925SpEjBZ599Rvr06cmcOTP79+/Hx8eHffv2kSpVKm7fvk1MTAy5c+dm6dKlxMTEsH37drZv346TkxO//vorWbJkMWWzJJmIjY0F/v/6jYyMNC6QcfXqVUJCQjAzM2PdunWEhIRw+/Ztbt68ScWKFenbty8BAQFs3rwZd3d39uzZg4eHB506dTJZeyT5iY2Nxdzc3JhQ2717NylTpqRYsWLAy+v48uXL9OnThzNnzpAyZUquXr3K06dPad26Nd26dcPMzIz58+fz7NkzihYtyvLly9VT+ANkZoi744qIfOR8fX3Zs2cPI0eOpFChQjx69Ijt27fz448/8vTpUx49eoS9vT29e/emSZMmPHjwQKvoiIjIJ+HMmTPY2dnh6OgYr/zQoUP4+Pjw4MEDYmJiKF68OCNHjsTOzo6ZM2dy9OhRihcvTu7cuSlYsCDHjx9n1KhRLF26lLx58xIeHs6TJ0/ImjWriVomycHfe/P8fSGBkJAQZs2ahYWFBRUrVqRhw4Zcu3aNPn36cPXqVSwsLPDw8CBNmjSkTJmSJUuWsG7dOqysrNi/fz/Xr1+nXLlyfP7556ZsniQDJ0+exN7eHicnp3g9LLdv3853331HeHg4L168oHr16owbN45Lly6xfPlyjhw5QunSpcmRIweVKlVi3rx5LF26lM2bN2NhYcGzZ8+IiIgw/qDxqt7HYjpKqonIJ+P58+dUrVqV+vXr07lzZ+MvOXfv3mX//v3MnTuX06dPkzdvXgIDA0mfPr2JIxYREfnvnj9/TtmyZfH09GTcuHHGeaOCg4OZOHEiNWvWpH379mzbto05c+ZQqVIl+vfvn+ixZs2axcGDB5k5c6a+uMk7Fxsby4gRI8iaNStff/218Zp79uwZo0aNIigoiDp16nDjxg1u3LhB+/btadmyJWFhYVy9ehUnJycsLCxImzYtISEhDBkyBF9fX1xdXU3cMklO/vzzT7y9vXF3d2f8+PHG8mXLljF16lTatm1L1apVOXHiBAMHDuSHH36gWrVqiR5r2rRpXL58mfHjx8ebA9BgMGAwGIwLrcmHQ38REflkWFtbM3jwYDZt2sThw4eN5ZkzZ6Zu3br8+uuvTJ06lYCAACXURETkk2Ftbc3QoUPZvHkzx44dM5Zv2LCB4sWL069fP9KnT8+jR4+4cuUKW7du5dChQwAEBgbSrl071q5dy+DBg5k1axaVK1dWQk3ei7jhcYGBgVy+fNlYHhwczMWLF1m7di1jxoxhypQpWFtbs3z5cq5fv25cMOPYsWOkSpWKsLAwFi1ahLOzM7lz5zZdgyRZKlSoEF5eXpw9e5bdu3cD8OTJE1auXEnr1q3p2LEjTk5OXL58mdjYWH755RdCQ0OJjIxkzJgxDBs2jJUrV9KnTx8WLFhArVq1EiyqYWZmpoTaB0p/FRH5pNSsWZOUKVMSHBzM3bt3AYyT11paWlK9enUcHBxMHKWIiMh/FzfvFMAXX3yBi4sLM2bMIDw8nMePH2Nubo6npyfXr19n9OjR7N+/n/79+2NnZ8fSpUsBKFq0KDExMSxdupSHDx/y+++/07x5c1M1SZIhb29vbGxs+OWXX4iIiCA6OpqdO3eSPXt2nJycOHLkCEOGDCE6OpqoqCgWLlwIwNmzZ+nTpw/t27enVq1ahIaGMnLkSFKlSmXiFklyERsbS0xMDAB16tTBzs6OxYsXYzAYsLOzIzo6mkKFCnHz5k1GjhzJ6dOn8ff35+TJk6xevRobGxtcXFy4efMmgYGBxnkCq1SpYuKWSVJo+KeIfHLOnDlDx44d6dq1K61atTJ1OCIiIm9dYvPqhISE0KZNG8aOHcsXX3zBpUuXyJgxI/PmzePu3bvUq1cPDw8P2rVrx8mTJxk8eDCNGzfmxYsXPHv2DHt7exO1RpITg8FAbGxsvOt32bJljBgxgnnz5lGiRAlWrlyJs7MzL168YMmSJeTMmZM2bdowatQojh07xo8//oiLiwt79+7lzp07ZMuWDQ8PDxO2SpKTxK5hgLlz5/Lbb7/Rvn17mjZtyoULF3BwcMDX15fnz5/TqFEjihYtSrNmzQgPD8fHx4eSJUsCEBYWZhxJo3nTPi7qqSYin5z8+fNTrFixBN2mRUREPhUWFhaEh4fj5+fHvHnz2L59O59//jlffPEFM2bM4Pbt2zg7O3Pq1CkWLlxIxYoV8fDw4MGDB0RFRZE9e3amTZtGeHg4lpaWSqjJexEbG4uZmRkWFhZERkZy+/ZtY7LBzc0NPz8/IiMjadCgAQUKFGDGjBmkTp2aOnXqkDZtWszNzbl+/Tpdu3YlOjqa0qVL06BBAyXU5L2Ku4bv3r3LDz/8wPz58wkJCaF58+bkypWL1atXExYWRp48eQgODmbVqlW0a9eOokWLcu3aNR4/fszVq1dZsmQJYWFhAKRPn/6VyTr5sCmpJiKfJF9fX5o0aWLqMERERN6JdevWUalSJQ4ePMiWLVuYMmUKx44do0ePHty7d4/ff/8dgKtXr2Jubk6mTJl4+PAh/v7+pEyZkrFjx7Jp0yZsbW1N3BJJTuLmhJo5cyZVq1alW7dutG/fnitXrjBw4EAOHjzI+vXrAdi/fz/nzp2jVatWODs7c/nyZe7fv4+3tzeNGjUyTtwuYgoLFiygevXqnDp1ihUrVjBu3DiePn1KnTp1ePLkCYGBgcDLudXSpk2LlZUV9+7dY+rUqZQtW5Zly5YxZcqUePM8a960j5OGf4qIiIiIfEQePHhA7969qVixIl999RUGg4ETJ06QM2dO7O3t+fHHH5k7dy5LlizBycmJqlWrYm1tzcOHD8mTJw/jx4/H2dnZ1M2QZCauF46fnx8bNmygT58+pE6dmi1btlCtWjVKlizJgAEDOH78OIsXL+bp06dUrVqVKlWq4OTkxNq1aylXrhyDBw9Wz0oxqfv379OpUyeaNGlCixYtuH//Pnfu3OGzzz4jJiaGUaNG8eeffzJ16lRCQ0MZMWIEz549Izw8HDc3N8aOHUuWLFkADfX8FCipJiIiIiLygbhw4QL29vZkzJjxlXVCQkLo3LkzP/74I6VLl463LW4o0ZdffomLiwuTJk3izp07/PXXX1hYWCSoL/I+PXz4kGbNmtGmTRtat24NwIsXL7C0tATg5s2b1KtXjzZt2tC7d2+WL1/Ojh07uHnzJu3ataNWrVqmDF+SgQsXLgCQJ0+eV9ZZtmwZo0ePZvPmzfF6mgFERUVx7Ngxvv/+e9zc3PDx8eH+/fvs3LkTJycnihcvDrxMMpuZmb27hsh7o76FIiIiIiIfgEePHtGtWze2bNmS6Pbo6GgAwsPDsbKyMiYi4pw+fZrevXtz69Ytunfvztq1a9mzZw9ZsmShXLlySqjJOzVixAhmzpz5r3WuXr1KVFQUWbNmNZaZmZkRGxvLr7/+yr179+jRowc///wzp0+fpmHDhkyYMIFff/1VCTV5506dOkWfPn24dOlSottfvHgBYPzR4+nTp8D/fzafOnUKLy8vChQoQLly5Vi3bh3btm0jQ4YMNGjQgOLFi2MwGIiJiVFC7ROipJqIiIiIiAk9fvyYJ0+eYG9vz9KlS2natGm87dHR0RgMBlKkSAGAp6cnqVOnZvXq1YSHhxvrRUVFcfDgQSwsLKhRowYDBgzAzc3tvbZFkp+YmBgAChUqRKVKlRLdHhsbC0DevHl58uQJZ86cISoqCoAUKVJw+/ZtJk+ezIMHD2jevDmpUqXi5MmTAFp4St65a9euAVCwYEF+/vlnqlSpYtwWlwQDjD9kpEyZkrx58xIQEABg/Gy+efMmsbGxPHv2jBo1atCnTx/Kli0b71hxixzIp0NJNRERERERE4mOjiYwMJB9+/YBkDZtWv766y8GDRoEYEymmZmZsWfPHho3bsyOHTvw9vZm2bJlBAUFERYWhsFgYPfu3VSsWJHs2bMD0KFDBy1EIO/UmTNnOHfuHAaDgaZNm+Li4sLFixeB/09GWFhYYG5uzv79+7l58yadOnViwYIFnDlzxnicyMhI7OzssLOzw8bGhj/++EMLTsl7s3z5ctasWQNAhgwZOHToEJMmTeLx48fxkmBBQUG0atWK1KlTU6ZMGbZv305wcLCxB9u+ffv4/PPPyZw5M/nz56dFixZYWloaF9RQ77RPUwpTByAiIiIikpzcv3+fvXv34unpiZ2dHcePH2fDhg04Ojpy+/ZtbGxsWLVqFaVLl6ZBgwaEhYXRp08fzp49S6tWrfj8889JnTo1+/btY+bMmcyfPx9LS0tu3brFmDFjlEiTdyoiIgIbGxvMzMyYM2cOT548YebMmURFRfHnn3/SokULAgMD8fDwwMLCghs3bjBq1CiOHDmCj48PnTp1Yvny5YwdO5bSpUvj5uaGv78/n332Gfny5QMgTZo0Jm6lfMquXbvGyZMnqVmzJteuXePo0aMcP36cbNmykT17dk6cOMGaNWtwdnamUaNGXLx4ER8fHy5fvkzz5s0pVKgQadKk4enTp/Tu3ZtixYoRFhZGVFQUEydOBP6/V5rmTvv0aaECEREREZH36Pvvv2f58uWMGzcOLy8vLly4QP369YmOjqZ///60atWKcePGsWPHDlavXs3u3bvZvXs3nTp1ImfOnMbeP8+fP+fSpUscPXqUmJgYWrVqZeqmyScuKCiIwMBAvL298fDw4OjRozRv3pyyZcuSKVMmOnfuzHfffUdMTAzz58/n4MGDdO3alXLlyuHt7U2OHDkAOH/+PMuWLWP//v1ERkZSrlw5hg4dauLWSXIQFRXF5MmT+eWXXzh48CB2dnbMnz8ff39/Hj16xOjRo6lSpQre3t5YWVkxduxY1q5dy+nTp+nTp49x1c44O3fu5MaNG5iZmdGsWTMTtUpMSUk1EREREZH3IK7HwtOnT2nWrBmurq707duXn3/+mfnz55MqVSpWr16Ng4MDFy5coGXLlrRp04YePXqYOnQR4OVwz3bt2tG0aVM6d+7MiRMnaN++PSlSpGDWrFmUKVOG/fv389VXX/H9999TunRpQkNDyZ8/f6LHe/jwISlSpFDvSnmvzpw5Q58+fShUqBCTJ0+mU6dOnDp1ivTp0zN79mwcHBxYvnw5s2fPpkmTJnz11VcJjhEbG4u5ecLZtKKjo41zrEnyoDnVRMQkvLy8GDx48Fs73uDBg/Hy8nprxzOFT6ENIiLyanGTXadOnZpWrVqxZ88e9u7dS69evTh06BDW1tbMmDGDFy9ekCdPHr766itmz57NlStXTBy5JHdx86Plz5+fRo0asWHDBo4cOYKdnR19+vTBzMyMCxcuYDAYKFasGPXr12fKlClYW1u/MqEGL+cQVEJN3pe4VTpz585NmzZtWLduHZcuXWL27NmMGTMGGxsbZsyYAUDDhg3Jly8fmzdv5siRIwDGBTeARBNqgBJqyZCSaiJiEv7+/nTr1u2tHa9bt274+/u/teOJiIi8bSlSpODx48cAtGjRAkdHR9asWcPVq1extrame/fuLFu2jKNHjwIvv9TlyJGDqVOnmjBqEeJN1t61a1cMBgNr164lY8aMdOnShdatWzNjxgwuXbqEpaUlHTp04NmzZ8yePdvEkYv8vxQpUvDw4UNiYmKoWbMmRYsWpX///gBUqFABd3d3Dh8+zI4dOwBo3rw54eHhrF+/npiYmFcm0iR501UhIiZRsGBB47wab0OOHDkoWLDgWzueiIjIf/X3Xg0AN2/epHLlysYkWdeuXTl79izbt2/nxYsXNG/eHBcXF3766SfCw8PJlCkT3bp1IygoiN27d5uiCZJMJTZD0Jw5c9i+fTu2tra0adOGffv2Ga/L7t27Y25uTmBgINHR0caelr/88gsXLlx43+GLAAmv4+PHj1O3bl3WrFlD+vTp6dixI6dOnWLVqlWYm5tTo0YN0qZNy++//w5A6dKl8fDwYP369WzdutUUTZCPgJJqIvKfeXl54e/vz9ixYylZsiTu7u7069ePp0+fMmvWLCpUqEDx4sXp2bMnDx48MO7z9+Gfa9eupV69eri5uVGqVCn69+/PnTt3jNtPnjzJl19+SfHixXF3d6ddu3bGX/Ih4dBJLy8vpk2bxvfff0+ZMmVwc3OjQ4cOXL58OV7sK1asoFatWhQuXJh69eqxd+9eChYsyPLly1+7/dWrV6dXr14JyuvXr0/Xrl2Bl0N+Zs2aRZ06dXBzc6No0aI0b96cffv2vfK4Li4u+Pn5xSvz8/PDxcUlXllISAitW7emSJEieHh4MGjQIMLCwozbY2Nj8fX1xcvLC1dXV7y8vJg8ebJx+W8REXk3/tmrwdbWlnr16hEYGMizZ8+oUKGC8Qtb3D1t0KBB7Nq1i6VLl7Ju3TocHBwYPHgwefPmNUELJDnZu3cve/bsARImhMPCwti6dSvDhg0DoHXr1mTLlo2goCDOnTuHra0tvXv3Nva0NBgMVKtWDQcHBzZt2vTe2yICJFh1083NjcyZM7NlyxauXbtG+fLlqV27NhMmTACgWLFilC9fnrNnz/LTTz8REhJCy5YtadSoEaVKlTJFE+QjoKSaiLwVc+fO5datW/j6+tK1a1fWrl1Lo0aN2LVrF6NGjcLb25vNmzczbdq0BPseOnSIgQMHUq1aNWbPns2QIUPYt28f/fr1AyA8PJyOHTuSLl06/Pz88PX1JSIigg4dOvDkyZNXxhQYGMjFixcZN24co0eP5uTJkwwaNMi4feXKlQwePJhixYoxffp0qlevTrdu3Yxz3ryuevXqsX37dsLDw41lFy5c4MyZM9SvXx+ASZMmMX36dJo1a0ZAQACjRo3i4cOH9O7dm4iIiCSd7+8OHjxIu3btsLGx4YcffmDo0KEcOHCAtm3bEhkZCcDs2bNZvHgx3bt3Z+7cubRo0YI5c+YY54wQEZF34/bt2/j4+Bhfp0mThkaNGpEmTRq+/fZbAHr27Mn9+/fZuHEjjx49wsPDg7Zt2zJ9+nRmzJhBmjRpaNeuXYIV50TeFoPBwMKFC2nfvj1Llizh9u3bWFhYcPPmTWOd9OnT0717dyIiIoxDOuN6Wm7bto0XL17QpEkT8uXLR//+/WnUqBFHjhxh0aJFfP3116ZqmiRzZ8+eJSAggHv37hnL+vbty4kTJ9iwYQNWVla0adOGqKgoJk2aBEDNmjUpW7Ys06dPx9vbm/Tp09OrVy9sbW0T7cEpoln0ROStsLW1xdfXlxQpUlCmTBlWrFjBnTt3+O2337CzswNeLjl9+PDhBPseOnQIGxsbOnfujJWVFfBy4toTJ05gMBg4f/48Dx48oG3bthQrVgx4OcHo0qVLefr0qfH4/5QmTRqmT59unAPk6tWr+Pn58eDBA9KlS8fUqVOpVKkSo0ePBqB8+fJYWloyefLkJLW9Xr16+Pn5sWnTJho0aAC87HmXJk0aY++5u3fv0rdvX9q0aWPcz9ramp49e3L27FmKFi2apHPGmTx5Ms7Ozvz000/GdhYpUoTatWuzbNkyWrVqxYEDB3B1daVRo0YAeHh4kDJlyle+byIiknSJrfh26tQpfv31VwoWLEjz5s0ByJs3L+3atWPcuHG0b9+e/PnzU79+fTZu3EixYsWoUaMGQ4cOpWHDhv86wbvI2/L33jxXr15ly5YtuLq60rRpU+bOnUuZMmUAKFy4MI0aNcLf359WrVrF62np7u5OiRIl8PPzY+7cuTg6OvLFF1+YqkmSDCX2Gbxx40bmzp1L1qxZqV27NgDlypXDw8ODoKAgPDw8KFKkCK1bt2bu3Ll8+eWXODk50a9fP1q0aMFnn31mPNarVvsU0VUhIm+Fm5tbvBtZxowZcXZ2jpe4SZs2baI9y0qUKEFERAR16tRh8uTJhISEUK5cOXr06IGZmRmfffYZ6dOnp0uXLvj4+LBx40YyZszIgAEDcHBweGVMhQsXNiaaAGPdiIgIrly5ws2bN6lRo0a8feJuuEnh5OREsWLFCAoKMpatW7eOGjVqGJOEkydP5ssvvyQsLIyQkBCWLVvG6tWrAYiKikryOePacezYMTw9PTEYDERHRxMdHY2TkxN58uQxznNSsmRJdu/eTcuWLQkICOD8+fO0bt3a2ItORET+u7h74NatWzl16hQAZcqUoVmzZkyePNk4nM7KyoqKFStSsGBBRo0aBUCPHj148uQJ69atM06ToISavGsGg8HY86ZChQrkzJmTx48fs3//fu7evUuVKlUYN26csb6trS3169cnXbp0fPfddwD06tWLBw8esHLlSsLCwsiWLRvDhg2jffv2JmmTJF9xn8G7d+/m/PnzwMvP1rx58xIUFBRvFeVevXpx6dIl1q5dy/Pnz/niiy+wsbEx9ixOnTq1MaEWt2KoEmryKroyROStSGw59FSpUr3Wvu7u7syaNQsnJyfmzZtn/PVz/vz5wMsb28KFC/H09OSPP/6gR48elC5dGh8fn39NSKVMmTLe67ibYWxsrHHOsQwZMsSrkzFjxteK+Z/q16/Pnj17ePDgASdOnODKlSvxklYnTpygcePGlC5dmo4dO7J48WJjPG/alfzx48fExsYye/ZsChUqFO/fuXPnuHv3LgAdO3bEx8eHyMhIJk2aRO3atalTp86/zucmIiL/LjY2Nt68U6dPn6Zy5coMGTKE9u3b4+/vj7m5OS1atMDKyoqxY8ca6+bMmZO8efNy6NAhgoKCjNu9vb1Jly6dKZojycTx48c5dOgQ8LKHWlwvtaioKEqVKkX9+vU5evQo586do379+ly/fp2FCxca93dxcaFu3bqsXLmSCxcukCtXLipXrkx0dLTxh8R/zmMl8i788zN4165dlC9fnj59+tCqVSsWLVoEQIcOHTh27Bjbt2831nd2dsbV1ZVt27axdetWcuTIwZQpUxg+fHiC8/yz95vIP+kKEZEPQvny5SlfvjwRERHs27ePwMBARo8eTZEiRXBzcyN37txMnDiRmJgYjh8/zqpVq1i8eDE5cuSgY8eOST5fXK+1+/fvxyv/5+vXVbNmTUaPHs2mTZu4ePEijo6OFC9eHPj/OeFcXFxYt24duXPnxtzcnO3btxMcHPyvx/3n/G7Pnj0z/j916tSYmZnRrl27RHvYxSUVzc3NadWqFa1ateL+/fts376dmTNn0rNnT3bv3m18CBYRkdfz92FAjx49wtLSko0bN9K4cWMaN27MlClTCA4OxtnZmdq1a9O2bVt8fX1p3749jo6OwMsvagULFiQgIIBatWpRoUIFUzZJkoHRo0ezYMECcufOjbe3N1WqVDFuy5EjB4cPH2bYsGGEh4ezadMm8uTJQ7NmzZgyZQqtWrUCXl63cXO2duvWjeDgYIYNG6ZEmrxXf/8MvnfvHhkzZmT//v18/fXXuLu7s2jRIiZOnIinpyfVq1dn5cqVrF+/nqJFi+Lm5sa9e/eMybLz588TFRVF2bJlExxb5HXoahERk/v+++9p1KgRBoOBlClTUqlSJeOCAjdv3mT9+vWUKlWK0NBQLCwscHd3Z+TIkaRJkybeJLpJ4eDgQI4cOdi4cWO88g0bNrzR8dKkSUOlSpXYvHkzwcHB1KtXz/iAefHiRR4+fEjbtm3Jmzev8Ua9Y8cOIOEKW3FsbW3jrYAKxJuTztbWloIFC3Lx4kUKFy5s/PfZZ5/h5+fH/v37AWjevLlx3rgMGTLQsGFDWrVqxePHj+MtriAiIq/H3NycmJgYRowYQbVq1ejduzcrVqygfPnyZMqUiSFDhpA2bVrWrVvHvXv3aNCgAa6urjRv3pyff/6ZXr16ce3aNWbMmJGk1aZF/ou6desC8Pz5cwYMGMC2bduMiyVZWlpSqlQp1qxZQ9++fXn48CEhISGULl2a9OnTM2TIEB4+fMiNGzd48OABvr6+tGzZ0pTNkWQobnSHubk5ERER9O3bl6ZNm1K3bl22bNlCrVq1KFSoEL169SJLlizGeZJ79+7N7du3GTNmDMuWLWPIkCHkyZOHqVOn0qNHj3g/MCuhJkmlK0ZETK5UqVL8+eefDB48mN27d7Nt2zZGjx5N2rRpKVWqFMWKFSM2Npbu3buzadMm9u7di4+PD0+ePKFatWpvdE4zMzN69erFpk2bGDFiBLt27SIgIICpU6cCb3ZDrVevHjt27ODGjRvxhn46Oztja2vLzJkz2bZtG7t27eKbb74xdkt/1eqfFStWZN26dSxZsoS9e/cyYMCAePNBAHh7e7Nr1y769evH9u3b2bJlCx07dmTv3r0UKlQIeDln3eLFi5k5cyb79+9n9erVzJs3Dw8PD9KnT5/kdoqIJHfnz58nICCAGzdu4O3tTWRkJHfu3CFr1qzAyx9a6tWrx+XLl1mzZg1ZsmRhypQp5M+fn5UrVxIbG8vUqVO1oqe8V0WKFMHLywtXV1fc3NwICAjgxx9/NG4vUKAAz58/J1WqVDRu3JgdO3YQFhZmTBq3aNGC6tWrY2lpSeXKlfnyyy8BDfeU9yfuWgsJCSEgIICIiAi6du3K8+fPiYiIME59kiFDBrp27UpQUBD79+8nf/789OrViwwZMjBz5kzs7e3x9vY2zl35qh+4RV6Hhn+KiMl5enoyadIk5s6da1ycoHjx4gQGBpI2bVoAY8Jr2LBhREREGHtjlSpV6o3PW7duXZ49e8acOXNYtmwZn332GcOGDWPYsGGvPR/cP9thZ2eHk5MTzs7OxnI7OzumT5/OhAkT6N27N6lTp6ZAgQIsWLCATp06ERISYlwl9O+GDBlCdHQ033//PSlSpKBWrVr069cv3nwP5cqVY86cOfj7+9OrVy8sLS0pVKgQ8+bNM64o2rt3b6ysrFi2bBk//vgjdnZ2eHl50a9fv6S/aSIiydydO3eoU6cO+fLlY9y4cRQqVAg3Nzf69OnD2LFjjT0jmjRpws6dO9m+fTtFixbF3d2dH374gaioKM2bJiYzYsQIWrduTZMmTUidOjXTpk0jZcqUdO7cmaxZs3LixAkAunbtysaNG9mxYweDBw9m+fLlHDlyhMKFC+Pm5mbiVkhyZTAYWLp0KbNnzyZVqlRMmzYNZ2dn8uTJQ8+ePdmxYwe5c+fGysoKT09Pypcvj6+vL0uWLKFBgwbUrVuXx48fGz+D44Z6qnea/BdmhjedIVtE5CO3du1aChYsSO7cuY1l27Zt4+uvv2bVqlVaeU1ERBI1btw4Fi1axNKlSylYsCBRUVH89ttvjBo1it9//x1XV1fg5cTZAwcOpGXLlvTo0cPEUYu8NGXKFA4fPszQoUO5efMm48ePp0yZMsZrtV+/fnh6erJmzRoGDBjAuHHj+OKLL0wdtggAJ0+e5IcffuDUqVPs2bPHWD5w4EDOnz/PoEGDKFmyJAD79u2jXbt2TJ06lerVqxvrxvVMUzJN3gYl1UQk2ercuTMXLlygT58+ZM2alStXrjBt2jRy5MjB/PnziYmJ+Z8rc5qZmWFhYfGeIhYRkQ9BREQExYoVY+jQoTRt2hRra2uuX7/OkCFDiIqKYunSpca627Zto2LFiqYLVuQfnj9/TtWqValXrx79+/dn8+bNzJgxA3Nzc7JmzUr58uVp3LgxAKtXr6ZevXomjlgkvt9//52xY8cyePBgmjZtCsCNGzdo3bo11atXp0uXLqRNm5aIiAgOHz5sXIRA5F1QUk1Ekq0HDx4wefJk45whGTNmpHr16vTq1YvUqVPTpk0bDhw48K/HcHR0ZMuWLe8pYhER+VD8+uuvzJkzh6lTpxp7Nm/atIkePXowZswYGjVqZOIIRV7tjz/+4IcffuCbb76hXLlyXLt2ja5du3L+/Hl69OihnpXyQTIYDJiZmXHnzh0mTZrEn3/+ybJly4wr3vv7+/PLL78wcuRIateunei+Im+bkmoiIq9w8eJFnj59+q91rKyscHFxeU8RiYjIhyI2NpYyZcrQrFkzOnXqhK2tLffu3WPhwoV4enoa57UU+RAZDAYaNWqEi4sLvXr1ImvWrJw8eZKVK1dSp04dXb/y3sSlI5Ka8Nq0aRMTJ06kRo0a9O3bF4AXL17wzTff0KNHD7Jnz/7WYxVJjJJqIiIiIiJv4NixY7Rr1w4/Pz/KlStn6nBEkuTMmTN07NiRrl270qpVK1OHI8lQdHQ0KVIkXDsxbgGBxMT1OAsPD2fmzJksW7aM+fPnkzdv3ncdrkiitPqniIiIiMgbKFKkCPny5eP+/fumDkUkyfLnz0+xYsWwsrIydSiSTMUl1KZPn87jx49JmzYtXbp0+dcFBOJ6tNna2lK+fHn279/PhQsX4iXV/i0pJ/K2qaeaiIiIiMgbiomJ0YI18tHS9SumtG3bNoYPH06WLFnImjUr9+7d49tvv33tqVUMBgORkZHGOdVETEFJNRERERERERF5JxKbN81gMNC/f38cHR3x9vYG4NGjR9jb28dbVOB1ep3FxsZiZmamhQjEJDT8U0RERERERETeiri50mJiYjAYDInOm3bhwgUOHDhAt27duHPnDmvXruXGjRucO3eO7Nmz06dPHxwcHDA3N+fSpUtYWlqSPXv2RHtXaqinmJJ6qomIiIiIiIjIfzZ37lwuX77MiBEj4iW/Fi5cyOPHj8mUKRO1a9cmZcqUdOjQgfPnz3Pnzh3y5ctH1qxZyZYtG8uWLaNr16507dqVM2fO4O3tTerUqfntt99M2DKRxKmnmoiIiIiIiIj8Z4GBgVSvXt2YUDt48CADBw4kXbp0ODo6cvLkSZYuXcrIkSOZMWMGJ06cwNLSkkyZMpEqVSrs7e25cOECN27cAF4uqBEUFMTgwYP5888/KVSokCmbJ5KA+kmKiIiIiIiIyH/y8OFDzM3NyZUrl7Fs2bJlVKpUieXLl+Pn58fEiRM5ceIEQUFBGAwGChYsCIC1tTX29vasX7+esLAwateuDbyce+3+/fs4OTnh4OBgimaJ/Cv1VBMRERERERGR1xY3bxpgXFggZcqUREVFGec4O3/+PMHBwWzevJmoqCiGDRvGli1b+Oqrr2jdujWPHz8mOjqaAQMGYGlpia2tLWfPnqVnz56ULl0aeLm4QYYMGejevbvJ2iryb5RUExEREREREZHXEhQUxOjRo2nRogX169cnR44cANy+fZvo6GicnJwAsLCwwNHRkXHjxrFr1y4KFChAYGAghQoVwsfHh5w5c9KhQwdGjx7NzZs3uXfvHgEBAdja2gLEWwVU5EOlpJqIiIiIiIiIvJa8efPi6enJwoULWbRoEc2bN6dDhw6kT5+e1KlTExMTA2DsfbZjxw4GDRpEw4YNAYiIiCAkJMR4vBIlSsQ7fkxMDObm5kqoyUdBSTUREREREREReS358uVj3LhxXLt2jRkzZjB//nw2bNiAi4sL1tbW5MuXD4Ds2bNTqVIlHj58SGhoqHH/3bt3ExMTQ5MmTRIc22AwxFs1VORDZ2YwGAymDkJEREREREREPj63bt1izpw5bNy4kbt37zJ37lzjnGiPHz9m5syZ/Pzzz+TJk4fUqVNz+vRpevbsSceOHU0cuch/p6SaiIiIiIiIiCTZ3xcsCAkJYcyYMRQtWpTBgwdjbW1trLdv3z5u3LjB3bt3adasGenTpwc0b5p8/JRUExEREREREZH/bOLEiezevZvOnTtTq1YtYmNjjauB/p3mTZNPRcKrW0RERERERETkNcXGxgLQpk0bbG1tCQoK4s6dO4km1OLmTVNCTT4FSqqJiIiIiIiIyBszNzcnNjYWBwcHKlasyKVLl7h161aidZVMk0+Jhn+KiIiIiIiIyH8SNz9aTEwMjx8/Jl26dKYOSeSdU1JNRERERERERN6qV82nJvIpUVJNREREREREREQkiZQ2FhERERERERERSSIl1URERERERERERJJISTUREREREREREZEkUlJNREREREREREQkiZRUExERERERERERSSIl1URERERERERERJJISTURERERERFJtgwGg6lDSOBDjElEElJSTURERERERIzatGlDmzZt3us59+/fj4uLC/v37zeWTZw4EQ8PD4oWLcrKlSvx8vJi8ODBb/W8f/31Fy1atIhX5uLigp+f31s9z+u6ffs2nTt35saNGyY5v4gkTQpTByAiIiIiIiLJW6FChVi6dCl58+YF4Ny5cwQEBNC0aVPq169P7ty5yZcvH7a2tm/1vOvXr+fIkSPxypYuXYqDg8NbPc/r2rNnD9u3bzfJuUUk6ZRUExEREREREZOytbWlaNGixtcPHz4EoHbt2nz++ecApE+f/r3E8vc4RET+jYZ/ioiIiIiIJDMGg4Gff/6ZmjVr4ubmRtWqVZkzZ06ic3mFhYXx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", + "text/plain": [ + "
    " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df = pd.DataFrame(results1, columns = ['size', 'sort_by_downloads', 'missing_values', 'classification_type'])\n", + "df['temperature'] = range_of_temps\n", + "plot_yes_no(df, title = query)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Rather interesting don't you think? At higher temperatures, the model gets the answers wrong. Even at a temperature slightly above 0.1, the model starts adding extra information to it's answers.\n", + "\n", + "Did you notice that I tried to remove sentences that started with \"If\"? There are more examples of this later, but this is because at higher temperatures, the model tends to add random sentences to the answers and this makes it quite hard to plot them." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Experiment 2\n", + "Our second experiment is super easy. \"Find me a dataset that has a lot of missing values and order by number of downloads\". As you can obviously guess, we are looking for a dataset that has a lot of missing values and we want to order the results by the number of downloads." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 20/20 [00:34<00:00, 1.74s/it]\n" + ] + } + ], + "source": [ + "range_of_temps = np.linspace(0, 1, 20)\n", + "query = \"Find me a dataset that has a lot of missing values and order by number of downloads\"\n", + "results2 = generate_results_for_temp(query, range_of_temps)\n", + "results2 = [[y for y in x if \"so\" not in y] for x in results2]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n", + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n", + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n", + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABNUAAAV4CAYAAACHI+uWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3gU9fr+8XvTOz2E3jehE0roHUGRLiogzYLHgghY8JzjUVSOXwuIggX1CCrFgoiIFJFiQakWpAWUGoQQIJQ0Uuf3B7+sLNnADiQ7IXm/rsvrks9Mdp/ZmZ199t4pNsMwDAEAAAAAAABwm5fVBQAAAAAAAADXG0I1AAAAAAAAwCRCNQAAAAAAAMAkQjUAAAAAAADAJEI1AAAAAAAAwCRCNQAAAAAAAMAkQjUAAAAAAADAJEI1AAAAAAAAwCRCNQAAAAAAAMAkQjWgBPn8888VGRl5xf9Wr17tNP/7779foHWsXr1akZGRmjlzZoE+7vXogQceUGRkpI4cOXLVj/HVV18pLi6uAKu6dunp6Zo9e/ZVz/vEE08oMjJSu3fvLvDakpKSNG/evCvOt2nTJkVGRuq///1vgddgtW7duqlly5ZX/fdm1q8Zqamp+uc//6nWrVurSZMm+sc//lHgz5HryJEjioyM1AMPPFBoz1GY27FVCutzoTgoSp9tLVu2VLdu3TzyXJ54L10PZs6c6dRDXS+ysrL04osvqn379mrcuLH69u1r+jGK0rZ/OZGRkerfv7+lNRRE3wegaPGxugAAnhcTE6OYmJh8p9eqVUuSVL9+fY0dO1bNmjXzUGUw6+WXX9b//vc/ffHFF1aX4mT48OE6cOCA7rrrrgKdtyD06tVLFSpU0PDhwz3yfMVRYa2zt956S59//rkaNWqkdu3aOfZFhSEsLExjx45V7dq1C+05evTooSpVqqh8+fKF9hwAcC0+++wzzZ49W7Vq1dLAgQNVrlw5q0sCgOsKoRpQAsXExOihhx664nz169dX/fr1PVARrtapU6esLsElM3V5ehlOnTqlChUqePQ5i5vCWme7du2SJL3yyiuqUaNGoTxHrrCwMLf2g9eiR48e6tGjR6E+BwBci9z97lNPPaV27dpZXA0AXH84/RMAABQJGRkZkqQyZcpYXAkAlAzsdwHg2hCqAciXq2vndOvWTSNGjNC+fft03333qUWLFoqOjtaYMWMUGxub5zG2bt2qUaNGqUWLFmrXrp1eeOEFnT9/3q3nz71Oy5tvvqlVq1Zp4MCBatKkibp166Y5c+ZIkn7++WcNGzZMzZo1U7du3TRz5kxlZWU5PY5hGProo48cf9+qVSvdd999jl9n3fHzzz9r7Nix6tChgxo1aqRWrVrpzjvv1MaNG936++zsbP3vf/9Tr1691KRJE/Xt21erVq3Kd/4vvvhCI0aMUKtWrdSoUSN16NBBjzzyiNO107p166bFixdLkgYMGOB0/ZzExES9+OKLuummm9S0aVM1bdpUN998s2bNmpXn9Vm/fr1GjRqltm3bOmp7++23HY32xVasWKEhQ4YoOjpazZs316hRo5xeg9x19tdffykpKUmRkZF64oknXC6jO/OeO3dOzz33nDp06KAmTZpo4MCBWrFiRZ7Hcmd5c6+RJkmxsbGmrv+yePFi9evXT40bN1bHjh31wgsvKC0tLc987qw3STp58qT+9a9/6YYbblDjxo3VoUMHPfbYYzp06JBb9ZhZv+7KycnRggULNGDAADVp0kQtWrTQnXfeqR9//NExj5n1e7Hly5dryJAhatasmaKjozVkyBAtW7bMMT133WzevFmS1KpVqytec6Zbt24aPXq09uzZo7vvvlvR0dFq3bq1nnrqKaWlpen48eMaP368WrRoobZt2+rRRx9VYmJinmW5+DpQWVlZev3119W3b181a9ZMMTExuvvuu7Vhwwan53Z3vkuvqZb7nDNnztSaNWs0ePBgNWnSRG3bttWTTz7pVF+ulStXavDgwYqOjlbHjh01depU/fTTT4qMjNTnn3+e7+uzatUqRUZGatq0aXmmZWRkqGXLlurdu7dj7Fq2qfyu0ZffdQmTk5M1depU9ejRQ40aNVLHjh319NNPuzwCcu7cuRo0aJBjnzNs2DCX+4D8uPue9ORnW64rvS+kv7eZ1157TVOmTFGzZs3UunVrx2uQmJioZ555Rh07dlTTpk0d74n8XGkfLv293hYsWKCJEyeqSZMm6tChg37++ecrLtOqVavUt29fNW7cWL169dLbb7+tzMxMx/RRo0YpMjLS5b7uiy++UGRkpD799NN8Hz+3L9mwYYPee+899ezZU40aNVKPHj301ltvKTs7O8+8rq7/N2LECEVGRurcuXOSCq7fkKTz58/r+eefV9u2bdWsWTONGDFCmzZtcrk8hbk+fvzxR915551q3ry54/Nz/vz5ysnJcVrmi/uIyMjIfGvNZWbbT0hI0FNPPaXOnTurUaNG6ty5s5566iklJCQ45hk3bpwiIyPzvCcfeughRUZGauHChU7j77//vmMbkOT4HPrll180YsQIRUdHq1WrVho/frxb1y3LyMjQrFmz1Lt3bzVq1EitW7fW/fffr+3bt+eZNyUlRW+88Yb69++v6OhoNW7cWD179tRLL72k1NRUp3nN9H2HDh3Sww8/rK5du6pRo0bq1q2bJk+erBMnTlyxfgDWI1QDYNqxY8c0ZMgQnTp1Srfddptat26t77//XiNGjHD6Uvj9999r9OjR2r59u3r27OkIgV544QVTz7dq1SpNnDhRderU0e23366UlBS98MILmjJlikaPHq0yZcpo6NChMgxDr7/+uubPn+/095MmTdLkyZOVmZmpIUOG6MYbb9TWrVs1ZMiQPF+CXVm9erVGjBih3377TT169NCoUaMUHR2tDRs26O6773brIuRPPPGEXn75Zfn4+Oj2229XRESExo0bp23btuWZ98UXX9SkSZN07tw5DRw4UHfccYfCw8P11VdfacSIEY7mdeTIkYqKipIk3X777Ro5cqSkCxfiv+222/Thhx+qbt26GjlypPr06aMTJ05o+vTpTl+yt27dqvvuu0/79+9X7969NXz4cHl7e+uVV17R5MmTnep67bXXNH78eCUkJGjgwIEaOHCg/vzzT915551asmSJpL+vUxUaGio/Pz+NHTs239Pf3Jl3woQJWrt2rXr37q2+fftq3759Gj9+vNasWeOYx93lrVKlisaOHStJKl++vMaOHXvZawvmWrZsmf7zn/+oXr16uuOOOxQcHKw5c+boscceu6r1lp6erjFjxmjJkiVq2LChRo8erRYtWmjZsmUaMmSIzpw5c9l6zKxfd+Xk5GjChAl65plnlJycrFtuuUU9evTQ9u3bdffddzveU2bW78Wvy4QJE3TkyBH16dNHN998s44cOaKJEyfq5ZdflvT3uqlSpYokacyYMRo7dqzCwsIu+9hHjhxxvPeHDBmiChUq6JNPPtGkSZM0dOhQHT16VLfddptq1KihpUuX6j//+c9lH++5557TzJkzVbp0ad1xxx268cYbtW3bNt19991OXzTdnS8/69at09ixY1WhQgWNGDFC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3tNPP/2kuXPnau7cuSpdurTGjh2rESNGSLrwOkoXrnGUnyu9jlfDnS9GZpa3oGu4eF24u94CAwP16aef6q233tKKFSu0atUqrVq1yhHgPvvss47QzlPLm5ycnOdIzFzh4eGSZPoi7LmP6+/v7/K9GhoaqsDAQJc3fHBXQEBAvtPc2T9c6sUXX1SjRo30+eefa/Pmzdq8ebOmTp2qRo0aacqUKY4vSO7OZ6a2S48sOn36tCS5XC+56+RKbDab+vTpo7ffflu//faboqOjtWzZMvn6+urGG290zFfY76FcuZ8L+/fvd2ufPHHiRNWoUUMff/yxfv/9d23btk0zZ85UrVq19PTTTzuO7suP2X2ppz7bruZ9cel+KPc1clVHbi2525B0dftws8GUq23V19dX/v7+Thdxb9OmjeOIw8cff1z79+/Xzp07NXz48DwBYX7cWVdX41r6jVzlypXLM5a7nnJfh8JcH7lHeuaGSpcKDw93+6Y4FzOz7btTg/T350rnzp01a9YsbdiwQbVr19bWrVt16623qkWLFvL29tbWrVsdoVrjxo3zvMZXsz3k/jjnbo05OTl6++23NWfOHMe6KVeunKKjo1WlShXt27fPaT/hbt9XsWJFffbZZ3rrrbe0Zs0aLV26VEuXLpWvr68GDRqkJ5988qo+zwB4DqEagEKRe4Hx3MbxYpfeIakwBQUFKTg4OM8vwe5KTk7WXXfdpaSkJE2aNEnt2rVT7dq15efnp23btumrr7664mOEhYXp8OHDyszMzPOF4dLXYtu2bXr44YcVERGhV155RY0bN1a1atVks9n0zjvvXPZU1VwvvPCCFixYoF69eumOO+5QZGSkI6S56aab8nxBjomJUUxMjFJTU7V161Z9++23Wrx4saZMmaLq1aurc+fOCgoKkre3t7Zt2+b2lx5PMbu8hcHseitbtqz+/e9/61//+pf27NmjH374QUuWLNHXX38tLy8vvfrqq/k+V2Esb3BwsI4fP+5yWu6Xh8sFfZd73LS0NJ07dy7PTQfS09N1/vx5lSlTxvTjFhZfX1/ddddduuuuu3T06FH9+OOPWrlypdavX69//OMfWrNmjXx9fd2e71rkHjmRkpLidIqg9PcXVnf069dPb7/9tlasWKF69erp+++/V4cOHZxe94LYplwdQXtpEJv7Zbx///566aWXrviYNptNgwcP1uDBg3Xq1Cn99NNP+uabb7Rq1Srdf//9Wrt2bZ7XJldB7EtdKYjPtoJ4X+R+MXdVh6taPLEPd3XUVlJSktLS0pyCBC8vL/Xr10/vvPOOfv31V8e6cPfUT3ddLlS5ljD/Slytk9wbcOS+DoW5PnLfZ8ePH3f5/jh79uxV7c/NbPsX1+BK7raSW0fTpk1VunRpbdiwwXETjpiYGMeplVu2bNHRo0e1f//+azrT4lpqnD17tl599VXFxMRozJgxql+/vuNIsnvuuUf79u1z/K2Zvk+6cEmA559/XtnZ2dqxY4d++OEHff755/rkk08UGhqa58ZIAIoWrqkGoFDknh7wyy+/5Jm2Y8cOj9URGRmp+Ph4l18Kv/32W02fPv2yp0Fs3LhRJ0+e1B133KG77rpLUVFRjl8McxuoK/0q3rBhQ+Xk5Li80+elr8WyZcuUk5Ojp59+WjfffLOqV6/u+GKQe7rAxc936dEtkvTVV1+pXLlyeu2119S6dWtHQ3j+/HnH9aRyH+ODDz5wBDhBQUHq1KmTnnrqKT399NOSpJ9//lnShdcxOzvb5Smev/32m6ZOnZrnDl2eYmZ5C4uZ9bZlyxZNmTJFhw8fls1mU1RUlMaMGaOFCxcqKCjoiq9jYSxvVFSUkpKStHfv3jzTcutx99TGSx9X+ns7utjPP/8swzCu6nELQ1xcnF555RWtW7dO0oXTiW699Va99957atOmjY4fP64jR464Pd+1yr0G3O+//55nmqt9SX7q1q2rBg0aaN26dVq7dq0yMjKcTv2Urn2b8vX1VXp6ep55Dh8+7PTvWrVqyc/PTzt37nT5eO+//77efPNNnT59WqdPn9bMmTMd1/srV66c+vbtqxkzZmjQoEFKS0tzuibXpczuS91VEJ9tBfG+CAgIUJ06dbRr16484eW5c+fyvPae2IdffG3OXL/++qsk5blTZe71+9atW6dvv/1WtWrVcnmq87XIDTMuDTEMw3C6Tl9Bc/U6/Pbbb5L+3n4Kc31cbvs6dOiQTpw4oXr16pl+XDPbfu7Ruq7mlS58DtpsNsd27u3trfbt22vr1q3avHmzvLy8HKeOtm7dWvv373dc17OgrjEWEhKiqlWr6uDBgy6vG7llyxZJf3/2ffXVV/L29tZbb72lTp06OQI1wzDy7FPM9H1r1qzR5MmTlZycLG9vbzVt2lRjx451XLbE1XoEULQQqgEoFI0bN1bdunW1dOlSp6YqISFBs2fP9lgdAwcOlGEYeu6555yuq5GQkKCnn35a77zzTr6nz0h/n25x6QWtjx496jh9KSsr64o12Gw2TZ061ekIk2XLluVprnKf7+TJk07jGzZscBwVd/Hz5Z5acPEt1/39/ZWenu501EB2drb++9//Or585c6/fv16zZo1y9Hw58q9sG/lypUdyyBJzz//vNMyJCcna/LkyXr33Xedrrvk6+t7xdflauZ1xczy5j5fQd+i3sx6O3HihObOnZvnfZB7ge1LrxHm6rnMLK87Bg0aJEn673//6/QFNC4uTm+88YZ8fX118803O8bdXWe5j/vKK684fWlJTEx0HKlU0EenXK2AgAC9++67eu2115z2FRkZGTpx4oT8/PxUoUIFt+e7Vn379pWvr69mzZrl9Nr98ccf+uSTT0w9Vr9+/XT48GG99957Cg4OVrdu3ZymX+s2Vbt2bWVlZen77793jJ05cybPtSz9/f3Vu3dv/fnnn5ozZ47TtE2bNumll17SokWLVKpUKQUHB+vDDz/U9OnTdebMGad5c4O+3P2TK2b3pe4qiM+2gnpfDBw4UKmpqZo6darjy7xhGJo2bVqeZTO7D78ae/fudbq4fnJysl599VXZbDbHMufKvYTC0qVLtWPHjkLZD+ReEP6HH35wWrYFCxbk2aYK0ty5c53W69atW7Vy5UrVq1fPERwW5vro37+/fHx8NGvWLKfwMDU1Vc8++6xjHrPMbPuVK1dW69attWPHjjw3FVm4cKF++eUXtW7dWhEREY7xTp06KSkpSR999JEiIyMdR/XFxMRIunCkWIUKFfIEtNdi4MCBOn/+vJ5//nmn98zOnTs1b948hYWFOfaX/v7+ys7OzhPAvfHGG46eKfcxzPR9+/fv10cffaSPPvrIafzSPgxA0cXpnwAKhc1m0/PPP6/Ro0dr1KhR6tWrl0JCQvTNN9843V2wsA0aNEhr167V119/rT179qhjx47KysrSihUrdObMGT3yyCMuL86eq0WLFqpSpYqWLFmi06dPKyoqSseOHdOaNWvk7+8vm812xea8adOmuuuuu/Tee+9pwIAB6tKli+Lj47V69WpVr17d6YiC3r17a86cOXrmmWe0ZcsWVahQQXv27NH69etVpkwZnTp1yun5KlasKOnC6Vvt2rXT2LFj1bdvX82ePVu33HKLevTooaysLK1fv14HDhxQ2bJllZiYqDNnzig8PFwPPfSQNm3apJEjR+rGG29UxYoV9eeff2rdunWqU6eO44iWNm3aaMSIEZo7d65uvvlmde7cWX5+flq9erWOHTumIUOGOO6GKl24FsnBgwf16KOPqkOHDnnuKngxM/O6YmZ5c59v//79evrpp9W5c+c8AcPVMLPeevTooejoaH300Ufau3evmjVrpuTkZH399deSpHHjxhXo8rqjf//+jvdJv3791KlTJ6WmpmrNmjVKTk7Wk08+qerVqzvmd3edtWrVSnfeeafmzJmjfv36qWvXrpIuHJ1y4sQJjRkzxuXFtK1QoUIFjRo1SnPmzFGfPn0cd5r94YcftG/fPj3wwAMKCQlRSEiIW/NdqypVqmjcuHGaNm2a+vfvr+7du+v8+fP6+uuvHYGRl5d7v43efPPNevnllxUbG6uBAwfmuRbdtW5Tt912m9auXavx48erb9++8vPz08qVK1WjRg3HDWFyTZo0Sb/++qtefPFFrVmzRk2aNNHx48e1atUq+fj46Pnnn5eXl5f8/Pw0btw4TZkyRX369NENN9yggIAAbdmyRdu3b1f//v3z3EXvYmb3pe4qiM+2gnpfjBo1SmvXrtXcuXO1Y8cONW3aVL/99pv27t2b55pTZvfhV6N69ep69NFHtXr1apUpU0br1q3TkSNHdO+997o8Cm3gwIF67rnnZLPZ8hw9WRAaNGighg0b6tdff9WwYcPUqlUr7dmzRxs3blTTpk1NHfFpho+Pj/r376/evXvr1KlTWrlypQICAvR///d/jnkKc31Uq1ZNkyZN0n//+18NHDhQPXr0UFBQkL7//nvFxcXp5ptvNv05K5nf9p999lndcccdeuaZZ/TNN98oMjJSe/fu1Y8//qjw8HA999xzTvN36tRJXl5e+uuvv5zuwNqiRQv5+PgoKSlJvXr1cnmE/tUaM2aM1q9fr6VLl2rPnj1q06aNTp06pdWrV8swDE2fPt2xP+/Xr59+++03DR06VDfddJN8fX21adMm7dy5U+XKlXPap5jp+2677TZ9+umnmjp1qjZv3qzIyEjHdhMUFKR77723wJYXQOHgSDUAhaZp06b66KOP1L59e3377bdatmyZunTpoueff95jNdhsNs2YMUP//ve/FRgYqIULF2rFihWqW7eu3njjjSs2K0FBQZozZ4569uzp+OVy165d6tevn7788ktFRUVp69atTnejdOXxxx/XlClTHBep37t3r6ZMmZLnNIb69evrnXfeUcOGDbV69Wp9+umnOnnypMaNG6clS5bIy8tL3333nWP+YcOGqX379tqxY4fmzp2rlJQUTZgwQQ899JC8vLy0YMECrV69WlWqVNF7772n++67T5Icj9GkSRPNmzdP7du318aNGzVnzhzt2bNHI0eO1Pz5850a5SeffFIvvfSSKlWqpC+//FKLFy9W+fLl9fzzzztOF8312GOPqV69elq5cqWWLFly2dfGzLyumFleSXrqqadUtWpVLVq0SGvWrDH9fK6YWW9+fn56++23NWbMGCUmJmr+/PlauXKlmjZtqrlz56p9+/YFurzusNlsevXVV/Xkk08qODhYn332mdatW6dmzZppzpw5uuOOO5zmN7POnnjiCb388suqUqWKli5dqhUrVqhWrVqaOXOmHn30UVN1FrbHHntMkydPVkhIiBYvXqxPP/1UwcHBeuGFF/Twww+bnu9a3XvvvXr++edVpkwZLVq0SD/++KNGjRqlBx54QFL+F1W/VHh4uNq0aSPpQoB2qWvdprp27aqpU6eqevXqWrx4sb755hsNHDjQ5bUBy5Ytq08//VR33XWXjh8/rrlz52rr1q3q1q2bPv30U6cgYcSIEZo+fbqqVq2q5cuXa/78+crIyNA///nPK36OmN2XmlEQn20F8b7w8/PT7Nmzde+99+r48eOOI11yj+i5lJl9+NXo0qWLpkyZoh07dujjjz9WYGCgpkyZokceecTl/DfddJOkv+9SWxjefvttDRw4UAcPHtS8efOUlpamDz74QE2bNi2U55MuHH3WpUsXff7551qzZo3at2+vTz75JM9dawtzfYwcOVLvvvuuGjZsqFWrVmnx4sUqXbq0pkyZomnTpl3145rZ9mvWrKlFixbptttu059//ql58+bp4MGDGjFihL744gunH2qkC/uG3FNMc49Oky6cppl7dFpBnfqZy9/fX++//77GjRunzMxMffTRR9q4caO6du2qTz75xCncGzZsmP7zn/+odOnSWrhwoZYuXarg4GC98sorjiMAL96nuNv3lSpVSvPmzdPQoUN18OBBffDBB/r222/VqVMnffrpp47TeQEUXTaj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ixfriy++0IoVK3TXXXdp0KBBCg0NlZubm+666y4dOXJES5cuVfPmzfXRRx9p7969aty4sWw2mzIyMpSUlKTKlStTRsChbDabQkJClJqaqk8//VQ//vijWrVqpQceeEB169aVJI0ZM0a9e/fW0qVLNWLECPXv31+ff/65qlatql69ekmSjh07Jg8PD919991mHg6KibS0NLm5uen06dOqV6+eKlSoYD9TbcqUKSpdurRCQkL03nvvydnZWT/88IOee+45devWTd27d9eXX36pKVOm6Omnn1b9+vW1a9cuWa1Wde3aVREREfrtt99Up04dsw8TAPIs635pTk5Oio+PV1JSkkJDQyVJH3/8sU6cOKHFixeratWqOnfunDp37qzp06frlVde0YABA5SQkCBfX19JUmxsrKKjo9WzZ08zDwlAPnF3d5ckValSRdL122NMmDBBFotFH330kSpUqKCZM2dq0qRJSk1NVd++fdWxY8ds73Hy5ElVrlzZ/h7AreJMNUiSGjRooDvvvFN169bV3XffrZMnT+qBBx7Q6NGjdezYMTVt2lQdOnTQpUuXFBsbqzZt2ujZZ5/V119/raNHj+qdd97RmTNnGF7gcB4eHuratatat26tMmXKaMyYMdqwYYMGDhyo1157Tb/99ptCQ0M1fPhwffTRR4qMjNTYsWNVr149vfbaa3rkkUc0ZswYPfHEE+rUqZOqV6/OpZ/IV9u3b9fdd9+tP/74Qx07dtTQoUNlsVgUHR0tZ2dnJSUl6b333pPVapWnp6fc3NzUvXt3tW7dWu+//768vLw0ffp0Xbx4UcOHD1e/fv00cOBAdejQQQ8++KDOnDljv4wUAAq6EydOSPrzDPGs24h4enoqNTVVqampWrlypZ544glVrVpV69ev11NPPaXq1atr0KBBkq7fAmLkyJF67LHHNHXqVPXs2VMZGRnq0qWLWYcFIB9kzejnz5+Xm5ubvUg/fvy4/vjjD02ZMkVhYWHavXu3vv/+e7Vu3VoNGzaUJP3444966qmn9Nprr2n27Nnq27evwsLC+BAS/xqlGuwmTZqkqKgo1alTR0uWLNGkSZN0+vRp9e3bV88//7y8vb1VqlQpHT58WEOGDFGNGjU0Y8YMPfXUU/rpp580ffp0+x9agCNVqVJFPXr00MWLF1W6dGlt3LhRgwcP1oYNG9S/f3+9/PLL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xgxNnDhRv/76q/r27avLly/b3yczM1MLFizQq6++qokTJ+rZZ59V+/btVbp0aS1btkwdOnQwlGvNmjX67bff9Prrr2v8+PHatGmThg0bpszMTLVt21ZBQUFavXp1ttesWrVKlStXVpMmTfL8dcaNG6cvvvhCjz/+uN5++23Fx8frk08+yfG+N/s9aNWqldzc3LRt2zb7a7Zv3y7petGXZfPmzQoICFCDBg0kXf9AccyYMerevbvmzZunxo0b680339SWLVtyzbp9+3b1799fkvS///1PU6dO1YULF9SvXz/7h4rR0dF6+OGHlZKSotdff10ffvih7rnnHi1atEgLFy40dNzjxo3TyZMn9corr+jDDz9U7dq1NX78ePuxAfhnXP4JAMgXW7Zs0aJFizRmzBj72rx58/TBBx+oRo0aSkhIUFRUlF544QX16dNHgYGBOn78uGrWrClPT0/VqlVLR44c0f/93//pypUrKlWqlO6//35VrFhRP/zwg5o2bZrtnmoAACCnEydO6MqVK3rkkUfUuHFjSVJoaKiWLVumq1evavr06WrTpo3eeust+2saN26s7t27a/78+Xr++eft6yNGjMhWngUEBMjNzU0NGzY0nKtkyZKaP3++SpQoYf/1yJEjtXnzZnXs2FH/93//p0WLFikpKUleXl66du2a1qxZY+jBCMePH9f333+vyZMn28uqtm3b6t5779WJEyckXS++8vJ70Lx5c/3yyy8aOnSopOu3rqhTp4527dplf82WLVvUvn17+3xis9n05JNP6oEHHpAkNWnSROvXr9emTZvUtm3bHHnfeusthYSEaN68efbbWLRp00Z33nmnZs2apXfeeUfHjh1TrVq19M4778jb21uSdMcdd2jr1q3asWOHhg8fnqfjlqSdO3dq5MiR6tKliySpefPm8vf3l5ubW55/j4Hijr+NAADyRXR0tCpWrKj09HRJ1y89+fbbb/XGG2/os88+03fffaeQkBDNmDFD+/btU7NmzdSlSxfVrFlTtWrVkiR98cUXuuuuu1S+fHlJUlBQkKxWq2rVqsVZagAA5EH16tUVEBCgESNG6KWXXtL69esVGBiocePGKSUlRTExMerRo0e211SqVEmNGjXSzp07s61n/Xy+Hdq3b28v1KTrTwR1cXGxl1T33XefkpOTtX79eknS+vXrlZycrN69e+f5a2SdRdapUyf7mpOTk7p162b/9enTp/P0e9ChQwft2bNHaWlpOn36tKKiojRixAidO3dO586dU2Jion799dccZ+w1atTI/u9ubm4KCAhQcnJyjqzJyck6ePCg7r777mz3hfX19VXHjh3tOdq0aaPFixfL3d1dJ06c0IYNGzRnzhzFxsYqLS0tz8ctSS1atNC7776r0aNHa/ny5bp06ZLGjx9vL18B/DPOVAMA3Fbp6elydXVVRkaGMjIy5OfnJ0n6/PPPFRISoi5duujAgQOaOXOmLly4oClTpqhSpUq6du2avvjiC3355Zdq2LChTpw4oeTkZL3xxhvy9PS0P6ygQ4cO9vcEAAA35+XlpSVLlmjOnDlas2aNli1bJg8PD/Xq1cteJP316dlZAgMDs91DTFK2EuzfKl26dLZfOzk5qWTJkkpISJAkhYSEqHnz5lq1apV69+6tVatW6Y477lCZMmXy/DXi4+MlXT8L7kZfOy4uTtI//x506NBBU6dO1d69e3Xq1ClVqVJFHTt2VIkSJbRr1y6VKFFCFotFbdq0yfYef33wUtZx5nZf2KtXr8pms90wx9WrVyVdP7NuxowZWrJkiZKTk1W2bFnVr19f7u7uho5bkmbOnKm5c+dqzZo1+v777+Xk5KQ77rhDU6ZMsX+gCeDmOFMNAHDLMjIy9Morr+j555+33/DY1dVVkhQTE6Py5csrMzNTkuTj46OkpCRNnTpVgwYNUkhIiL799ltVr15dkydPls1m06OPPqqHHnpIpUqVUr9+/bRhwwY1bdpUkuwPOKBQAwDAmNDQUE2bNk3bt2/X559/rv/7v//TsmXL7GeFXbp0KcdrYmJicpQyt1NWmZUlMzPTfruHLPfdd5927typkydP6pdfftF9991n6Gtk5f/78f31a/v7++e6j5T996BixYoKDQ3VL7/8ou3bt6t58+ZydXVV48aNtWPHDm3evFnNmjWzX5JplI+PjywWyw1zZOWcN2+ePvnkE02aNEm7d+/Wpk2bNGvWLAUEBBg67qyvOW7cOG3cuFFr1qzRM888o7179+qVV165pWMAiiNKNQDALbNarXJzc9NPP/2kgQMHasqUKfYncnl5eSktLU0uLtdPivb19dW+ffu0e/durVy5UpMnT1apUqUUERGhjRs36uzZs/Lx8dGwYcM0adIkPfzww5KuF3cAAODWrF27Vi1btlRMTIycnZ3VqFEjTZ48Wb6+voqJiVHp0qX17bffZntNZGSk9u3b94+XAf6be5tu3bo128/477//XhkZGWrRooV9rVu3bvL09NTkyZPl5eVlv/dXXrVs2VLS9d+Dv/rxxx/t/16lSpU8/x506NBBO3bs0J49e+w5W7RooR07dmjLli3q2LGjoXx/VaJECdWtW1dr1qyxfyApXT+DbdOmTfaHM+zZs0fVqlXTfffdJx8fH0nSxYsXdezYMfutMfJy3OfOnVP79u3t+4SGhmrYsGG64447dP78+Vs+DqC44fJPAMAtc3Nz08SJEzVo0CB99913Wrp0qb744gs99thjOnjwoJo3b27f984779SGDRsUEBCgcuXK2dc3bNigbt26qXr16tneO+tyz6xSDgAAGNe4cWNZrVaNHDlSw4cPl5eXl9asWaOrV6/qrrvuUv369e1P8+zZs6euXLmi9957T35+fho8ePBN39vX11eXLl3STz/9pFq1aikoKCjPuWJiYvTUU09p4MCB+v333zVjxgy1bt1arVq1su/j6empe+65R8uWLVP//v0N30A/JCREffv21cyZM5WRkaFatWpp9erV9qePS9eLwWeeeSZPvwft27fXggULJMk+47Rs2dL+gIN/U6pJ0rPPPqshQ4Zo+PDheuihh5Senq558+YpLS1NI0eOlHT9iemzZ8/WvHnz1LBhQ505c0YffPCB0tLSlJKSkufjLl++vIKDgzV16lQlJiaqUqVKOnTokH766Sc9/vjj/+o4gOKEv6kAAP61smXLaujQobr//vv18ccfa+/evdq1a1e2SxGqVaumvn376uOPP1a7du3Utm1bHT16VImJiXrjjTdyvGfW5Z4AAODWBQUF6aOPPtI777yjF154QSkpKapevbreffdd+xlNXl5e+uCDDzRy5Eh5e3urbdu2euaZZ3Lcg+vv+vTpo59++kkjR47U6NGjDT2Z86GHHtLVq1c1cuRIubm56d5779W4ceNy/Pzv0KGDli1bpj59+hg/eEkvv/yyAgMDtXjxYsXHx6tt27YaMWKE3n777WzHkZffgyZNmsjHx0eBgYH29Tp16sjb21tlypRRxYoVbyljllatWunjjz/WrFmz9Mwzz8jNzU1NmzbVG2+8Yf/w8fHHH9eVK1e0cOFCvf/++ypbtqx69eoli8WiDz74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8st6++231aRJE9nZ2SkpKUnXr1+Xl5eXbGxsZGdnpzNnzmjVqlWKjo5Wly5dFBQUpHXr1ik6OlpBQUFq27atDh06pNjYWL3//vtq0aKFpYcH4F/67bfftHXrVtWrV0/lypUzhe+5c+dWWlqa6aj0s2fP6t69e0pOTla7du104cIFBQUF6f/9v/+ndevW6e7du/L19dWOHTt08uRJpaWlacqUKWrUqJElhwcAOcbD9k3bunWrFi1apLi4OEVGRsrOzk61a9fW3bt31bdvX23YsEHBwcH67bff1L17d1WuXFmurq7avn27unbtqooVK1poNACelVy5cikqKkqlS5c2rWLy8vJSmzZttGbNGjVq1EhjxozRmDFjNGrUKC1ZskTnzp1T2bJlNXnyZNO9IvC4DEaj0WjpIoC/kpiYqJ07d+rLL79UdHS0/P391bdvX7m7u2vIkCF6//33Vbx4cQ0bNkz79u1TkyZNNHr0aNMpLn369FF8fLy+/PJLC48EwJOWmJioTz/9VAsXLpSDg4O6deumgIAAlSpVStu3b9fQoUO1detWOTo66vDhw+revbsSExMVFBSkzp07q0CBArp165YaN26sUaNG6Y033pAk3blzR46OjqbrPLjZLQDgyclYfWA0Gk2/Z69duyZnZ2fZ29srISFBs2bNUlRUlDZt2qSiRYtKkuLj4zVlyhRt27ZNu3fvliQtWbJEV69eVUJCgjp06MDSfeAFdf78ecXFxalEiRJyd3eXJHXq1EnXrl3TrFmzVLx4cUlSSkqKWrdurdKlS2v06NFydXXVTz/9pGvXrsnV1VX+/v6WHAZeILxLQLbm7OysZs2aacGCBRo/frySk5PVt29f9e/fXxcuXFChQoWUL18+Va9eXYULF1aVKlVMgVpsbKzOnz+vwMBAC48CwNPg7Oys999/X999953atWun5cuXq0OHDpo1a5aMRqPy58+vmzdvSpI8PDxUr149eXp6aujQoSpQoIAk6eeff5aHh4fKli1rel0HBwdJ92dNSCJQA4An6MqVKwoLC1NSUpKsrKxM++WeOHFCnTp10rvvvqt27dpp8eLFMhgMat26tby8vDRt2jTTa7i6uqpt27aytrbW+PHjJUnt27dX//79NWrUKAI14AV09+5djRgxQoGBgRoxYoRatWqliRMnSpJGjhyp33//XTt27NC9e/ck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9+7dlZKSopUrV2rbtm2muqX/zdpbt26dfH19syz17Natm9auXauuXbuqb9++yps3r1avXq09e/Zo4sSJ/xjKmSujnk2bNqlevXoqVaqUJKlq1aoqWbKkoqOjFRYW9tDnjhgxQu+9957c3d01b9483blzx3Sa6JtvvqkvvvhC3bp107vvvquCBQtq165dmjNnjjp27GiamQjAPMxUA2ARjRo1UkhIyBN7vZCQkEwb1T6PXoQxAACA58PQoUM1aNAgrVu3TsHBwVqzZo0++OADdenSJVO/6tWra/To0Tp48KDeeecdffzxxypUqJAiIiIk3T8wIFeuXIqKilKZMmX00UcfKSgoSJs3b9aHH36oN998U5JM/x0VFaXu3bsrMjJSgYGBGjt27GPVb21trTlz5qhp06aaPn26+vTpo5iYGEVFRcnHx0fFixdXaGioYmNj1atXL40ePVqStGjRIhkMBu3fv1+S1LRpU1WqVEkhISGmgw0elC9fPi1ZskQVKlTQhAkTNGDAAF2+fFmRkZFq3br1Y9X+d6pXr65atWopNDRUkydPzvRYgwYN5OLiYjrt9M/Gjh2ryMhIDRw4UHZ2dlqyZIlpJp2jo6MWL16sqlWraurUqXrnnXe0ceNGDR48ONOBEgDMYzA+iZ0TAcBMv/76q5ydnU3Hhv9b586dU2Ji4kOPXH9ehISEKDo6Wlu2bLF0KQAAAMhGjEajAgICVKdOHb3//vuZHgsPD1dERIROnDhhoeqAnIvlnwAs4kmHX08qnAMAAACetNTU1H/sY2VllWU5aWJiohYsWKAjR47o/Pnz6tSp09MqEcBjYPkngH+tUaNGioiI0MSJE1W9enX5+flp8ODBun37tmbPnq169eqpatWq6tevn+Lj403PeXD557p169SyZUv5+PioRo0aGjJkiGJjY02PHz16VF26dFHVqlXl5+enrl276ueffzY9/uelk40aNdKnn36qyZMnq1atWvLx8VFQUJDOnj2bqfZVq1apRYsWqlSpklq2bKndu3erfPnyWrly5SOPv1mzZurfv3+W9latWpn2sUhLS9Ps2bP12muvycfHR5UrV1a7du20Z8+ev3xdb29vhYeHZ2oLDw+Xt7d3prb9+/erY8eO8vX1lb+/v4YPH64bN26YHk9PT1dYWJgaNWqkihUrqlGjRgoNDdW9e/ceeYwAAAB4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", + "text/plain": [ + "
    " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df = pd.DataFrame(results2, columns = ['size', 'sort_by_downloads', 'missing_values', 'classification_type'])\n", + "df['temperature'] = range_of_temps\n", + "plot_yes_no(df, title = query)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hmm, same as before. The model starts adding extra information at higher temperatures and starts getting the answers wrong. (Yes, No?? ) What kind of answer is that?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Experiment 3\n", + "- Now a slightly more complex query. \"Find me a dataset that has 10 classes and sort by number of downloads\". We want it to understand that we want a multiclass classification dataset and we want to sort the results by the number of downloads." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 20/20 [00:55<00:00, 2.80s/it]\n" + ] + } + ], + "source": [ + "range_of_temps = np.linspace(0, 1, 20)\n", + "query = \"Find me a dataset that has 10 classes and sort by number of downloads\"\n", + "results3 = generate_results_for_temp(query, range_of_temps)" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [], + "source": [ + "results3 = [combine_last_two_elements(x) for x in results3]" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n", + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n", + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n", + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n" + ] + }, + { + "data": { + "image/png": "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nJysEydO6Omnn1ajRo3UvHlzPffcc9m2+ywzZ85Uly5dVK9ePfXo0UPffPONy/Xc3aazPk8nTZqkxo0bq3Hjxtc8P+qBAwf03HPPqUWLFqpbt646deqk0aNH6/z5807P+eWXX5Yk/fe//3Xrc/To0aOO+42KitKQIUN0/Phxl+umpqZq0qRJ6tatm+rWraumTZvqscce07Zt2xzrfP3114qIiNAPP/zgdNtp06YpIiJCzz//vNP4zp07FRERoffff1/SpfOkdejQQbGxsRo2bJiaNm2qBg0a6P7779fatWuv+lyyLFiwQH379lXDhg0VFRWlvn376ueff3a5rrvfC9Klc87ee++9atiwodq2bauPP/5YmZmZ2dbL+vy/9dZbVa9ePTVv3lxDhgzR9u3b3aofADyB6Z8AkIOYmBj17dtXVapU0T333KMDBw5o2bJl2rx5s3755ReFhYVJkv744w89/vjj8vPzU9euXeXt7a05c+Zo/vz5ph5v8eLFmjhxom699VY1btxYc+fO1ahRo3Ts2DF9++23atOmje677z4tWrRIH374oUJDQzVw4EDH7V988UX99NNPqlmzpvr27avk5GRHOPTJJ5+oefPmV338JUuWaOjQoQoLC1OnTp1UpEgR/fPPP/rjjz+0bt06zZo165rTZF966SXNnTtXNWrU0L333quDBw9q6NChKlGiRLZ133nnHU2ePFmRkZHq1auXbDab1q9fr/nz52vjxo1atGiRAgIC9MADD2jOnDnatWuX7r33XlWrVk3SpZ3je+65RzExMerQoYM6deqk+Ph4/frrrxo/frzOnTunF198UdKl0PPRRx9V8eLF1a1bN/n7+2vVqlV69913dejQIb399tuOut5//31NnDhR5cuXd9S1aNEiPfjggxo1apTuvPNOhYaGasiQIfryyy+VkpKif/3rXzm+Nu6s+8wzz8jf31/dunXThQsXNG/ePD399NPy8/NznEPM3edbvnx5DRkyRB9++KFKliypvn37XvXcgll+/vlnzZw5U127dlWLFi20fPlyTZkyRUePHnWECGbet5SUFA0ePFh79uxR586ddeutt+rw4cP6+eeftXLlSi1cuFDFihW7ak19+vTR8OHDFRwcfNWT1WfttFWsWDHbsvLly0vSNU8wfvLkSd177706duyYmjZtqq5du2rHjh2aNGmStmzZos8//1w+Pq7bpmHDhumXX35Ro0aNdM899yg1NVUrV67Ut99+q+3btzt2iuPj4zVo0CCdOXNGXbt2VenSpbV7927NnDlTa9eu1dy5c+Xr6+v2epL0+++/a8iQIfL19VWXLl0UFhamFStW6PXXX9eOHTv01ltvSdINvx9mft+yTJ8+XXv27FGXLl3UunVr/frrr5o8ebLi4uI0btw4x3pmPjdc+fTTTzVu3DjVqVNHffv2VVpamhYtWqSnn35aKSkp6tmzpyTpzJkzuu+++3TgwAE1bNhQHTt21JEjR7RgwQItX75ckydPVoMGDZzu+7nnnlO1atU0YMAAXbhwQQ0bNtScOXO0bt06devWzfF5dDUXL15U//79VaFCBd1///3atm2bvv32W8f5/oKDg3XnnXfqgw8+0Lx583T33Xc73X7evHkyDMPxPK5m2bJlmjhxotq1a6emTZvqzz//1Pfff6+9e/fmGGC54+jRo7rvvvvUsGFD9e3bVytWrNC3336rs2fP6u+//1bJkiV1zz33aNOmTZo3b56Sk5OznXNu4cKFOnPmjG677Ta1bt1aS5cu1YgRIxxhVBZ3t+ksK1as0K+//qpevXrp1KlT2d7Dy23ZskWDBg3SxYsX1b59e1WsWFGbN2/WF198oWXLlmnmzJkqVqyYHnjgAa1bt05Lly5Vq1at1LBhw6t+jsbGxqpv3746deqUOnTooHLlymnFihV65JFHsq2bkpKiBx98UBs3bpTdbtd9992nU6dOacmSJVqxYoXee+89derUSW3atJEkrVmzRnfddZfj9ll/4NmwYUO210GS2rdv7xi7cOGC+vXrp8DAQPXs2VOnTp3SggUL9PDDD2vOnDmqWbNmjs8p67O+VKlS6t69uyRp+fLlevbZZ7Vjxw6nUM/d7wVJ+v777zV8+HCVKFFCd9xxh5KTkzVp0iSFhIRkq+Hpp5/WH3/8ofbt26tTp06O+leuXKnZs2e79fsHAHnOAIAC5ocffjDsdrvRv39/Y8KECS7/HTlyJNv6U6ZMcYy1b9/esNvtxhtvvGFkZmY6xocPH27Y7XZjxowZhmEYRnp6utGhQwejYcOGxu7dux3rHTp0yGjRooVht9uNCRMmXLXeI0eOGHa73bDb7cavv/7qGF+xYoVjfPr06dnW79Onj2NswYIFht1uN5599lkjLS3NMX748GEjOjraaN26tZGSknLVOrp27WpER0cbJ0+edBr/9NNPDbvdbowbN+6qt1+9erVht9uNhx56yOmxpk+f7ngeWa97bGysERkZadx///1Genq60/0MHjzYsNvtxooVKxxjL774omG3240dO3Y4xj755BPDbrcb3333ndPtjx8/btStW9do2bKlY+zJJ5807Ha7cfjwYcdYamqqceeddxq1atUyzp8/bxiGYWzZssWIiIgw+vfvbyQlJTnWjY+PNzp37mw0aNDAOH36tGO8ffv2RqNGja76ulxt3azn1atXLyMxMdEx/uuvvxp2u9149NFHr+v5GoZh2O1244477rhmXWvWrDHsdrtRq1YtY/369Y7xpKQko1WrVkZkZKQRHx9vGIa59+23334z7Ha78f777zut9/nnn2fbpt2Rtd0/9thj2ZY99NBDht1uN+Li4rItW758uWG324133333qvf//PPPZ/scMAzDePXVVw273W788ssvhmEYRv/+/Q273W6cO3fOMAzD2LRpk2G3241hw4Y53S4tLc3o3r27Ybfbjf379xuGYRjTpk0z7Ha7MWvWLKd133jjDcNutxvLli0ztV5SUpLRrFkzo3nz5k6faRkZGY5tfvny5YZh3Pj7YWb7u3yb+uuvvxzjCQkJRrNmzYzatWs7tncznxs5iY6ONjp16uT02RcTE2PUrVvX6N27t2Ps5ZdfNux2uzF+/Hin2y9fvtyIiIgwunTp4tiuJ0yYYNjtdqN3795GRkaG0/pZyy7/vM5J1nfJk08+6XQ/Y8eOzbZd3n///UZkZKRx4sQJp/vo1q2b0bJly2y/c5e7/HtkwYIFjvHU1FTj9ttvN+x2u7F3716ndV39Lrl6blnPYeTIkY6xc+fOGQ0aNDDsdrsxdOhQx/dkenq60blzZ8Nutzs+Q7O2B7vdbixZssRxH/Hx8cbtt99uREZGGvv27TMMw9w2bRiG436XLl2a42uTJT093ejSpYtRu3Zt4/fff3daNmbMGMNutxsvv/yyY8xVb5CTF154wbDb7cbs2bMdYxcuXHB8XvTv398x/uGHHxp2u9146aWXnLbZv//+26hfv77RuHFjx3dS165djVatWjm9Dk2aNDEaNmxo2O124+jRo45l/fv3N5o3b+54L7Ie+7HHHjNSU1Md63388ceG3W43xowZ43Tbyz/X1q9fb9jtdqNnz55O33mnT592fK6tW7fOMAxz3wvnzp0zGjVqZLRp08aIiYlxrLd161ajfv36ht1uN3744QfDMAxj9+7dht1uN1544QWn+1y4cKFht9uNUaNGXeUdAQDPYfongAJr3bp1+vDDD13+O3bsmFv3MXjwYNlsNsfPbdu2lSTH7bds2aKjR4+qV69estvtjvUqVarkdBSZO8qXL69OnTo5fr7lllskSUFBQerbt69jvEKFCipZsqTTc5g1a5Yk6ZVXXnE6mqZixYrq27evTpw4oVWrVuX42JmZmRo2bJhGjx6tkiVLOi3LmlJ3rZNzZ00JyTrCKsv999+f7a/Jfn5+Gj16tF555RV5e3s7LWvSpIlbj9eqVSu98cYb2Y7eKFu2rCpWrOg0/ShrWsnlU2t8fX312Wefae3atQoODpZ06XU0DEMvvPCCAgMDHesWL15cgwcPdhz9l9seeOABFSlSxPFz27Zt5eXl5XR0lpnnez2aNGmixo0bO34ODAxUs2bNlJmZ6djWzLxvWa/57t27lZKS4livX79+Wr58ufr163dD9V4uLS3NUd+VssZcTfPNkpqaql9//VVVqlTRoEGDnJb93//9nx599NEcL/oQHh6uUaNG6amnnnIa9/HxUaNGjSRlf022b9+ujIwMx7rPPPOMVq5cqXbt2pla77ffflN8fLwefvhhp6ubenl5OaYKZh0ld6Pvx/Vsf02aNFFUVJTj55CQEEVFRSk9PV2xsbGSzH1u5MQwDMXHxztNMwsPD9fChQs1Y8YMSZfe459//lnly5fX0KFDnW7ftm1bdenSRQcPHsx29E/nzp3l5XVj7bLNZtPzzz/vdD9PPvmkgoODNW/ePMdYz549lZmZqQULFjjGduzYob1796p79+7ZfudcqVixom677TbHz76+vo6jlN393svJ5b8boaGhql69uiTpwQcfdHxPent7q06dOpKUbepjdHS009V7ixcvrscee0yZmZmO7cDMNp0lICDA8d18NZs2bdLBgwd1++23O44CyzJ06FCVKVNG8+bNu+pnhSupqalavHixatasqV69ejnGg4KCnI7AyzJnzhwFBgZm+76uU6eO+vXrp4SEBMf057Zt2youLk779u2TdGl7OHfunO655x5J/5v6npiYqE2bNqlNmzZOPYskPfTQQ44jW7PuU7r69jB79mxJ0gsvvOA4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5BZCNQC4AfXq1VONGjU0b948pyYxLi5OkydP9lgdvXr1kmEYeuutt5yazLi4OI0YMUKffvqpy+kWWbKm/l2543f8+HHHlNL09PRr1mCz2TR27Finkwr//PPP2XaQsh7v1KlTTuOrV692hBSXP17W1LDLz5nl7++vlJQUp6MfMjIy9J///MexE5O1/sqVKzVp0iRHc54l60TN5cqVczwHSXr77bednkNiYqJef/11ffbZZ07njvL19b3m63I967pi5vlmPZ6rc4zdCDPv28mTJzVt2rRsvwenTp1SSkqK6R3Xq4mOjla5cuX07bffOl3cYfXq1frzzz/VuXNnp5NtX8nf319du3bVvn379N133zktmzRpkiTleNRMTq/Jjz/+6JhKnfWa7N+/XzNnztTMmTOd1r1yO3R3vc6dOys4OFiff/6549yJWcaMGaOvvvpKhw8flnTj74fZ7c9dZj43XClSpIi++uorjR8/XmfPnnValhX2lStXTn5+frr99tsVFxenCRMmOK33xx9/aOHChapcubJb58LM+jxyd4c+IyNDH330keNnwzD07rvvKjk5WXfddZfTut7e3urRo4e2bt2qBQsWqFmzZipTpoxbj+OuEiVKqGjRotq6davTZ/6OHTuu+2hnd6xYscIpeIqLi9Nnn30mPz8/R3BoZps2q1GjRqpcubIWL16s33//3WnZhAkTFBMTo9tuu83t6axZfH191b17dx0+fFhTpkxxjKempmrcuHHZ1u/Vq5cuXryot99+2+k7Yfv27Zo+fbpCQ0PVoUMHx3jWhQU+/fRTeXl5OUK1Ro0aycfHx/E7nZuhWu/evSVJ7777rlP4Fx8fr9GjR0v633n+zHwvtG3bVmFhYZo2bZrT+7tv3z7HBZeypKamavLkyZo4caJTYJ+YmKhz586pVKlSpt8rAMgLTP8EgBtgs9n09ttva9CgQRo4cKC6du2q4OBg/frrrzlOF8sLvXv31m+//aZffvlFu3fvVuvWrZWenq6FCxfq7NmzGjZs2FVP7NuoUSOVL19eP/30k86cOaPIyEjFxMRo6dKl8vf3l81my7bDeqUGDRrooYce0hdffKGePXuqXbt2io2N1ZIlS1SpUiWnHaFu3bppypQpeuONN7R+/XqVKlVKu3fv1sqVK1W8eHGdPn3a6fGydipHjRqlFi1aaMiQIerRo4cmT56su+66S506dVJ6erpWrlypAwcOKCwsTPHx8Tp79qxKly6tJ598UmvXrtUDDzygW2+9VWXKlNHevXu1bNkyVa9eXXfccYckqVmzZhowYICmTZum22+/XW3btpWfn5+WLFmimJgY9e3b1+kk5qVLl9bBgwf13HPPqVWrVtmuXnY5M+u6Yub5Zj3e/v37NWLECLVt29ZpJ+16mXnfOnXqpKioKM2cOVN79uxRw4YNlZiYqF9++UWSsl2B8UZ4e3trxIgRevzxx3XXXXepR48eSkpK0rx581S8eHHHlMqreeGFF7Rx40a9+uqrjiv5bdu2TevXr1enTp3UrVs3l7e744479PPPP2vIkCG6/fbbFRwcrG3btmndunUqUaKE02tyzz336LvvvtPYsWO1bt06RURE6PTp01q0aJGCgoL0r3/9y9R6oaGhGjlypJ577jn16tVLnTp1UunSpbV+/Xpt3bpV9erV00MPPSTpxt8Ps9ufu8x8brji5+enoUOHauTIkerevbs6d+6sgIAArV+/Xtu2bdOdd97puIro888/r7/++kufffaZ1q9fr6ioKB05csQxPXTMmDFuHYWW9Xn08ccfa+fOnRoyZMhVz0lYokQJ/fjjj/rnn39Ut25d/fXXX9q8ebMaN26sBx54INv6vXr10uTJkxUTE6Onn376mvWY5e3trbvuukuTJ0/W3Xffra5duyo+Pl6LFi1S/fr18+xo3PLly2vQoEHq3r27fH199euvv+rUqVN6/fXXHVeCNLNNm+Xl5aVRo0bp4Ycf1qOPPqr27durUqVK2rRpkzZv3qzq1avrhRdeuK77fuaZZ7R69WqNGjVKK1euVPXq1bV69WqdPXs227YxePBgrVy5UvPmzdPu3bvVrFkznT59WkuWLJFhGBo/frzTNM6yZcvKbrdrz549qlWrlmO6aXBwsGrXrq2tW7eqUqVKbl8t1x1NmjTRgw8+qClTpuiOO+5Q+/btJUnLli3TyZMnNXjwYEe4Z+Z7oUiRInrrrbf01FNPObY9SVq0aJHCwsKcQvv69eura9eu+uWXX9SrVy81a9ZM6enpWrJkic6cOaP//Oc/ufZ8AeBGcKQaANygBg0aaObMmWrZsqWWL1+un3/+We3atdPbb7/tsRpsNpsmTJigV155RYGBgfr++++1cOFC1ahRQx999JFjJzwnQUFBmjJlirp06eL4a/mOHTt0xx13aO7cuY6r1OV0zqksL7zwgkaOHOk4KfqePXs0cuTIbH9Br1Wrlj799FPVqVNHS5Ys0XfffadTp05p6NCh+umnn+Tl5eV0JEG/fv3UsmVL/f3335o2bZouXLigZ555Rk8++aS8vLw0Y8YMLVmyROXLl9cXX3yhRx99VJIc91G/fn1Nnz5dLVu21Jo1azRlyhTt3r1bDzzwgL7++munAHT48OEaPXq0ypYtq7lz52rOnDkqWbKk3n77bcd00SzPP/+8atasqUWLFl1zSpKZdV0x83wl6bXXXlOFChX0ww8/aOnSpaYfzxUz75ufn58++eQTDR48WPHx8fr666+1aNEiNWjQQNOmTVPLli1zpaYs7dq10+eff67q1atr1qxZWr58udq3b6+ZM2e6daW4MmXK6Pvvv9e9996r3bt366uvvtLx48f12GOPafz48Vd93PHjx6tSpUqaN2+e5syZo5SUFL322mv6/PPPJf3vfSlatKimT5+u++67TwcPHtSXX36p5cuXq02bNvruu+8cU67cXU+6dD6z6dOnq1mzZlqxYoWmT5+uxMREPf7445o6darjCNUbfT/Mbn9muPu5kZMBAwZo/PjxqlChghYsWKCvv/5aqampevnll50+h8PCwvTdd9/poYce0smTJzV9+nRt27ZNPXv21OzZs9WgQQO3Hq9bt2667bbbdOTIEc2YMcNxBGFOSpUqpSlTpigtLU3Tp09XTEyMBg8erM8//9zluRvtdruqV6+uwMBAx1WZc9uzzz6rJ554QpI0bdo0bd++Xa+++qoefPDBPHk86dLn+JNPPqk///xTP/zwg8LDw/XRRx/pvvvuc1rP3W36etxyyy2aNWuWunXrpk2bNunrr7/W2bNn9dhjj+n777+/7nPqFS1aVDNnzlTfvn21e/duffvttypZsqSmTp2a7Wgqf39/TZ06VUOHDlVaWppmzpypNWvWqH379vr222/VqVOnbPffpk0bSZeOyr1c1h95so5my00vvfSSxowZo/Lly2vevHlauHChqlatqg8++EDPPfecYz2z3+edOnXS1KlTVbt2bS1YsEDLli3TPffc4/Iqy6NHj9awYcOUkZGhb7/9VrNnz1bFihX18ccfq0+fPrn+nAHgetiMvD4BCwAAAAC3nD9/Xi1btlTXrl01ZswYq8sBAABX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4481ffp09enTRytWrNDw4cPl6uoqb29v500MAABA4fjwww/Vp08fDRkyRCtWrJDNZpPValVaWpouX76ssLAwubq6yt3dXSdPntSjjz6qyZMn67bbbtMXX3yho0ePasmSJapUqZLuvfdehYWF6cKFC/rXv/6lBQsWKDg42OynCKAUcjU7AHCzgoOD1bdvXy1fvlzNmjXTwIED1bNnT/3888966623tHnzZl25ckUBAQE6ePCg3n33XSUkJCg2Nlb16tUzOz6Av8nhcCgzM1NBQUF66qmn9Nprr6lHjx5q3LixwsLCtHr1an333Xfq06ePBg0apLfeektDhw5VzZo15XA4FB4eriFDhmju3Llq3769ateurZo1a8rDw0Ourq7auHGjXnnlFXXs2FFVq1Y1++kCAFCqDRw4UFWrVtWiRYs0YcIERUZGaty4capQoYLCwsJksVgUHx+vSpUq6fXXX9dtt92mlStXKjAwUJK0bt06JSQkaMSIEerbt6/zcjEAUJg4Ug0l2iOPPKILFy5o1apVunr1qgICAtSvXz8tWLBAEydO1C233KJLly7pf//7n+Lj41W+fHkKNaCUsFgscnNz07Vr19SyZUtVqlRJn3zyiTIzM3X33XerSpUq+vzzz5WUlKT7779f1apV06xZs5yPlaRRo0bJ19dX8fHxkq7fVfi5557T6NGjNWnSJPXp00cvvPCC3N3dTXueAACUBb6+vurRo4c+/vhjvfzyy0pPT9e4ceM0fvx4nT17VpUrV1alSpXUunVrValSRc2bN3cWahcuXFB0dLQGDBhg8rMAUNZYHNlXgQRKqBUrVujNN9/Us88+q06dOuXYlpGRoXXr1qlJkyYKCQkxKSGAwvLpp59qxowZ6tChgzZt2qSMjAzNnDlTPXr00Ndff60PP/xQffv21UMPPaQVK1bomWee0fvvv6+2bdvK4XDIYrEoMzNTrq7/d+D25cuXFR0drTp16nDaJwAAJlqxYoU+++wzHT58WC+++KJ69+6t+Ph4TZ8+XStWrFDr1q0VFhamH374QTVq1NBrr72moKAgs2MDKEMo1VDiORwO3X333YqIiNDjjz+uoKAgZWVlyWq1cmdPoJTILsB+78SJE3rkkUf00EMPqXfv3tq3b5/effddxcXFadGiRbJarZo6daqOHDmiGTNmKCwsTEOGDNH58+f1448/Oq+xJom/GQAAFCNZWVlycXGRdP0otCeeeEKVKlXSpEmTFBISoqSkJP3www/av3+/4uLi1K1bN91zzz0mpwZQFlGqoVSIiorSyJEj9fDDD+v+++83Ow6AAvTHI8myzZs3T1988YW+//57eXp6ymKx6MKFC+revbvGjh2r0aNHa9OmTZozZ47q1q2rqVOn6tChQzp//jx3AAMAoASw2+2yWq369NNPtXjxYt17770aOnSo2bEAwIlrqqFUiIiIUPPmzbnuEVCKZH/m4+rqKrvdrk8//VRr1qxRdHS0JCkgIEBpaWnOQs1msyk4OFjDhw/XJ598ojNnzqhDhw6KiIjQ3r17dfbsWdWvX59CDQCAEiL7CPJ7771X1apV07fffqvDhw+bnAoA/g93/0SpMXv2bOdh4gBKvuxBesOGDXriiScUGBioK1eu6JZbbtHcuXN1yy23yNfXVx999JH++c9/Oo9m8/X11aVLl/TBBx/o5Zdf1sMPPyxfX1/5+fmZ+XQAAIBBFotFdrtdbm5uuvPOO7VixQpezwEUK5z+CQAols6cOaMNGzZo7969atWqlQYOHKivv/5aH330kVq0aKEXXnhBTz31lPbs2aP33ntPYWFhkqRXXnlFMTExio+P1/vvv++82cDvr88CAAAAAH8XpRoAwHR5FV4zZszQN998Iz8/Py1evFj+/v7KzMzU+++/r4ULF+rDDz+Ut7e3Jk+erL1796pt27aKj4/XpUuXtHjxYgUHB5v0bAAAAACUBZRqAADTZF+AOFtiYqJ8fHzk5uam6Ohovfjii4qKitK6deuc10yMiorSf//7X7m4uGj+/PmSpM8++0znz5+Xu7u7HnnkEef3vNFNDgAAAADg76JUAwCYLvu0Tn9/f125ckVPPfWUOnXqpFWrVmnmzJnq37+/Hn74Yef+S5cu1bx58zRy5Mg87/hLmQYAAACgsHH3TwCAqV5//XXNmjVLAwcO1GOPPaZWrVrpmWee0fz589W1a1c1b95cP/74o06cOOF8TPv27VWnTh1t2bJFf/xsyOFwUKgBAAAAKHSUagCAIpGZmZlrLSkpSVu3btWkSZN0//33q0mTJrp27ZqysrJUqVIlubu7q2/fvnI4HFq0aJHzcZUrV9YLL7yguXPnOu8Smu2PXwMAAABAYaBUAwAUquwjybKPHjt06JAuXLggSbpw4YKOHTumrl27av78+WrXrp1iY2O1aNEiVahQQTt37lSHDh3UunVr/fDDD9q4caPz+1apUkXS9ZscAAAAAEBR4/wYAEChyj5ybN26dZo6dap8fX0VExOjJ554Qg0bNlTFihXVtm1bVa1aVf/5z3/UvXt3SdKkSZPUrl07tWzZUt27d5eLi4vCw8Nzff8/3jUUAAAAAIoCpRoAoNBt375dM2bM0P33369evXrpxx9/VLly5RQQEKCGDRvq119/1ZtvvqmaNWtKks6dO6erV6+qatWqkqRmzZqpWbNmJj4DAAAAAMiJUg0AUGBudNfNdevWycvLSw8++KCsVquGDh3q3NazZ0/99ttvmjhxooYPH67g4GC999578vX11a233prj+9jtdlmtXLkAAAAAgPl4ZwIA+NscDkeOu24eO3ZMFy9elCSlp6crOjpaYWFhzv0zMjIkXT+CLSoqShMnTpTNZtObb76pJ598Uu7u7vroo48UGhqa4+dQqAEAULz88S7cAFCW8O4EAPC3WSwWWSwWbdy4UT179tT48ePVvXt3rV+/Xh4eHqpSpYp+/fVXnTt3TpLk5uYmSfrf//6n/fv3q2XLllq4cKEWLlyoRYsWac6cOQoICOAmBAAAFGO7du3S6NGjDT+ua9euevbZZwshUf68+eabeV6ntaht27ZN4eHh2rZtW5H8vOLyvIHShNM/AQAFYtmyZZozZ47uu+8+3XrrrYqKinLeoXPUqFFaunSplixZojFjxsjX11eS5OHhoRo1akiSfHx85OPjI+n/jnzjJgQAABRfS5cu1YkTJ8yOAQCmoVQDABiSlZWVo+xyOByyWCw6evSoIiMjnZ9YW61WpaWlafv27YqMjNRzzz2n6dOn69ChQ+rXr59++ukn5w0K/ij7yDcAAAAAKK44/RMAkC9/PHrs7NmzstlsslgsstlsiomJ0dGjR/Xyyy+rf//+mjhxooYOHap//vOfmjZtmgYMGKCpU6fK19dXX375pex2u5YuXaomTZqY/MwAACjdDhw4oGHDhqlFixZq1qyZhg8frj179ji3//LLLxo8eLBatGih1q1ba8KECYqJiXFu/+qrr1S/fn0tXbpU7du3V2RkpB577DF9/fXXOnfunMLDw/XVV18ZypSRkaGpU6eqVatWatmypSZOnKj4+HhJ0vr16xUeHq5NmzbleMzOnTsVHh6uXbt25fvnpKen67///a/at2+vZs2aadKkSUpPT8+135/9DtauXavw8HAdOnTIuf+yZcsUHh6upUuXOtcOHz6s8PBw/frrr87f2d69ezVw4EA1atRIXbp00Ycffvineffv368RI0aodevWat68ucaMGaNjx47l2CcqKkrjxo1TmzZt1KBBA3Xs2FFTp07VtWvXDD3v+Ph4TZgwQe3bt1ejRo105513atmyZfn+3QKgVAMA3MCxY8dks9kkXb/rZvbRY7t27dI999yj8ePHq1evXpo9e7ZSUlL08MMPq2HDhtq6dasiIyM1aNAgrVy5Uv3799emTZt05coV3X777ZozZ47eeustvfnmmwoODua6aQAAFKLk5GSNHDlS5cuX15tvvqnZs2crLS1NI0aM0NWrV7Vs2TL985//VGhoqGbNmqVJkybp119/1cCBA3X58mXn98nKytL8+fP1yiuvaNKkSZowYYI6deqkSpUqacmSJercubOhXCtXrtTBgwf16quvauLEiVq/fr1GjRqlrKwsdezYUUFBQVq+fHmOxyxbtkw1a9ZUixYt8v1znn76aX3++ed66KGH9Prrr+vKlSv6+OOPc33fP/sdtG3bVu7u7tq8ebPzMVu3bpV0vejLtmHDBgUGBjo/MLTb7Xr88cfVu3dvvffee2revLlee+01bdy4Mc+sW7du1aBBgyRJ//nPfzR16lTFxMTovvvuc55mGxcXp/vvv19paWl69dVX9f777+uOO+7QggUL9Mknnxh63k8//bROnDihF198Ue+//77q16+viRMnOp8bgL/G6Z8AgFwOHTqkhx56SD169NDkyZOdd/Zat26dXnrpJfXr10+9e/fWkSNHNG/ePO3cuVOffPKJXnrppVzfq3z58qpVq5YCAgKca/7+/pKuD5tcNw0AgMJz/PhxJSQkaOjQoWrevLkkKSwsTEuWLNHVq1c1Y8YMdejQQTNnznQ+pnnz5urdu7c+/PBDPfPMM871MWPG5CjPAgMD5e7urqZNmxrOVb58eX344Yfy9vZ2fj127Fht2LBBXbp00T/+8Q8tWLBAKSkp8vHx0bVr17Ry5UpDN0Y4duyYfvjhB02ZMsVZVnXs2FF9+/bV8ePHJV2fRfLzO4iMjNSWLVs0cuRISdKWLVvUoEED7dixw/mYjRs3qlOnTs67lTscDj3yyCO65557JEktWrTQmjVrtH79enXs2DFX3pkzZ6pGjRp67733nPNRhw4dnB9KvvHGGzp69Kjq1aunN954w3mN2nbt2umXX37Rtm3bNHr06Hw9b+n6XdjHjh2r2267TZIUGRmpcuXKyd3dPd+/Y6Cs40g1AEAuoaGh6tOnj9atW6fTp087B7sNGzaobdu2evLJJxUREaGEhASdO3dOzZs3V2pqqpKTkzVnzhxNnTpVmzZt0qRJk/TZZ5+pd+/eef6c7KETAAAUjjp16igwMFBjxozR888/rzVr1qhixYp6+umnlZaWposXL6pPnz45HlO9enU1a9ZM27dvz7Fer169AsvVqVMnZ6EmXb8jqKurq7Okuvvuu5Wamqo1a9ZIktasWaPU1FTddddd+f4Z2UeRde3a1blmtVrVo0cP59enTp3K1++gc+fO2rVrl2w2m06dOqXY2FiNGTNG586d07lz55ScnKxff/011xF7zZo1c/5vd3d3BQYGKjU1NVfW1NRU7d+/X7169crxgaO/v7+6dOnizNGhQwctXLhQHh4eOn78uNauXau3335b8fHxzjMM8vO8Jal169Z68803NX78eC1dulSXLl3SxIkTneUrgL/GuxkAgJPdbldmZqbKly+vXr16qXLlypo1a5Zz+8aNG3Xbbbdp06ZNuvXWW/XVV1/p7bff1p133qnVq1fL19dXvr6+OnDggKZNm6a4uDgtWbJEPXv2NPFZAQBQdvn4+OjTTz9Vp06dtHLlSo0bN05t27bV888/7zy9s2LFirkeV7FiRV29ejXH2u9LsL+rUqVKOb62Wq0qX768kpKSJEk1atRQZGSk8xpfy5YtU7t27RQcHJzvn3HlyhVJ14+Cu9HPTkxMlPTXv4POnTsrLS1Nu3fv1pYtW1SrVi116dJF3t7e2rFjhzZv3iyLxaIOHTrk+B6enp65nmf2GQC/d/XqVTkcjr/MkX1kXWRkpO644w69/PLLOnz4sDw8PAw9b0maPXu2hg8frgMHDmjy5Mnq1KmTRowYoXPnzuXKACBvnP4JAHCyWq2yWq06evSo1q9fr5CQEK1Zs0ZbtmxR27ZtVadOHY0dO1ZBQUEaOXKkBg4cKA8PD82ePVsbN25Uv379NGzYMD344IOKjY1VaGiopOvXYbFardzREwAAE4SFhWn69OnKysrSvn37tHz5ci1evNhZUF26dCnXYy5evJirlClI2WVWtqysLCUkJKhChQrOtbvvvlv/+te/dOLECW3ZskUzZsww9DOy81+6dEmVK1fO82eXK1fOuc8f/f53UK1aNYWFhWnLli06deqUIiMj5ebmpubNm2vbtm1ycXFRq1atnKdkGuXn5yeLxXLDHNk533vvPX388cd68cUX1b17d/n5+UmSBgwYYOh5Z//Mp59+Wk8//bROnjyptWvXat68eXrxxRf13nvv3dTzAMoajlQDADg5HA69/fbb6t+/v+Li4pScnKz09HS99dZbkqTbb79d5cqV05gxYzR06FDnp6LR0dGqWbOmXF1d5eLiIovFkqNQy14DAABFa9WqVWrTpo0uXrwoFxcXNWvWTFOmTJG/v78uXryoSpUq6bvvvsvxmOjoaO3Zs+cvTwP8O5dx+OWXX5SZmen8+ocfflBmZqZat27tXOvRo4e8vLw0ZcoU+fj4OK/9lV9t2rSRdP138Hs//fST83/XqlUr37+Dzp07a9u2bdq1a5czZ+vWrbVt2zZt3LhRXbp0MZTv97y9vdWwYUOtXLkyx02crl69qvXr1ztvzrBr1y7dcsstuvvuu52F2oULF3T06FHZ7fZ8P+9z586pU6dOzn3CwsI0atQotWvXTufPn7/p5wGUNRypBgBwio2N1Zo1azRt2jTdcccdkqTFixfrvffe09KlS3XXXXdp8+bNmjFjhpKTk1WvXj39/PPP2rp1q/773//mWZxxIwIAAMzTvHlz2e12jR07VqNHj5aPj49Wrlypq1evqmfPnmrcuLHzbp79+vVTQkKC5s6dq4CAAD344IN/+r39/f116dIl/fzzz6pXr56CgoLynevixYt69NFH9cADD+j06dOaNWuW2rdvr7Zt2zr38fLy0h133KElS5Zo0KBBhi+gX6NGDQ0cOFCzZ89WZmam6tWrp+XLl+vIkSPOfaxWq5588sl8/Q46deqk+fPnS7p+UX/peoGVfYODv1OqSdKECRM0YsQIjR49WoMHD1ZGRobee+892Ww2jR07VpLUuHFjzZs3T++9956aNm2qM2fO6N1335XNZlNaWlq+n3eVKlUUEhKiqVOnKjk5WdWrV9eBAwf0888/66GHHvpbzwMoSyjVAABO586d06lTp1SlShXnWo8ePfTbb7/p/fffV69evfTf//5XL7zwgr799lstX75c5cqV0/z58xUR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qHH9yJDt27dLklq0aFF0wQHgd/4fe/cZFdX1vn38O4AUaYJdRGPvvVds2FtU7N0EO/ZYYu8m9t5ijcYuFlTs2BvG3iLWWFBARRRFYJ4XPjORaPKL+YsYvT5rZSlnzuw5Ox6H8eLe97awMFC7TCZql8n0v08WEflC6HOemBTJmYoiOVMl9GWIiIh8cAkaqllbW9O8eXPGjx+Pq6srbm5u/Pjjj6RKlYrKlSsTExNDWFgYjo6O2Nraki9fPgoWLEiPHj0YOnQoz58/Z/DgwdStW5eUKVMm5FRERERE5A36nCciIiKfuwTtqQbg4+NDgwYNGDhwIE2aNMHS0pKffvqJRIkSce/ePUqXLs2WLVsAMBgMTJ8+nbRp09KqVSu6d+9O2bJlGTp0aMJOQkRERETeos95IiIi8jkzGI1GY0JfREKqWLEiALt27UrgKxEREZH/En2G+PTpz0hERET+jX/6GSLBK9VERERERERERET+axSqiYiIiIiIiIiIvCeFaiIiIiIiIiIiIu9JoZqIiIiIiIiIiMh7UqgmIiIiIiIiIiLynhSqiYiIiIiIiIiIvCeFaiIiIiIiIiIiIu9JoZqIiIiIiIiIiMh7UqgmIiIiIiIiIiLynhSqiYiIiIiIiIiIvCeFaiIiIiIiIiIiIu9JoZqIiIiIiIiIiMh7UqgmIiIiIiIiIiLynhSqiYiIiIiIiIiIvCeFaiIiIiIiIiIiIu/JKqEvIKE9ePCAmJgYKlasmNCXIiIiIv8h9+7dw9LSMqEvQ/6GPueJiIjIv/FPP+d98ZVqNjY2WFl98dmiiIiIvCcrKytsbGwS+jLkb+hznoiIiPwb//RznsFoNBo/wvWIiIiIiIiIiIh8Nr74SjUREREREREREZH3pVBNRERERERERETkPSlUExEREREREREReU8K1URERERERERERN6TQjUREREREREREZH3pFBNRERERERERETkPSlUExEREREREREReU8K1URERERERERERN6TQjUREREREREREZH3pFBNRERERERERETkPSlUExEREREREREReU8K1URERERERERERN6TQjUREREREREREZH3pFBNRERERERERETkPSlUExERERERkc9KbGxsQl+CyL+m+/e/Q6GaiHxxYmJiEvoSREREPmnR0dEJfQki/4rpc56FRdx/6hqNxoS4HJH3YjQaiYmJMd+/z58/T+Arkv/FYNS7i4h8AWJjYzEYDBiNRvM3qZCQEJycnLC2tk7gqxMREfk0xMbGxgkjgoKCSJYsGc7Ozgl4VSLvb+nSpZw+fRpHR0fat29PqlSpEvqSRP6xa9euMXnyZJ4+fUrWrFlp3rw57u7uCX1Z8g6qVBORz9b9+/eZNGkSkZGRWFhYYDAYsLCw4PLly7Ro0YIOHTrQsGFDfvnlFx48eACo1FpERL5spkDN398fT09PunfvTs2aNblw4UICX5nIP3P16lXq1avHkiVLsLe35/z585w+fTqhL0vkH/v555+pX78+9vb25M6dmxcvXmBlZZXQlyV/QX8yIvLZ2r59O2vXrsXFxYXWrVtjNBrZu3cvI0eOpHz58hQqVIjdu3czZ84cjh8/zsSJE99aKiAiIvKlWbJkCYsWLaJZs2aUKlWKo0ePkjRp0oS+LJG3xMTEYGlpGefY7t27SZMmDdOnTwdeL5+zsbEhKipKqxPkk/LnymCAx48fs3fvXsaOHUuVKlUACA4OxtHRkfDwcJycnN75PEk4CtVE5LNiWtFuMBioWbMmZ8+eZevWrZQvX5706dPj5+dHgQIFGDhwIADVqlVj7ty5rFixgi1btlC9enWMRiMGgyEhpyEiIhLvoqOj31n9EBgYSN26dWnXrh0AlpaWhIaGEhoaSsaMGbG1tf3YlyoShylMMwVqpsAsMjKSEydOYG9vz+3bt9m7dy+//fYb165d4+XLl3Tv3p1SpUol8NWLxA2Ew8LCcHV1BV5XCx8/fpwiRYpw6NAhNm3axJMnT7hw4QIpU6ZkwoQJpE2bVv9e+YQo3hSRz8Lt27eB12GawWAgNjYWV1dXKleuzKtXr1i5ciUA+/fvp2jRosDrD2AAlStXJl26dPj7+5t7r4mIiHyujEYjRqPRHKidOHGCGzduEBERQWRkJC9fvuTQoUNMmjSJBg0a8N1339GgQQM6d+7M3LlzE/jqRTCHEStXrqRly5Z07NgRX19f7OzsKFCgAFeuXMHT05NFixbx6NEjcuXKRVRUFHPnziUiIiKBr17k9T187949OnXqRJs2bWjRogU7d+7EycmJ1q1bM2/ePNq3b09oaCipU6emSZMmhIeHM23aNAD9e+UToko1EfnPGzlyJD///DPNmzencuXKFC1a1FwSXb58eY4ePcq+ffsoXbo0efPmZf/+/TRs2NB8zldffYWjoyPPnj3TNygREfnsmb7XHTx4kOHDh2M0GgkLC8Pb2xtvb2+8vLxYt24d27dvp1y5cqRLl47ChQszYcIEzpw5w9OnT3F0dEzgWciXLCQkhP79+3PlyhWaNm3K1atXefz4MQDe3t7UqFGDJ0+e4ObmBoCrqys//fQTvr6+6k0ln4SAgAD69+9PqVKlaNOmDdevXydFihQA9OjRg7p16+Li4oKjo6M5RN63bx+ZMmVKyMuWd9A7ioj859WqVYuff/6ZVatWsWbNGqpWrUrr1q3JmDEj1tbWVK1alYsXL7J8+XKKFi3K/PnzOXnyJAULFsRoNBIdHc2zZ8/46quvFKqJiMgX4cSJE4wcOZJatWrRqlUrjh49SrZs2QCoWLEiFStWfOs5iRMnxtXVVYGafFTv6pt2/vx5nj59ir+/P7a2thiNRh4/fsyTJ0+wtbUlXbp0HD16lAcPHpAlSxbOnDnDli1bqF27tpYvy0dlWgXz5r8xjEYjR44c4euvv6ZPnz4A3L17l0SJEnHz5k3Sp09P4sSJ2b17Nzly5CBNmjQsW7aMhw8fUrBgwYSaivwFhWoi8p+XL18+PD09CQ0NJX369Fy9ehUvLy9KlSpFz549KVy4MOXKlWPXrl2EhYVRunRpevXqRY8ePciaNSubN2/m5s2b+Pj4JPRUREREPqh3BRLwuh1CmjRp6NKlCwAuLi4EBQVx7tw58ubNi7OzM4sXL+bZs2d4enqycOFCTp8+zZgxYz72FOQL9ee+aaGhoeYNM+7cucO9e/cIDAzkypUrnDp1iuDgYH7//Xdq165Nt27dWLduHYcOHSJNmjRcuXKFr7/+2twnUORjePP9Nzg4mMSJE+Po6IjBYODQoUM4ODiwYcMGdu3aRUREBJcuXSI8PJxRo0aRN29eNm7cyMSJE7Gzs8PS0pLhw4dTuHDhBJ6V/JnBaOrqLSLyHxYcHEyTJk1o27YtDRs2ZP369SxYsIAHDx7g6elJgQIFOHDgABEREfTt25cpU6Zw+fJlEiVKhK2tLcOHD6dAgQIJPQ0REZEP4s2Ne+D1Uk8rKyuyZMmCq6sry5YtY8yYMdSrV48jR46QOHFi7t+/T0xMDBkzZmTlypVMnToVf39/ANzd3Rk2bBgpU6ZMsDnJl+HPOxtu2LCBpUuXYmFhQfXq1WnatCmXLl1i1qxZ7Nmzh1SpUlG8eHHSpEnD48eP2b17NzNmzCB58uT89ttvXL16lYoVK5I2bdp3ji/yIURGRhIdHY2jo2OceywsLIyhQ4dy+vRpUqdOTcWKFfn22285fPgwP/zwA7du3aJw4cJkz56dbNmycfDgQY4dO8aOHTt4+PAh169fJyoqitKlSwNvv7dLwlOoJiKfjUmTJnHo0CGGDh1Krly5ePLkCQEBAcyYMYNnz57x5MkTnJ2d6datG15eXjx69Ij79++TI0eOhL50ERGR/5NLly7h6Oho7iFlEhgYyODBg3n06BExMTEUKlSIoUOH4ujoyOzZszl16hSFChUiY8aM5MyZkzNnzjBixAhWrlxJ5syZiYiI4OnTp6ROnTqBZiafu5cvX9K3b19sbW0ZO3asubonJCSEAQMGcO7cOerXr09ISAjbtm2jf//+NGzYEIBbt26RIkUKjEYjdnZ2nDlzBh8fHxYuXEiGDBnivE5MTAwGg0GBmnxwly5domvXrrRp04amTZuaj+/atYtBgwaRN29eqlSpwtGjR9mwYQPbt2/H3d2dJ0+eYG1tjZ2dnTmImzRpEpcvX2bSpEnY2dnFeZ2/2rFZEpbeUUTks9GpUyeCg4PZtm0bT58+xdnZmdq1a7N06VL69u1L5syZCQkJYfHixYSFheHi4qJATURE/vNevnxJ8+bNmThxonlnawB/f3/69u1LhQoV2Lx5M3379uXmzZssWbIEOzs7evToweLFi/Hx8aFmzZpkzJiRBw8eULBgQXMg4eDgoEBN4l3GjBnZsGEDt27dMi+X27t3L0+fPmXLli306tWLMWPGYGdnh7+/P2fPngVeLwndvn074eHhXLp0iQkTJpA/f36SJ08eZ3yj0YilpaUCNYkX2bNnx9nZmX379hEUFARAVFQUq1evplWrVsyePZuvv/6aQoUKYTQazcvoDQYDy5YtY8uWLVy/fp2lS5eyZs0aKlWq9FagBihQ+0TpXUVEPhs2Njb069ePnTt3cvLkSfPxFClSUKtWLVatWsWUKVOYP38+rq6uCXilIiIiH46NjQ0DBgxg165dnD592nx8+/btFCpUiF69euHq6sqTJ0+4efMme/bsITAwEIAlS5bQunVrNm/eTL9+/Zg7dy4VK1Z8Zx82kQ/NaDRiY2NDnTp1yJUrF4MHDwZeV+T4+vqSN29ekiRJwu7du2nRogVfffUVly5dIiAgAIDr168zadIkvvnmG1q2bEmKFCkYM2YMDg4OcV5HS+UkvkRHRwPQq1cvzp07x+7du4mOjubx48fcvn2bjBkz8uzZM6ZMmcLKlStp1KgRu3fvZv/+/Tg5OREaGsrw4cPp1KkTP//8M8OGDaNBgwYJPCt5H1r+KSKfFaPRSP369cmePTvdu3cnRYoUxMTEYGFhoQ9UIiLyWXmzb4/RaKRx48bY29szdepUYmNjGTFiBOXLlydv3rwsWrSI33//neLFi7Nt2zbSpUvHDz/8wJkzZ/jxxx8BsLe3p1+/fnz11VcJOCv5EsTGxgLEuX/9/Pzo3bs3M2bMoGLFiuzYsYNUqVLx+PFjfH19yZYtG97e3vTq1YtTp06Zq9Ju3rzJlStXyJIli/neVd80iW/vWorZs2dPbty4weDBg8mXLx9HjhwhW7ZsrFixgps3b1K/fn0yZ85M06ZNsbe3Z+3atcDr3tD3798nX7585rF0D/936E9JRD4rBoOB0aNHs2/fPnbs2AGApaWlAjUREfmsmH5gZGIwGOjTpw+HDx9mx44dODk50alTJ8qUKcO6det48eIFbdu2pXXr1tja2rJ7927WrFlD3rx5WbBgAdOnT2f27NkK1CTemcICCwsL7t+/T1BQEM+ePaNixYpUrFiRUaNGAeDp6UmGDBmYOXMmyZIlo3r16sDre//hw4cMGTKEq1evkj59ejw9Pfnqq6+IjY1VGCEfhSlQ279/PydPniQqKoq+ffsSEhLC1q1befbsGSVKlODkyZMsXbqU6tWrU7hwYV6+fMmzZ884f/48PXv25OXLl6RMmdIcqJkq33QP/3doUa6IfHayZ89OwYIFsba2TuhLERERiReWlpZERESwcOFCHBwcyJgxIx4eHnz99dfMmjWLEiVKkCFDBo4ePcqyZcsYNWoURYsW5dGjR0RFRZE2bVqmTp1K1apVcXBwwNnZOaGnJF8ICwsLoqOjGT58OP7+/qRIkYJnz56xaNEimjdvTqdOnZg3bx7ffvstv/76KxcuXGD+/PnY29tz6dIlnj9/jre3N5kzZyZz5szmcY1Go4II+WiOHDnC999/j62tLY8ePaJw4cL8+OOPNG7cGF9fXwoXLoynpydnz54lR44cFClSBAsLC9atW0eZMmWoVasWyZIlw8bGJs646pv236M/MRH5LE2aNEn9YERE5LPl5+fH0KFDyZEjB0ajEV9fX5IkSUKXLl2oWbMma9asoUuXLty6dQsLCwuSJ0/O48ePmT59OnZ2dgwcOJDMmTPrB1CSIEaPHs2VK1dYuHAh0dHRHD58mNDQUHLnzk3Dhg2ZPn06zZo146uvvsLCwoJ27drh5ubGnj17aNSoEd7e3m/du1qVIB9LcHAwkydPplq1avj4+HD8+HEiIiJ4/vw533zzDX5+fmzdupVSpUqRMmVKli9fzrfffsvTp0958eIFQ4YMoUSJEsDrMFj37n+beqqJiIiIiPyHPHr0iG7dulGuXDnatm2L0Wjk7NmzpE+fHmdnZ2bMmMGCBQtYsWIF7u7ueHp6YmNjw+PHj8mUKRNjx4417+4p8qFFRUVhbW39zmWYRqORBw8e0LJlS5o3b06LFi3eev7Zs2fp1asXRYsWZeTIkRw4cAB/f3+ePHlCmzZtKFCggHkshRHyocXGxhIZGYm9vf1fnrN+/XpGjhzJtm3b3tppFl5vEjN48GD69etH3bp12blzJ0eOHCFFihR4e3vH5+VLAlClmoiIiIjIJyIoKAhnZ2eSJUv2t+ecO3eOjh07Aq8rdPLmzQtAWFgYTZo0Ydu2bcyZM4fx48ezZs0afvvtNywtLc3VESIfWlRUFMOHD8dgMDBixIh3LsU0GAyEhYVx7969OOHYq1eviImJYebMmVSoUIFWrVoxYsQIGjZsSOnSpSlSpIh5mdyfNzkQ+RCMRiM3b96kbt265iX0f2YKimNjY3F1dcVUn2TatODKlStMmDCBOXPmsHbtWhYtWkS2bNmoVKkSFStWNIfA79rkQP679E4kIiIiIvIJePLkCZ06dWL37t3vfNzUwDoiIgJra2sSJUoU5/GLFy/SrVs37t27R+fOndm8eTOHDh0iZcqUlC5dWoGaxCuj0UiZMmXo0aNHnGPwenMBk0yZMpE6dWrWrFljPsfa2ho7OzvmzZtHeHg4lSpVokCBAly+fBnAHKiZNuhQoCYf0rNnzwD46quvmDZt2lvvlUajMc7mMM7OzkRHRxMQEAD80Qft1KlTXL58mefPn9OmTRtSpUpF0qRJgdeBstFoxGg0KlD7zOjdSEREREQkAYWHh/P06VOcnZ1ZuXIlDRs2jPN4dHR0nH+IeXh4YG9vz8aNG4mIiDCfFxUVxfHjx7G0tKRq1ar06dPHXMEmEl/8/Py4dOkSNjY2VKlSBVdXVw4fPgy8DhJiYmLMfW537NhBQEAATZo0YfXq1Vy8eNEcVAQGBpI1a1bSpk1LypQpWbx4MV5eXnFeS/1y5UOLjY1lz549nDx5EoAyZcrw8OFD9u/fT1RUFPD6Pra0tOTevXsMHDiQSpUq8dVXX7Ft2zbOnTtnHuvhw4dky5aNxIkTU7x4cWbPnk2KFCnMjxsMBi1Z/gwpVBMRERERSSDR0dEsWbKEI0eOAJAkSRJ+++03+vbtC2AO0wwGA4cOHaJBgwbs27ePnj17snbtWrZs2UJYWBhGo5GDBw9Srlw50qZNC0C7du1wcHBIsLnJ5yssLMxcfXbgwAG6desGvK6i3LlzJ99++y2rVq0CXgdhJ0+e5Ouvv2bYsGG4urpSq1YtSpYsSadOnRg6dCjLly+nX79+ZMmSBTc3NwBzXza1AJf4cOnSJQDu3LnDjz/+yNGjR3nx4gUvXrzgp59+omPHjgQFBZnPHzduHF9//TU3b94EoEOHDrx48YJ27doxYcIEfHx8WLRoEXXq1AH+qM58s0pTPk/aqEBERERE5CMKDQ3l8OHDeHh44OjoiLe3N/fv32fs2LHcv38fW1tb2rZty9ixY6lbty5hYWF0796dy5cv06xZM9q1a4e9vT2DBg3i4MGD2NvbkyhRIu7du8eoUaOoUKFCQk9RPmNbtmxh4MCBrF69mkyZMhEYGEirVq1ImTIlJUuWpFmzZsyfP58rV66wZs0aDh06xJAhQ6hWrRre3t64uroC8Pz5c2bOnMnVq1cJDQ2lRo0atG7dOmEnJ5+9Fy9eMHz4cM6ePcuiRYtImjQpY8eOZevWrURERODj42Pu5dewYUM6d+7MTz/9xMaNGxk5cmScpaEPHz7k559/5sGDB0RFRdG9e3fc3d0TcHaSEBSqiYiIiIh8ROPGjWPdunWMGTOGChUqEBQURJ06dYiOjqZ37940a9aMMWPGsG/fPjZu3MjBgwc5ePAg3377LenTpzcvp3v58iXXr1/n1KlTxMTE0KxZs4SemnwBwsLCqFWrFlWrVmXQoEFs2LCBvn37YmlpybZt23B3d8ff35/x48fj5eWFt7c3t2/fjhM2vLkz6KtXr7C0tDR//eZyUZH4sGrVKlasWIGHhwfdunWjfv36XLx4kfz58zN58mRSpEjB3LlzmTVrFrNmzSJPnjzY2tr+5X356tUrc49LU+81LfP8cmj5p4iIiIjIR2D6WXaXLl1Injw527dvJzg42Nyw3cnJiZo1a2JnZ0erVq2IjIxkyZIlVKtWjZEjR5I+fXrgj75SNjY2ZM+encaNGytQk3hnWorp6upKt27dWLVqFSdOnCBVqlSMGjUKFxcXlixZAkCRIkWoUKECy5Yt4+bNm7i7u8dZBvfmRgNWVlZYWFiYH1egJvHF1COtevXqZMuWjb179xISEsKYMWPo1asX9+/fZ//+/QB4e3vj4uLCsmXLeP78OZaWln+5FNkUqMXGxmJpaalA7QujUE1EEkSFChXo16/fBxuvX79+//nlLp/DHERE5K+ZQgN7e3uaNWvGoUOHOHz4MD4+PgQGBmJjY8OsWbN49eoVmTJlom3btsybN8/cw0ckIZmqb4xGIw0bNiRjxozMnz+ffPnyUb9+fZo3b87SpUu5efMmrq6ulC9fnuTJkzN16lTgr8MyUwChME3im7W1NQAODg7UqlULg8HA1KlTyZo1K+3atSN58uT4+/ub+60NGjSIHTt2cOzYMWJjY/9nWKZdab9M+lMXkQQxffp0OnXq9MHG69SpE9OnT/9g44mIiHxoVlZWhIeHA9CkSRPc3NzYtGkTt27dwsbGhs6dO7N27VpOnToFQL169UiXLh1TpkxJwKsWeS0mJoY5c+bw008/AfDdd9+xd+9edu3aBbyu/smePTtDhw4FoGDBglSrVo1Dhw6xe/duAG06IAnq+vXreHl5ERQURMmSJSlZsiQnT540358dO3bkwoULHDx4kKioKMqXL0/JkiWZPHky169fT+Crl0+VQjURSRA5c+YkXbp0H2y8dOnSkTNnzg82noiIyP9VbGxsnK/v3r1LxYoVzSFZx44duXz5MgEBAbx69YrGjRuTLVs25syZQ0REBMmTJ6dTp05s2bKFgwcPJsQU5Av1rvArPDycY8eOsW3bNm7fvk2pUqWoXLkyM2bMICQkBHd3d9q1a8fhw4cJCAjA2tqaPHnykDNnTnO1pZbFycfy5/dfgKRJkxIUFMTixYsBqFWrFq6urqxevZro6GjKlStHoUKF2Lp1K8ePH+fZs2eMGTMGCwsLc5WbyJ8pVBOR/7MKFSowffp0Ro8eTbFiBkGr7wAAgLNJREFUxShQoAC9evXi2bNnzJ07l7Jly1KoUCG6du3Ko0ePzM95c/nn5s2bqV27Nnnz5qV48eL07t2b4OBg8+Pnzp2jVatWFCpUiAIFCtC6dWvzT/Lh7aWTFSpUYOrUqYwbN46SJUuSN29e2rVrx40bN+Jc+/r166levTp58uShdu3aHD58mJw5c7Ju3bp/PP8qVarg4+Pz1vE6derQsWNH4PVPd+fOnUvNmjXJmzcv+fPnp3Hjxhw5cuQvx82WLRvTpk2Lc2zatGlky5YtzrETJ07QvHlz8uXLR9GiRenbty9hYWHmx2NjY5k0aRIVKlQgd+7cVKhQgQkTJvDq1at/PEcREXl/f14K5ODgQO3atVmyZAnPnz+nbNmyFC1alG3btpm/p/Xt25cDBw6wcuVK/Pz8SJUqFf369SNz5swJMAP5UpnCr0uXLpmXLbu4uNCkSRNiY2P5+eefAejduzd37txhzZo1GAwGSpYsSeXKlencuTMeHh5ERkYyadIk2rRpk2BzkS+ThYUFUVFRnDhxwhywOTk5MXjwYNauXcuxY8fIli0bFSpU4NatW6xYsQIAHx8fIiMj6dWrF+XLl8fGxgZ/f3/t6il/SaGaiHwQCxYs4N69e0yaNImOHTuyefNm6tevz4EDBxgxYgQ9e/Zk165d5r4abwoMDOS7776jcuXKzJs3j/79+3PkyBF69eoFQEREBN988w0uLi5MmzaNSZMmERkZSbt27Xj69OlfXtOSJUu4du0aY8aMYeTIkZw7d46+ffuaH/f19aVfv34ULFiQmTNnUqVKFTp16hSnke4/Ubt2bQICAoiIiDAfCwoK4tKlS9SpUweA8ePHM3PmTBo1asT8+fMZMWIEjx8/plu3bkRGRr7X673p+PHjtG7dGltbWyZPnsyAAQM4duwYLVu25MWLFwDMmzePX375hc6dO7NgwQKaNGnCTz/9xKxZs/7164qIyP92//59Bg8ebP7aycmJ+vXr4+TkxLBhwwDo2rUroaGh7NixgydPnlC0aFFatmzJzJkzmTVrFk5OTrRu3ZqUKVMm1DTkC/Hnzz+7du3C29ubpUuXmo+VK1eOAgUKcPjwYY4fP066dOlo3bo1CxcuJCgoiKRJkzJixAi6du3Kd999h4eHB05OThiNxndWDol8KO/6/D516lRatmzJrVu3zMfq1KlDnjx5mD59OtHR0dSoUYOMGTPi7+/P/fv3yZQpE+PGjaNfv37s3LmTJEmS/OX4IgBWCX0BIvJ5cHBwYNKkSVhZWVGyZEnWr19PcHAwq1evxtHREYD9+/dz8uTJt54bGBiIra0t3t7e5tLqJEmScPbsWYxGI1evXuXRo0e0bNmSggULApAxY0ZWrlzJs2fPzOP/mZOTEzNnzjQ3vr116xbTpk3j0aNHuLi4MGXKFMqXL8/IkSMBKFOmDIkSJWLChAnvNffatWszbdo0du7cSd26dYHXlXdOTk7m6rkHDx7Qo0cPWrRoYX6ejY0NXbt25fLly+TPn/+9XtNkwoQJZMiQgTlz5pjnmS9fPmrUqMHatWtp1qwZx44dI3fu3NSvXx+AokWLYmdn95f/30RE5P1FR0djZRX3o/WFCxdYtWoVOXPmpHHjxgBkzpyZ1q1bM2bMGNq0aUP27NmpU6cOO3bsoGDBglStWpUBAwZQr149smfPnhBTkS9MbGwsFhYW5t0Nw8PDcXZ2JkeOHOTPn59du3ZRrVo1UqZMiZWVFdWrV+fcuXOsWLGCIkWK0LFjR9avX8/kyZP54YcfcHZ2pn379ubxjUYjBoNBSz8l3ph23QS4d+8eyZMnx8rKinbt2uHr68uKFSvo2bMn1tbWGAwGevXqRcuWLdm8eTN169alevXqTJgwgXnz5jFo0CBy585N7ty5gT/e27WRhvwVVaqJyAeRN2/eOP+YSJYsGRkyZIgT3CRJkuSdlWVFihQhMjKSmjVrMmHCBE6cOEHp0qXp0qULBoOBLFmy4OrqSocOHRg8eDA7duwgWbJk9OnTh1SpUv3lNeXJkyfON0DTuZGRkdy8eZO7d+9StWrVOM+pUaPGe8/d3d2dggULsmXLFvMxPz8/qlatag4JJ0yYQKtWrQgLC+PEiROsXbuWjRs3An9s7/2+IiMjOX36NB4eHhiNRqKjo4mOjsbd3Z1MmTKZ++8UK1aMgwcP0rRpU+bPn8/Vq1dp3ry5uYpORET+70zfA/fs2cOFCxcAKFmyJI0aNWLChAnmKh1ra2vKlStHzpw5GTFiBABdunTh6dOn+Pn5mdskKFCT+Ga6J03LlJcuXUrdunXp2bMnhw8fJk2aNNSoUYMnT56Yl3sCFCpUiGzZsnHo0CG2b9+Ora0tXbt2xcnJiUSJEpnPM/VlU5gm8eXNe/jevXu0a9cOLy8vunXrxr59+3BxccHb25vly5eb35cBChcuTN68eVm5ciUPHjygQoUKVKtWjUqVKsUZ32g0vvXDEpE/U6gmIh+Eg4PDW8cSJ078j55boEAB5s6di7u7OwsXLqRZs2aULVvWvNzA3t6eZcuW4eHhwdatW+nSpQslSpRg8ODBfxtI2dnZxfna9KExNjbW3HMsadKkcc5JlizZP7rmP6tTpw6HDh3i0aNHnD17lps3b8YJrc6ePUuDBg0oUaIE33zzDb/88ov5ev7tTljh4eHExsYyb948cuXKFee/K1eu8ODBAwC++eYbBg8ezIsXLxg/fjw1atSgZs2af9vPTURE/l5sbGyc5WwXL16kYsWK9O/fnzZt2jB9+nQsLCxo0qQJ1tbWjB492nxu+vTpyZw5M4GBgWzZssX8eM+ePXFxcUmI6cgXJiYmJk7Pv3Xr1rFq1SrKly/P48eP6dOnDxcvXqRChQoUKFCA/fv3xwklbG1tiYmJYdasWURERODl5cWoUaPiBBAK0yS+/DkQjomJ4aeffiJFihR07tyZu3fvMnHiRCIjI2nZsiVfffUVc+bM4dmzZwCEhIQQHR3Nr7/+yqpVq7CxsaFXr16UKFEizuvoHpZ/QrGriHwSypQpQ5kyZYiMjOTIkSMsWbKEkSNHki9fPvLmzUvGjBn58ccfiYmJ4cyZM2zYsIFffvmFdOnS8c0337z365mq1kJDQ+Mc//PX/1S1atUYOXIkO3fu5Nq1a7i5uVGoUCHgj55w2bJlw8/Pj4wZM2JhYUFAQAD+/v5/O+6f+zc8f/7c/Ht7e3sMBgOtW7d+Z4WdKVS0sLCgWbNmNGvWjNDQUAICApg9ezZdu3bl4MGD2s1IROQ9mZbLATx58oREiRKxY8cOGjRoQIMGDZg4cSL+/v5kyJCBGjVq0LJlS3Ozdjc3N+B1ZVvOnDmZP38+1atXp2zZsgk5JflCxMTEYGlpiaWlJcHBwcyePZuMGTNy/vx5unbtSuXKlenevTulSpVi0aJFjBkzhrp163LhwgUmTpzIqFGjuHPnDvfv36dHjx5ky5YNBwcH8xJP0/gi8cH03mt6/12+fDnHjh3DxcWFq1evMmnSJJIlS0aqVKkYO3YsM2fOpFevXvTu3Rtvb29mz55NjRo12LFjBxUrVqR3795xNgAz3cci70OVaiKS4MaNG0f9+vUxGo3Y2dlRvnx584YCd+/eZdu2bRQvXpyHDx9iaWlJgQIFGDp0KE5OTty9e/dfvWaqVKlIly4dO3bsiHN8+/bt/2o8Jycnypcvz65du/D396d27drmb8rXrl3j8ePHtGzZksyZM5s/COzbtw9495bf8Lr6780dUIE4PekcHBzImTMn165dI0+ePOb/smTJwrRp0zh69CgAjRs3NveNS5o0KfXq1aNZs2aEh4fH2VxBRET+GQsLC2JiYhgyZAiVK1emW7durF+/njJlypA8eXL69+9PkiRJ8PPzIyQkhLp165I7d24aN27MokWL8PHx4fbt28yaNeu9dpsW+b8yBV4XLlygWrVqXL58mcmTJ+Pr6xtnd8NevXqxadMm9u3bR4ECBWjYsCEXL16kSZMmNG/enKxZs9KkSRNzr1vTZx4FahKfTJ+hw8LCGDduHPPnz+fly5ds3ryZx48fmx8vVKgQFSpUYMOGDVy7do2yZcvSsmVLNm7cSKtWrdi8eTOlS5emRIkSuLq6mj+LK1CTf0OVaiKS4IoXL87ChQvp168ftWvX5tWrV8yfP58kSZJQvHhxoqKiiI2NpXPnznh7e2Nvb8/WrVt5+vQplStX/levaTAY8PHxoXfv3gwZMgRPT08uXbrEjBkzAOIsifinateujY+PDzExMXGWfmbIkAEHBwdmz56NlZUVVlZW+Pv7s2bNGoC/3P2zXLly+Pn5kS9fPtKnT8+6deu4efNmnHN69uyJt7c3vXr1onbt2sTExLBgwQJOnz5Np06dgNc96xYsWECyZMkoUKAAwcHBLFy4kKJFi+Lq6vre8xQR+dJdvXqVXbt2cefOHXr27MnmzZsJDg4mderUwOsftNSuXZuFCxeyadMm2rRpw8SJExkxYgS+vr6kTZuWKVOm6D1YPrpbt27Rrl07ypYty8CBA6lXrx5bt25l+vTprFy5kqFDhwJQr149fv75ZxYuXEiePHnw8vKiaNGinD17liJFiph3o1Vlj3xsCxYs4OTJk7x8+ZKlS5eSJk0aNm/eTP/+/bl48SIlSpTAycmJihUrEhgYyLRp05g0aRIDBgygefPmhIaGUqBAgThj/pvP/SImuntEJMF5eHgwfvx4fvvtN7p06ULPnj2xs7NjyZIlJEmShBQpUjB//nwcHR35/vvvad++PefPn2fatGkUL178X79urVq1GD58OIcPH6ZDhw74+fnx/fffA/+8H9yf5+Ho6EiePHnIkCGD+bijoyMzZ87EaDTSrVs3vvvuO+7evcvPP/+Mvb09J06ceOd4/fv3p3z58owbNw4fHx8SJ05Mr1694pxTunRpfvrpJ+7fv4+Pjw/fffcdlpaWLFy40LyjaLdu3ejQoQNr167lm2++YezYsZQuXZqpU6e+9xxFRL50wcHB1KxZEz8/P3r06EGjRo0YMGAA7u7ucfqmeXl5kTlzZgICAvj1119Jly4dkydPZuHChUyfPl2BmsSL58+fc+/ePeD1roV/ZmtrS/LkyVm2bJm5FUa1atUoVaoUJ0+e5PDhw+Zzhw4dytGjR9m4cSOvXr0iffr01KxZk5QpUxITE6NATeLVX/Ucdnd359SpU9y4cQM3NzcMBgO1atWiQIECzJ49m8ePHwOvezZXrVqVbdu2ERAQAEC6dOnMgdq7/n6I/BsG47/tkC0i8h+3efNmcubMScaMGc3H9u7dS/v27dmwYYN2XhMRkXcaM2YMy5cvZ+XKleTMmZOoqChWr17NiBEjWLNmDblz5wbgwIEDfPfddzRt2pQuXbok8FXL58wUcF28eJERI0awfPnyOMff/HXfvn107NiRiRMnmndBP3PmDD/++CMuLi5xfug2YMAAypQpQ7Vq1d56LZEP6fHjx/Tu3RsPDw+qVq1K8uTJgbg9LE2GDx/OgQMH+P777/Hw8ABe38ONGzdmxIgR1K1bF0tLSy5fvsyePXto0KDBv96MTOR/UagmIl8sb29vgoKC6N69O6lTp+bmzZtMnTqVdOnSsXTpUvNPYf+OwWBQ/xARkS9MZGQkBQsWZMCAATRs2BAbGxt+//13+vfvT1RUFCtXrjSfu3fvXsqVK5dwFyufvQkTJpAjRw6qVavG2bNnadWqFc2bNyd79uzky5ePtGnTxjn/+fPnfP/991y6dAlfX19sbGwAmD9/Phs2bKBJkyY0bdo0IaYiX6DffvuNkJAQSpQowfHjx9m8eTOXL1+mSZMmcdqpwB8B25UrV+jXrx/Zs2dnwIABODg4ADBkyBB27drFsmXLSJ8+fUJMR75AWv4pIl+scePGUaJECX788Udat27NtGnTqFq1KrNnzwagdevW5MqV62//8/T0TOBZiIjIx2ZnZ8ewYcP4+eefuX79OgBp06alVatWnD59mrVr15rPVaAm8e3evXukSpUKg8FA3rx5KVOmDD/99BPjxo3DwcHhrZ3EEydOzDfffENwcDBLly41H69SpQouLi7cu3cvziZKqsGQ+PD8+XMuX77MlClT6NmzJw8fPqRIkSIMGzaMYsWKMXPmTHOvYxNTxVrWrFmpUKEC586di7PpWIcOHUiUKBFPnjyJ8zzdwxKfVKkmIvIXrl27xrNnz/72HGtr6zhbcYuIyJchNjaWkiVL0qhRI7799lscHBwICQlh2bJleHh4mPtaisSXmJiYONXyT5484ebNm/zwww9cvXqV/PnzM3v27Hcun4uOjmbatGmsWrUKX19f88YDwcHB5t+LxJc7d+7QoUMHUqRIgbe3t3nzMC8vLwBevHiBv78/ffv2ZcSIEdSuXRsbGxuMRiNGoxELCwsePXpEjx49SJw4Mf369SNdunTA238vROKbKtVERP5CxowZyZMnz9/+p0BNROTLZGFhwZw5c1iyZAmnTp0CIFmyZHTr1k2BmnwUbwYHW7ZsoWbNmrx48YKFCxcyZMgQ9u7dy+HDh7GwsHirKbuVlRVeXl68ePHCXKEPmAO1NyvVRD40Nzc3cuXKxcOHD3nx4gXt27dn8uTJ5sdtbW2pU6cODRo0YMGCBQQGBgKv265YWFgQGxuLi4sLVatW5cyZM5w/f978XEtLy7eqM0Xik0I1EREREZF/IV++fGTNmpXQ0NCEvhT5wlWqVIknT56wfft2YmNjKVasGGXLlmXYsGHA6xDtz9zc3Jg/f/5bO4sDb1W2iXwopoD322+/JW3atOzfv5+2bdsybdo04PVSTVOo269fP16+fMnOnTt5+vSpeQzTRhmNGzdmzpw5cTbSAFSpJh+V3i1FRERERP6l5cuXv9VMW+RD+7uOPdHR0VhbW9OnTx9WrVrFiRMncHV1pVWrVty9e5dly5a9cwyDwUChQoVwcHBQZZrEO1OYZgp4M2XKhJeXF5UqVQKgYMGCwB/VaDExMTg4ONCiRQv8/PzeGaoB5MqVC1DfNEk46qkmIiIiIiLyiYqOjn5npZnRaIwTLgBUrVqV9OnTM3bsWBInTszYsWPx9fVl+PDhGI1GPD09sbOz+1iXLmIOu0z36rFjx7C1tSVr1qzY2tr+7fMMBgNRUVGUKFGCQYMGUbdu3Xf2CBRJSLobRUREREREPgGmAOLNyjErKytiY2NZtGgRixcvZv/+/UDcah1TFdCQIUMICAggICAAGxsbWrVqRbFixejXrx8hISEK1OSjMxgMGAwGDh8+TJUqVRg0aBDNmjVj/vz5REZG/u3zTKpWrcrRo0cBLU2WT8/bP/IQERERERGRj+rKlSs0aNCA9evXkylTJvPxjRs3MmrUKNKlS0d4eDi5c+cme/bsJE+e3HyOlZUVRqOREiVKUK5cORYtWkSePHnIlCkTEydOJDY2FgcHh4SYlggnT55k9OjR1K5dm1atWnH+/HlSpkz5j0Jea2trrK2tzX3StLunfGoUqomIiIiIiCQwJycnZs2aRaZMmcxL3+7du8fatWvp1q0bTZs25cmTJ8TExODq6mp+nunc2NhYLC0tGTRoEBUrVuTUqVNkyJCBxIkTA6/DCAsLi7eWjIp8KH8VeF24cAErKys6d+4MvN5I4Nq1a5w+fZrs2bOTLVu2dz7XdCx//vysWLHC/FyRT4lCNRERERERkQSWKlUqUqVKRWhoKNevX6dw4cKcP3+ekydPMnbsWEJDQ9mxYwfBwcHcunWLPHny0Lp1a3NIZmlpSXR0NG5ubqxdu9bcwN1EYYTEJ6PRaL7HLl68iKOjI0mTJsXOzg4HBwfu3r1Lt27duHDhAnZ2doSFhREVFYWbmxuLFi3C2dn5rTFN4z169IiiRYt+1PmI/FMK1URERERERD4BL1++ZMKECaxbt45Lly5RokQJnJ2dad26Nb///jtZsmTBxsYGW1tbxo4dS758+ShQoIC5Ws20oYEpUFNTd/lYDAYDp0+fZsiQIcTExBAeHk62bNlo06YNdevW5enTp+zZs4c6deqQOXNm8ubNy8mTJ/nhhx+4cuUKRYoUeWtM032dN2/ev93UQCQhafdPERERERGRT8SJEyfo3r07X3/9Nb169eLSpUsEBgbi7u5OypQpcXNzIzIykgYNGtC+fXuaNm2a0JcswqVLl/juu+8oVaoU7dq148GDB8yYMYNdu3Zx/PhxHB0dgbi72a5YsYLNmzczb948baIh/1mqVBMREREREYlH/6RizFSVkytXLho3bsyMGTNo3rw52bNnJ23atDx69Ah3d3cA/Pz8SJYsGeXKlfsIVy/yh7/qm3b06FFsbGzo27cvAGvXruXo0aPUrVuXV69eER0dzZo1a/Dz86NWrVoEBgayY8cOevTogZ2dnfn+F/mvUS2wiIiIiIhIPHn06BF79uz5n+eZAgU7OzuqVatG5syZGTp0KACBgYE0aNCArl270rRpU8aNG0fjxo1JkyZNfF66iJnRaDRvhgEQFBREcHCw+fEzZ85QtGhR/P39KVeuHH5+fkyYMIGePXuyZMkSXrx4Qe7cuXFxccHPz4/w8HDWrl1LixYtABSoyX+WKtVERERERETiyb59+/D19SVnzpykTp0a+N+Va1999RWtW7fm+++/5+TJk3h4eNCtWzdCQkLImDEjP/30k5bLyUdlMBgwGAxcunSJQYMG8ejRIx4/fkzXrl1p1aoV2bJlY+LEiSRPnpx27drRtGlTrK2t8fPzY+3atXh6epI7d26mTp1KeHg4Tk5OgHallf8+hWoiIiIiIiLxJE2aNDx8+JBhw4Zx//59Fi5ciIuLy98+x9LSktKlS5vDtP3797/VO+3N3lQiH8Phw4cZPHgwFSpU4Ouvv+batWvmoNjT05OVK1dSsmRJWrdubX7OrVu3cHNzI0uWLOZjbwZq2pVW/uv0LiwiIiIiIvKBmXpEZcqUifDwcPbv38/XX3+Ni4vLP+qxljJlSry8vJgyZQp3794lderU5moeo9GoQE3izV+FXUFBQaRLl47+/fsDYGNjQ0REBMePHydz5sx07dqVfv36ERoaSpkyZbh8+TKbN2/mu+++w9ra+q2+aQrU5HOgd2IREREREZEP4M3qMVN4cOXKFcqVK8fZs2cBePr0KY6Ojn/bmN30WNmyZalUqdJbj2upnMSXN/umnT17lpcvX5I5c2aSJEnC3bt3uXv3LiNGjODcuXO8evWKO3fu8OTJE+rUqcOIESOIjY1l+/bt+Pn5YW1tzdKlS8mRIweg+1Y+Twaj0WhM6IsQERERERH5XPj7+/Ps2TPSpUtHnjx5sLGxYfbs2fj5+dGyZUu8vLze+by/Ctq0TE4+ptu3b9O/f39u3rxJVFQUxYoVY8KECdy8eZONGzeyY8cOihQpQvbs2SlatCj79u1j/vz5rFy50rxDbVhYGK6ursDroM7Uk03kc6NQTURERERE5AM4deoUffv2xdLSEicnJx4+fEimTJmYPXs2z58/p0uXLtjY2PD999+TLl06c4gWEBCAh4cH8NfBmkh8+PP9du/ePb777jvc3d3p1q0bjx494uXLl+TLl+8vx1i/fj2rV69m7ty5ODg4xHlMgbB87v5+Ib+IiIiIiIj8Ty9fvmTRokWUKVOGLVu2sGLFCvr27cu+ffv4+eefcXBwoF69ety9exc/Pz/g9XK4ffv20b59e2bPng28DjlE4ltMTMw7A9w7d+5w+/ZtBgwYQMqUKYmJieHRo0esX7+eEydOADB//nyGDRvGzp07GT9+PKNHj6Zy5crY29u/df8qUJPPnXqqiYiIiIiI/EN/VXnz22+/sXfvXnbv3g3AmDFjWLduHQ0bNqRixYoYjUZq167Nrl272LRpE76+vtSrV4/27duzfft2Ro8ezcuXL7GxsfnYU5IvzJ/7pl2/fp1ixYqRMmVKrK2tiY2NpWfPnty/f5+YmBiioqIICQnB1dWVOXPmkCFDBvbs2UNgYCCJEydm9uzZFCpUKIFnJZIwFKqJiIiIiIj8A0aj0RxG7Nmzh2fPnpEjRw4yZMjA06dPyZEjB0uXLmXNmjWkSZOG6dOnU6xYMUaPHk22bNmoX78+Xbt2ZceOHQQFBVG3bl0Anj9/TqVKlbTsUz64kJAQbty4QeHChc3HLCwsCA4OZsCAAZw6dQobGxuSJ09O7969KVOmDIMGDWLFihUUL16c/PnzkzFjRl69ekXXrl359ddf8fLyomLFity5cwc3NzfgdVBnGlvkS6JQTURERERE5B8wGAycO3eO/v37ExERgcFgIF26dEyZMoW0adNy6dIlrl69Svfu3WnWrBkAd+/eZefOndja2gKQOXNmMmTIEKfaLUuWLGTPnj1B5iSfr5iYGKZMmYKvry+HDx829zsLCgqid+/eZMqUiXXr1mEwGOjRowcrVqwga9aseHp64unpGacq88yZMzg5OZE/f37z+KZATX3T5EumGFlEREREROQd/twf6uHDh0yaNImyZcuybds2NmzYwMCBA3F2dsbd3R0vLy+sra1JkyaN+TlXrlzB2tqamjVrmo+ZAghTdY8CCYkPlpaWtGzZEmdnZ+bPn28+fuzYMYxGI6NGjSJ9+vQEBwdz69YtLl68aO73t2vXLry9vZk5cyYTJ06kbdu2FC5c2LzBxp9fR+RLpUo1ERERERGRN5gqb/68HDM0NJTz588zYMAAbGxsOHr0KMHBwWzatIk8efLQt29fLl++TN++fcmTJw/W1tYcPHiQDh06kDVr1rdeR0vlJD4YjUaMRiMWFhZkzJiRli1bMmPGDOrVq0e6dOm4f/8+Hh4eREZGsnTpUg4fPkz37t3Zv38/27dvp3LlyuTOnRs3NzeOHTtGTEwMkydPpnTp0gk9NZFPjsGo7WVERERERESA19VjprBrz549XL58mZIlS5I9e3bu3buHj48P0dHRPHnyBAcHBxIlSkR4eDjR0dGMGjWKkiVLsnnzZm7evMnTp09p1aoV6dOnT+BZyZciOjoaK6u4tTMhISG0bt2a9OnTM2PGDB4/fmzeeXb79u1UrFiRunXrsmzZMkaMGEGTJk0YMmQIAOHh4Tg5OQFxwzoReU2hmoiIiIiIfJFevHjB48ePSZUqFUaj0VyZ9ttvv9G3b1/u3LmDs7Mzz58/p1u3bnh5eXHp0iXWrFmDu7s72bJlI126dOZldo0aNaJt27ZvvU5MTAwWFhbaiEA+mgULFhAeHk6KFCmoX78+e/bsoXv37ixYsICSJUsSHBxMs2bN8PLy4ttvv8XCwoKBAwdy+vRpIiMjGTZsGKVKlTKPp75pIu+m5Z8iIiIiIvJFCgoKYuXKlQwfPtwceF2/fp1+/fpRsGBBFixYQJIkSWjbti2+vr7kypWLnDlz8v333xMREYGjoyMAv/76KzY2NhQpUuSt14iNjVUYIR/NhQsX6NGjB9bW1uTKlYvly5fj4OBAyZIlKVeuHOPHj2fdunUYjUZCQkJwdXXl8ePH+Pn5cfXqVXx8fChatCjOzs5xxtU9LPJuCtVEREREROSLFBgYyJEjR1i/fj2Ojo5UqlSJEydO8OLFC7p06UKSJEnYsWMH586dw8bGhk2bNpEzZ04OHTrEjBkzcHNzI1GiRPj5+dGsWTNy5Mjx1mtoqZx8TKtXryZHjhxMnDgRCwsLfv/9dwwGA8mSJcPb25vWrVuzfPlymjZtSs2aNfnhhx+YMmUKiRIlYujQoXh4eACvw2CDwaDqSpH/Qcs/RURERETki2Ja6vns2TPatWvHhQsXsLGx4fjx4/z888+EhobSokULVq1axalTp2jQoAH79u3j6NGj/PDDD2TLlo1ffvmF8+fPYzQa+fbbb8mePXtCT0s+Y2/2+vsrwcHBtG7dmho1atClS5c4j0VHR3P79m3WrVuHr68vmzdvxtnZmVOnTvHkyRNzmAbEWQotIn9PlWoiIiIiIvJFMDVxNwUG+/bt4/79+zg7O1OvXj0AGjduTExMDP7+/gQGBlKnTh0qVaqE0Whk1apVTJ8+ndGjR9OmTRuioqKwtrYGXoceoMo0+fB++uknTpw4QfLkyalduzZ58uTBxsbmraDNxcWFR48eYWdnZz5mNBp59eoV7dq1o1atWnh5ebFgwQImT57MkCFDyJ8/v/ncP//9EJH/Te/4IiIiIiLyWYuJiQHAysqK6OhoczP2KlWqsGbNGjw9Pdm3bx9nz57FysqKJ0+eMG3aNIoWLUrNmjUBOHLkCPnz5yciIoLz588DxAnULCwsFKjJBxUZGUnXrl1ZuXIlefLk4cKFCwwbNowff/wRiBvgxsTEYG1tTbVq1VixYgWPHj0CwGAwYG1tzY0bN3j69Cnp0qVj0qRJNG3a9K3X+/OuoSLyv+ldX0REREREPiu//fabuXLMaDSam6wvWrQIDw8PunbtipeXF4GBgSRLlgwPDw+sra1ZtmwZAE5OTjx9+pTg4GAuXrzIpEmTCAwMpH379ixevJhy5crFeT2FaRIfgoKCuHbtGpMmTaJTp06sXLmSBg0asGLFCrZt2xbnXNM93rJlS54+fcqECRO4cuUKADt27CB58uSULVsWgMqVK5MlSxbUCUrk/0491URERERE5LPx448/snPnTkaNGkXhwoUxGo08e/aMwYMHc+bMGXx8fLC3t2fp0qWEhISwefNmACZOnMiePXvo1q0blSpVYvHixcyfPx+j0YirqysjRowgX758wD/rbyXyb8XExGBpacn+/fvx8fFh//79ODg4APD48WPGjx9PQEAAW7duNR9/0969exk1ahSRkZGkT5+ec+fO0blzZ7y9vT/2VEQ+e/pOICIiIiIi/3mmWoFatWrx8uVLAgICiIiIwGAwcO7cOS5evMjChQupXbs2BQoUIDo6mqtXr5qr06pXr07y5MlZvHgxAQEBlC5dmjVr1jBnzhw2btxIvnz5MBqNGI1GBWrywQUGBjJnzhzgj6qz58+f4+bmRmBgoPm8JEmS0KZNG2JjY1mwYAHwx/Jmk3LlyjF//nyGDh1KlSpV2LVrlwI1kXii7wYiIiIiIvKfFxsbS2xsLNmzZ6d69ers3buXI0eOABAaGkrSpElxcnIiICCA/v37kyZNGho2bMj48eOJiooyP+/Fixe0b9+ew4cPkzJlSnLlygW8Di4MBoOauEu8WL58ORs2bODUqVPmYwULFuT58+ecOnWKyMhI8/H06dPTpEkTli5dyosXL7C0tHxrKWf69OmpVKkSLVu2JFmyZMTExGi5p0g8UKgmIiIiIiL/eZaWllhYWLB//34yZ85MWFgYu3bt4tGjR5QoUYLhw4cTHBxsrjobPHgwFStWJDIykmnTpgHQoEEDpk6dyqFDh2jevPlb44vEh9jYWG7cuEFYWBi+vr5ERUUBkDx5cqpWrcratWu5fPmy+XwrKytKlixJsmTJ2LFjB8Dfhr2mvoIKhEU+PIVqIiIiIiLyn/fgwQNatmxJ3759OX36NFZWVmzdupWAgABcXV3JmDEjY8eOJSIigqZNm+Lg4MDNmzdxcHBg3rx5bN++HYDUqVPj6uqqyh6JN7t27YrztZ+fH/fu3SNfvnycOnWKnTt3mh/r3bs3r169YvXq1dy/f998PG3atDx9+vSdPdX+TGGaSPxRqCYiIiIiIv95hw8f5tGjR2zevJlhw4axZ88ecubMydatW7l8+TIRERE8fvyYAgUKkCRJEs6fP8+OHTsYMWIEq1atonLlynHGU2WPfGjXrl1j9erVdO7cmaNHjwIQFRXFyZMn8fLyYtKkSdjZ2eHv78/Dhw+B1zvL9u3bl0OHDrFmzRrzWKGhodjb25M0adIEmYuIvKZQTURERERE/vN27NhB6tSpcXJyIjo6GgsLC3r27MmNGzcICAjAwcGBNGnSsHTpUr7++muaN29Ojhw5qFy5Mnnz5gVQZZrEm4EDB9KtWzcSJUpE6dKlmTlzpvmxIkWKULt2bRInTkz16tUJCgpiy5Yt5sfr1q1L7dq18fPzo0GDBkyaNIkuXbqQLVs2MmfOnBDTEZH/T6GaiIiIiIh80v4u7IqNjQUgadKkBAcHY2VlhcFgwGg0UrhwYTJlyoSvry9Xr15l7NixjB49mooVK7J+/XoGDBgQp8m7KtPkQzPdWwULFuTRo0fcu3cPb29vTp06xYkTJ7C2tqZ69epkypQJgEaNGuHm5sbevXu5cuWKeZzOnTszZswYcuXKxaVLl2jRogVTp04lceLECTIvEXnNYNSPY0RERERE5BMVHR2NlZXVW8eNRmOcEOzw4cO0a9eOKVOm4OnpaX68V69e+Pv7U7duXfr06YOzs7P5OaYdPS0sVGsg8a9fv348f/6c/v37ExoaSrZs2UiUKJH58ZiYGCwtLdm9ezeTJk2ifPny9OzZE3gdHpvu0zfvfdNzRCRhvP3dSUREREREJIGZQgQrKyuePXvGvHnzsLOzo2jRohQoUOCtqrJs2bJRq1Ytvv/+e+zs7MiRIwdhYWFERUXx9ddfU65cuTiBWmxsrMII+ShMwde3337L4cOHcXJyInXq1EDcgMx0P1aoUIHdu3dz7NgxAgIC8PDwiHO/GwwG898P3cMiCUuVaiIiIiIi8sk6dOgQ3bp1I126dISEhGBtbc2gQYMoW7bsW1U6ERERdO/enQsXLpA8eXKCgoJo2rQpffr0iVMRJPKpMoVlFy5coGPHjtStW5du3bqpmlLkE6VQTUREREREPjlXr17F39+fq1evUqRIEZo2bcqvv/7K3LlzCQkJYfXq1cAflT6mX589e8b9+/c5f/48OXPmNDdyf3P5nEh8+Kulyn/256XLf+XUqVPkz5//A1yZiMQXfVcREREREZEEFR0d/daxkydP4uvry9GjR6lYsSIABQoUoFq1aoSGhrJo0SLgj40KTCGFnZ0dmTJlonbt2mTOnJnY2FgFavJRmAK1mzdvEhERAfxxf77pfwVqproXU6D2rjFE5NOg7ywiIiIiIvJRmUIDU1hgZWVFbGwsly9fJiwsDIA6depQtmxZnj17RkhIiPm5pUqVolSpUvz88888evQIS0tLYmJizI+/GZ4ZjUYsLCwUqEm8eTPw2rdvH1WrVqVNmza0a9eOixcv/qt778+hm+5fkU+X/naKiIiIiMhHsX79ep4/f24ODUxhwS+//ELZsmXp2bMn1apVY+LEiTx79oxGjRqRKVMmc1UaQNKkSalatSqJEydmzJgxAH/ZrP2fLLET+b+wsLAgNDSUCxcuMGvWLOrXr0/Hjh159eoVffr04dWrVwl9iSISj7T7p4iIiIiIxLtDhw6xcuVKsmXLRo4cOcyB19KlS1m2bBkDBgwgTZo0HD16lKVLlxIcHMy4ceOoXLkyGzduxN/fnypVqgBQsGBBSpYsyY0bN4iMjMTOzi4hpyZfkD8vJb579y69evXi9u3bVK5cmW+//RaAPHny0KRJE5YuXUrbtm0T6nJFJJ4pVBMRERERkQ/OaDQSGxvLrVu3yJAhA/nz52fFihUA5l07w8PD8fPzw9PTk+rVqwOv+0jFxsayefNmdu/eTf369Tl+/Djr1q2jbNmy2NnZYWdnR8eOHXF2dk7IKcoXxLTM889LMZ2dnfH09GTy5MnkyJHDfDxTpky0aNGCWbNmUbNmTVKkSPFRr1dEPg4t/xQRERERkQ/OYDAQGRnJoEGDuHbtGokTJyYmJoZ169bRo0cP83nnzp2jYMGCAERFRQGv+6lZWlpy6NAhkidPToUKFTh37pw5lAPMgdqb/dRE4oupN9+JEycYMmQIU6dOJSAgACsrK/OmGBs2bABeB8qJEiWiYcOGuLi4MH369AS+ehGJLwrVREREREQkXjx58oSIiAiGDx9OQEAA58+f5+7duxw5coSAgADs7e3Jli0bmzZtAsDa2pqYmBjSpEmDo6Mjd+/eBaBq1aq0b9+eOnXqvPUaf9VPTeRDioqKYuTIkXz77bdERESwe/duBgwYwIABA0iWLBnffPMNJ06cYM+ePRgMBoxGI25ubrRr145Vq1Zx4cKFhJ6CiMQDhWoiIiIiIhIv3NzcqFKlCkeOHKF9+/YkT56cKlWqULBgQWbPno2lpSVly5bl3Llz7N27F3gdkj148IDIyEg8PDyA15sTtGzZEldXV/POoSLx4c3dPN906tQpTp48yc8//8yECRPw9fWlQ4cO7Ny5k7Vr11K9enUqVKjAiBEjgNeVmgaDgSpVqjB8+PA4S0NF5POhUE1ERERERD6I6OjoOF+HhIRw5swZ0qRJQ8qUKUmdOjVZsmShatWq3Llzh3Xr1tGiRQu++uor+vbty4wZM9i6dSt9+/YlNjaWkiVLxhnPaDRqR0/54AIDAxk8eLB5E4J3BbcbN27EwsKCr776yhy8VatWjRo1ajB37lxiY2Np164d4eHh5uWeRqORJEmS0LBhQ923Ip8phWoiIiIiIvJ/YgoZrKxe74O2b98+zpw5Q7JkyZg8eTKTJk0iPDycmTNnAlC8eHHKlCnDrFmzsLa2ZuLEiXh4eHDgwAGmTZtG6tSpWblyJe7u7nFeR8GExIfDhw+zf/9+1q1bBxAnVDP93vSrvb29+ffJkiWjYMGCREdHc/36dXLkyEG1atXYvXs3sbGxce5XVViKfJ60+6eIiIiIiPyfmHZE3LZtG2PGjCEqKorIyEgaNWpE//79yZIlC40bN2bWrFk0b96cVKlS4enpyZkzZ5g8eTIDBw5k9OjRWFhYEB4eTpIkSYA/dgkViQ+m+8vLy4vLly/j6+tLuXLlSJYsmblqzRSMVaxYkbVr13Ls2DGKFi1qrpp8+fIljx8/xsHBgcSJE9OzZ09cXFzeei0FwiKfJ1WqiYiIiIjI/9nSpUsZM2YM3t7erFy5kgEDBrB8+XL2799P4sSJqVu3LilSpGD48OEAFCtWDA8PD5YtW8bVq1exsrLCwsKCJEmSEBsbS2xsrAI1iTdGo9F8f6VMmZJixYoRHR1t3mHWFBSb5MyZk7Jly9K/f3+uXLnC8+fPCQ0N5cCBAzRs2JDkyZMDmAO1Py+FFpHPkyrVRERERETkH4uOjjYv8zR5/PgxGzZswNvbm2bNmhEVFcWNGzd49eoVixYtIn/+/GTOnJm2bdsyYsQIChQoQJIkSShSpAh58+Ylc+bMccb7c6Ah8qGZKsf8/f2ZP38+yZIl48qVKzx+/JjKlSuTNWtWc7UaQKpUqRg0aBCdOnWiefPmZMmShWvXrpExY0ZatGjx1j37578jIvJ5Mhi1uFtERERERN7TgQMHcHJywt3dHVtbW9q0aUO/fv1wdnZm7ty5PH/+nBo1atCjRw8GDx5Mo0aNCAkJYcaMGaxevZq6desydOhQhQ+SYPbt28fQoUNp3LgxBQsWJCAggA0bNlC6dGlGjx79zucEBwdz6dIlgoKCyJQpk3mHWm2iIfJlUqgmIiIiIiJv2b9/P0FBQbRo0SLOMswTJ07w/fffA/Ds2TPy5ctHnz59sLS0JEmSJPzwww9YWVnh5eVFzpw5qVmzJra2tvTt25ciRYoA8ODBA1KkSJEg85Ivz59785kCsDFjxnD69Gnzkk+AWbNmsWPHDjp16kSlSpXiVKv90/FF5MuhumoRERERETG7efMmGzduJCgoiFevXsUJC+7du8fkyZOpXLkya9asYfbs2Xh6emJnZ4e7uzvr169n9+7dtGvXjpw5c3L58mVevnzJpUuX8PX15enTpwCkSJHC3DdNJL7ExsbG6Z0WEhICYN5g4M6dO7i7uxMTE2N+TpUqVXB2dmbNmjW8evUKCwuLv9y503RcgZrIl0u11iIiIiIiXzhT5c6+ffvo2LEjNWrUYPTo0ealmVFRUVhbW3Pu3DkuXrzIsGHDcHR0JHfu3OTOnds8zosXL3B2dsbGxoa7d+8yY8YMqlWrRs2aNcmaNWuc11TfNIlvpnvs4MGDTJkyBQsLC549e0arVq1o0KAB2bNnZ82aNdy5c4d06dIBkDFjRpydnQkICGDlypU0b978L8fXck8R0XcyEREREZEvnCkc2LdvH5kzZzYv4Xzw4AGlSpXi4MGDANy5c4eUKVNia2sLYK40u3DhAqNGjTIvg2vUqBG1atUiJiaG1q1bmwO1NyuCRD6G1atX06dPHzw8POjZsyc1atTghx9+YNSoUTRt2pTw8HB++eUXwsPDgdcBckxMDOnSpePIkSNERkYqPBORv6RQTURERETkCxUUFISPjw8nTpwAoESJEly+fJlly5bh7e3Ny5cvcXd3Z8GCBRiNRooXL861a9c4c+YM0dHR5kqgCxcu4OfnR7169Zg/fz5dunRh4cKFzJgxA1dXVy2Tk3j358DWtLx47969tGjRgs6dO1O0aFEAnj59ipubG66urvTr149169bRoUMHVq5cSe/evQkNDWXgwIFMnz4dOzu7hJiOiPxHKFQTEREREflCPX/+nEKFClG4cGEA8uXLR6JEiRg1ahRZsmTB3d2dAQMGcOLECVavXk327Nnx9PRkxowZXL161TxOeHg4efPmxcHBgZQpU1KvXj3y5s2L0WgkNjZWlT4Sb0zhmSmwDQsLA14v/Xz69CnHjx/H09OTHTt2UKpUKbZv386iRYsoWLAge/fupWHDhowaNYrUqVPj7+9PVFQUkyZNMm+qoepKEfk72v1TRERERES4ePEi586dY+XKlZw7d45p06ZRqVIlDAYD33//PYcPH2bVqlVYWVnRoEEDLC0tKVGiBE+fPmXPnj0MGTKEOnXqmMcz9WkT+RgCAwOZOHEiL168IEmSJPTt2xc3NzfatGnDb7/9hrOzMx07dqRevXokSpSInj178urVK6ZNm2YeIyIiAgcHB4B/tOuniIjeJUREREREviB/3nHz5cuX+Pj4MHbsWIoVK8aaNWuoUaMGEydO5P79+wD4+Pjw9OlTFixYQJIkSZg7dy4NGzYkIiICgPXr18cJ1EBN3OXjWbRoER07dqRw4cLUq1ePAgUK4OjoiLW1tfn3Q4cOpVGjRiRKlIhnz55x584d0qdPH2ccBWoi8r60+6eIiIiIyBfCtJEAwKtXr0iUKBE2NjYULFiQdevWsXv3blq3bk337t2pVasW69ato3379qRMmZIOHTowe/ZsqlWrRp48eciYMaN5V1DT2BYWFgrTJN68ef+aPHv2jJMnT9KnTx+8vLwA+P3337GwsODly5c0bNiQCxcuMHr0aMLDw3F3d2f9+vU8fPiQqlWrvvN1FKiJyD+l5Z8iIiIiIl+Q8PBwxo8fT0REBLa2towePZro6Gi6dOnCixcv6Nu3Lzly5GDKlCksW7aMpUuXki1bNqKioihdujQVK1Zk+PDhJEqUyDymKnskPhmNRoxGo/ke+/3333FxccHe3p7o6Gjy589PgwYNyJo1K/v27ePZs2ecO3eOxIkTM2PGDOzt7Rk5ciT3798nOjqaNGnSMGLECL766quEnZiI/OcpVBMRERER+UJs3bqVYcOGkSNHDvLkycPp06fp378/2bNnJyAggB9//BEPDw/69OlDVFQUNWvWpFChQgwaNIjEiRNz5coV0qdPj42NTUJPRb5AFy9eZOTIkdy7d8/cL61ChQosXryYVatW8eDBA8qWLctXX31F3rx5mTJlCmnSpGH69Om8fPmSV69eERISYg7TFAaLyP+VQjURERERkc+MqW/anwODHj16kClTJrp06QLA06dPzQGZtbU1Q4YM4ezZs/Ts2ZPSpUuzdu1avv/+e9atW0fOnDnN47xrGZ5IfDEajSxYsIBZs2ZRq1YtcuTIgb+/P5cvX+bAgQPA6wrMxIkTY2X1R4ejLl26kD59evr06fPWxhm6h0XkQ1BPNRERERGRz8ibYcGbuxneu3ePW7dukTRpUi5dusS6deu4f/8+ly9fJn369HTv3h1vb2+6devGhg0byJcvH/Xr1ydTpkxxAjVAYYTEiz8v8zR58OABW7duZezYsVSqVAmAa9eucfDgQWbMmEHnzp0JDw9n0aJFFCpUiNSpU7NixQrOnTtH69atgbc3ztA9LCIfgmpdRUREREQ+I5aWlkRFRTF48GC++eYbmjVrxsGDB0mdOjX58+cnICCAunXrcvbsWRInTkytWrW4ceMGK1euxM3NjSJFinDt2jWCg4MByJ8/f8JOSD5rJ06cYNWqVbx8+RKDwWAO1KKjo83n/P777zx69IiMGTNy+/ZtBg0axOnTp6lbty4zZswgJCSEtGnTcu7cOQYOHEi7du04deoUs2fPpnDhwgk1NRH5Amj5p4iIiIjIZ+Ts2bN0796dlClT0qRJEwICAmjQoAHFixcnMjKSkJAQrK2tsbW1xc7ODmtra9q2bYubmxsjRowgIiICg8GAvb19Qk9FvgBdunThypUrjB49msKFCxMUFMTs2bOxs7OjYMGCVKhQgUSJEnH69GkyZszInDlziI2NpXnz5sTExPD1119Tr149RowYwfPnzwkLC+PJkyfkypULeL0U2mAwaFdaEYkXqlQTEREREfkPMhqN5t5pbwoICKBgwYIsX76cWrVqMWDAALJkyUJISAiWlpa4urpy+fJlrl69ipWVFb/88gv37t2jXLlyACROnBh7e3tiYmI+8ozkS2K6vwYMGEBsbCzbtm3D19eXNm3a8PLlS8LCwhg/fjw9e/bEysqK4sWLs2rVKg4fPoyXlxeZMmUiNDQUg8HA6tWr+emnn7C1tSVt2rTmQC0mJgYLCwsFaiISb9RTTURERETkPyY6OhorKysMBgPh4eEYjUacnZ0BCA0N5fTp0xw/fpxNmzZx7949rl+/jtFopH79+nzzzTcsWLCAoKAgXF1defDgAX379qVixYrAH5sbqOeUxCdLS0tiY2NJkyYNdevWxc/Pj6tXr9K8eXO8vb0B8Pf3Z9y4cfz4448MGDCAc+fOUbRoUXLmzElUVBSbN2+mc+fOZMmShcKFC7/Vi033sIjENy3/FBERERH5jxo9ejQBAQE4OTnh5eWFl5cXBw8eZNq0aZw9e5a8efOSJ08e3N3duXbtGvv27WP9+vWEh4dz+/ZtwsLCqFmzpnm8P++QKBKfTPdbTEwMDRs25Pz580yfPt28GUFERARLly5l2bJlbNu2jR9++IEdO3aQM2dOgoKCSJ06NaNGjSJjxoxxxhMR+VhUqSYiIiIi8okKCQmhfv36+Pj4UL9+fXNoEBgYSP/+/XFwcODbb79l+/btLFmyBFdXVypVqkThwoV5+fIljo6OGI1GLC0tmT17NmnTpsXOzg5nZ2fc3d3Nr/Nm5ZvIx2IK1CwtLenQoQP9+/fn4cOH5vvcwcGB/Pnzs27dOu7du0f37t0pXLgwx44do1atWtStW/et8UREPib1VBMRERER+UTZ29tTqFAh5s6dy/Pnz82hga+vLwULFmTdunU0aNCA5s2bc+fOHTZu3EhwcDA2NjacPHmSFStW8OTJEzZt2sS6desoWrQo1tbWb72OlZV+1i4Jw7RE09PTk7x583Lo0CGuX79ufjxRokTcvn2b2NhYXF1dqV27NiNHjjQHaur9JyIJSaGaiIiIiMgnys7Ojg4dOvDo0SMWLFgAwO3btzlz5gzFixfn5cuXLFq0iMmTJ1OoUCGuX7/Ozp07MRgMXLt2jQkTJtC2bVtGjx5NixYt6NKlSwLPSL4U79NlyBSM+fj48Ouvv/Lzzz9z8eJFwsLC2LhxIx4eHri5ucV5jmmTDvVNE5GEpJ5qIiIiIiKfENNyOBOj0cjMmTOZN28emzdvJm3atGzatIkiRYqwa9cufv31V6pWrUqlSpWoWrUqSZMmZdSoUXz11VdcvXqVBw8eULRoUXM1Wmxs7FsN3UU+FNOutO8bdpmWfI4ePZolS5aQJUsWEiVKxNOnT/nhhx8oUKBAPF2xiMi/p1BNREREROQT8Waj9VOnTuHo6Ejy5MmJioqiVatWZMmShcmTJwNw/vx5fHx88Pb2pkaNGlhZWVGvXj1CQkJwc3Nj/fr1ccY29U0TiS9vBrbh4eEcPHiQDBkykCpVKpIkSfKPnhsWFkb58uVp164dJUuWpHDhwh/hykVE/h19VxURERER+UQYDAaCgoLo168fwcHBJEqUCHd3d8aMGUOnTp3o1asXx44do2jRouzYsQNHR0caNWoEwJo1a0ibNi3e3t6kT58eiBvSKVCT+GYK1KZPn86CBQtwc3PjwYMHDBw4kFq1av3P58bExODq6srs2bMpUqSI+Z5VICwinypVqomIiIiIfCLCwsLo1asXbm5udOnShbCwMI4cOUKVKlVwdnamW7duPHnyhDVr1nDw4EHatWuHh4cHT5484fr16wwZMoTq1asn9DTkC7Zy5UpWrVqFj48PZcuW5cSJE+TKlYvEiRMDcYPe/0VLlUXkU6e4X0RERETkE3HlyhUuXLhA165dSZUqFalSpSJHjhzmEKJjx460bduWNWvW0KBBA8aPH8+pU6dIly4d8+fPx8HBAXi/4ELk3/hz7z+TnTt3UqBAATw8PAgODubx48f4+fnx6tUrqlatiqurq/nc8PBwnJyc/vI1FKiJyKdOoZqIiIiIyCfixo0b2NraxtnpMDY2lps3b7Jy5Urq169Pw4YNGTlyJJ6entSsWZNq1aqZww1T0KFATeKLKbC1tLTk5cuXnD59mtSpU+Pk5ISzszPp06dn06ZNXL9+nUuXLpEyZUru3r2LwWAgICCAOXPmEBsbS48ePTAajfTo0YMMGTIk9LRERP4VRf8iIiIiIh9BTEzMXz5m6shStmxZgoODOX78uPkxS0tL7t+/z+LFi3F2dqZJkyZkzpyZhw8fmh8H/tWOiyLvyxTYLliwAA8PD8aPH0+TJk3o2bMnYWFh+Pj40LhxY1KmTEnfvn3p3bs3O3bsoEmTJty4cYMHDx5gYWFB9erVyZcvH/fu3UvgGYmI/HuqVBMRERERiUem6jFLS0tiYmK4e/cu7u7ucc4xBRUpU6akbt26TJo0ifz585M2bVoAbt68SfHixbG3tydlypSsWbPmrdfRUjmJL6Z72FSltmnTJtauXcugQYOoWrUq58+fp02bNvj4+LBkyRJ69Ojx1vLQ69evU65cOVKkSAFAlSpV6N27t6rUROQ/TaGaiIiIiEg8MgULixcvZunSpVhYWFCsWDG+/fZb0qVLF6cZu6WlJf369ePrr7+mc+fOFC5cGGtra1avXk2XLl3MPdPgr3taiXxolpaW3Lt3DwcHBxwdHdmwYQMeHh7UqFGD33//nRkzZmBra0v9+vV59eoVz549Y/bs2Zw9e5YqVaqwceNGnj59yo8//gj8ce9+99135pBNROS/SD/OEhERERGJR8HBwbRr144lS5bwzTffULt2bU6dOsWCBQuAuBVmsbGxJEmShPnz51O5cmXu3btHUFAQc+bMoXXr1nHGVaAm8cW0HNnkxYsXtGvXjpkzZxIbG8uzZ8/ImDEjY8eOpVatWjg4OLBq1SoyZszIzJkzcXV1pXz58iRNmpQDBw5QtmxZduzYQf78+YE/7l0FaiLyX6dKNRERERGReHT06FEeP37Mxo0bsbe3JywsjE2bNrFv3z4OHDhA6dKlzdVqpoAtU6ZMdO7cmcjISOzs7IDXgRtomafEr3ftHBsbG0vWrFmxtbXFwsICS0tLBg4cSMGCBfnpp58oWLAgAIsWLeL48eO0atWKEiVKUKJECaKiorC2tgYgOjoaKyv9E1REPh/6jiwiIiIiEk9evXrFyZMnyZo1K1ZWVvj7+9O9e3cyZMiAu7s7y5YtIyYmBgsLi7eqgwBzoGY6R4GaxDeDwcCFCxdYv369+VjixImxsbHh9OnTALRv3x6Ar7/+2hyoxcTEcO3aNYoVK4arq6v5udbW1sTGxmI0GhWoichnR9+VRURERET+JVP12LsYjUYSJUpErVq1+Oabbzh58iTbt2+nXLlyzJ49m1y5cnHs2DE2bdpkPv+vaKmnfEyzZ89m1KhRjBs3jhcvXgDg4eHBzZs3efToEWXKlKF69epMnTqVb775hmXLltGkSRN+//13atWq9dZ4FhYWb1W/iYh8DhSqiYiIiIi8J6PRaK4eM3395mPwx46ehQoVIk2aNEyaNAl7e3tq164NwPPnzzEajfTr14/r16+rCk0+qncFwjExMQCMHDmS4cOHs3TpUkaOHMndu3dJliwZSZMmJSwsDICxY8fSoUMHEiVKxM6dO8mfPz9bt24ld+7cH3UeIiIJSfW3IiIiIiL/g6nPlOlXg8GApaUlYWFhTJs2DaPRSJIkSejevfs7K3IuXbrE7du3GTBgAMmSJePMmTNcu3aN/v37kyZNGjJkyJAAs5Iv0Z/794WFheHq6orRaDRXRDo5OVG9enVevXrFihUr6N69O0OGDOHChQtERUUBr5d1NmvWjGbNmvHixQtsbW0B7UorIl8W/ThMREREROR/WLNmDU+fPsVgMPDq1SsAVq9eTeXKlbl16xYvXrzg1KlT3Lt3753Pz5cvHwaDgT59+tCiRQtatmxJwYIFqV+/PqVKlfqYU5Ev2JvVlY8fP2b8+PHMnDmTiIgIc2gMf1Rb1qlTh/HjxxMZGcnMmTNJlCgRx48fjzOm0WjE1tbW3DdNgZqIfElUqSYiIiIi8jcePXrE2rVruXHjBn369MFgMBAVFcWOHTvw8fGhZcuWADx9+hRHR0dzJZCJ6eslS5awb98+bt++zdChQ8mUKRPw7t0WReKDpaUlT58+ZejQoVhZWbF3716SJUuGh4cHZcqUMd+Hpl+NRiNubm7MmjWLZcuWsWvXLsLDw4E/7mvTuVq+LCJfIoVqIiIiIiJ/w97enlKlSrFixQo2btyIj48PWbNm5ebNm5QrV46rV6/i6+vL/fv3uXTpEoUKFaJVq1ZkzJgR+CNsyJw5M5kzZzaPa6oaUqAmH8vt27fp0qULqVKlon79+iRLlozly5ezefNmsmbNSsqUKeOEvKZf06ZNS9++fYmIiODIkSN06dJFIZqICFr+KSIiIiLyFlPD9tjYWKytrbl//z6hoaEYDAa8vLzIly8fadOmZe7cudSsWZPAwEBevXpF2bJl2bBhAwcPHvzb8WNjY7G0tFSgJvEiNjY2zkYEpuWcZ8+e5cWLFwwZMoTKlSvTp08fBg4cyKVLlzhw4ADA396TOXPmxMLCwlytJiLypVOlmoiIiIjI/xcbG2vehMDkxYsX5M+fn6RJk7Ju3Tp27NiBp6cn48aN4+HDhzg4OGBra4uzszPW1tYEBAT8z9BBVT4SX95cfhwWFoaNjQ2JEycG4OjRozg6OpImTRqio6OxsrKifv36bNmyBT8/P/Lnz0+mTJneWpIcExPDkydP2LVrF8mSJcPJySlB5iYi8qnRd3MRERER+eIZjcY4PaL27t3LN998w+DBgzl9+jReXl40bNiQ3LlzM3v2bACSJUuGq6srwcHBREREYG1tzaJFi7CwsKBMmTIJPCP5Erx69YqQkBAAoqOjgdeBbVRUFP369aNOnTp06NCBefPmAZA3b16uXLnC/fv3sbKyMu/kWb16dY4ePcqePXuIjo5+q1otJiaGo0ePcubMGTw8PD7iDEVEPm0K1URERETki2cwGLCwsCA6OprFixfTu3dvXF1dOXPmDB06dOD8+fOkTZuWmjVrEhYWxsKFC4HXmxgMHDiQTp06Ubt2bebOnUvHjh3JmzdvAs9IPnc3btygcuXK5t04raxeL0K6cuUKEyZMIDg4mN69e+Po6MjkyZM5c+YMJUqUIG3atIwbNw4Aa2trAC5evEjixIk5cOAAFy9efOu1rK2tKVmyJHv37qVOnTofaYYiIp8+g9G0wF5ERERE5Avy5106169fz5IlS8ibNy9eXl7kzp2bJ0+e0Lp1a1KlSsX06dMJDw9n0qRJHDx4kDVr1uDi4kJgYCAhISE8e/aMevXqmcfTrp4S306ePEnBggWB15Vq8+bNw9fXl6RJk/Ljjz/i5ubG/fv3+f7773n06BHr1q1jzZo1DBo0iObNm1O8eHEePXrEmjVraNiwIePGjWPQoEHUrFlT96+IyD+gSjURERER+aLExMRgNBrf6muWKlUqbt26xYEDB0iVKhUAzs7OdO/enT179rBz505cXFyoVq0aNjY2VK1alXr16uHu7k6VKlXMgZppGZ4CCYkvprqIggULEhwczKZNmzAYDGTJkgWDwUBsbCxubm7A6/u6RYsWXL58mfXr19OgQQOGDRtGYGAgY8aMYfr06dSrV4969erh4uLCpUuXAN2/IiL/hDYqEBEREZEvhmnXTYBTp05x6NAhChQoQJ48eShRogQNGjTA19c3zs6JHh4eVKhQgdmzZ1O8eHGKFSvGuHHj2LBhA56enqRIkSLOa5iW4Yl8aKbNBd4MvObNm8emTZtIliwZ5cuXJzAwkGXLlnH16lUyZ84MQIECBahXrx4//vgjdevWpWHDhtStW5fff/+djBkzAq+r3hInTkzVqlUTZG4iIv9FqlQTERERkS+GhYUFoaGhtG/fntatW7N161a6dOnCokWLAGjevDlWVlbmnmmmiqDevXtz8eJFlixZgtFoJE+ePAwcOJBixYqhbiryMRiNxjh904KDgwHo3LkzSZMmZePGjURGRlKnTh2yZMnC1KlTzc91dnbGy8uL8PBwBg8eDLzeGXTBggXMmDGD0aNH4+3tTZ48eciaNevHn5yIyH+UQjURERER+WI8efKEvn37Ymtry6ZNm9i0aRNVq1bF39+fgwcP4u7uTrt27Vi6dClXr17FYDBgNBrJmDEjbdu2xcbGxlzpBq8r37RMTuKLaVdaeL0c8/z589SqVYsWLVrQsmVL9u3bh4uLC02aNOHgwYPs2bOH7NmzU6tWLQIDAwkICDCPlSVLFoYPH079+vWB18tCEydOzOXLlwkKCmL69OkMGzbMvHmBiIj8b9qoQEREREQ+e3v27KF8+fKcOHGC7777junTp5MzZ05OnjxJ3759CQ8Pp1y5cgwaNAiAli1bkiZNGqZPn24eQ43b5WN6cyONly9fYmNjw8iRI7G3tydv3rwsXbqUa9eu4e/vj52dHY0bN8be3p4RI0ZgaWnJ0KFDCQ4OZt26dW+NHRMTYw6H3/y9iIi8H1WqiYiIiMhnxbRRgMndu3fp1asX27Ztw8rKilKlSpEqVSpWrlzJ3Llz8fb2pl27dhw5coQ9e/bg4ODAt99+y86dOzlx4oR5HFOg9ma/NZEPzVTzYArUxo8fT5MmTfD29ub8+fO0bduWihUrMmzYMKKjo83LPDt16sTFixfZvn07KVOmxNPTkwcPHnDy5Mm3XuPNEE2BmojIv6cuqiIiIiLyWbGysiIyMpKIiAiSJ0+OwWCgaNGiBAcHU7VqVTJnzsylS5fw9/fH09MTLy8vbt68ycSJE1m2bBnp06enWrVqODo6Urhw4bfG//OuoSIfkim8DQoKYuvWrRw8eJAyZcqwfPlyXFxcCA8Px9nZmdSpU9O2bVumTJlCw4YNKVu2LCVKlGD58uUULFiQGjVqUL58eVxcXBJ4RiIiny99IhARERGR/7SYmJg4XwcFBVGkSBHGjh1LdHQ0qVOnxtramjNnzgCvK3MmT55MmjRpaNiwIQC7du0iR44cJEqUyHxe6dKlAbQRgcS7N6sfjUYjq1evpmvXrhw4cICJEyfSs2dPhg8fzvPnz9m/fz8A1tbW1KpVi8yZMzNhwgQAOnbsSOrUqXF2dsbGxgYXFxdVVoqIxCOFaiIiIiLyn/bn5WupUqUiefLk+Pn5MWzYMADq16/PgQMHiIiIwM7OjufPn/Pw4UOuXLnCzz//zLp162jatCmzZs2iefPmccZTHzWJbxYWFjx//pw9e/ZgMBj46quvcHBw4MGDB2TIkAGA6tWrkz17drZu3cr58+cBSJ48Od7e3uzcuZMDBw6QOXNmFi9eTPr06eOMLSIi8UPvsCIiIiLyn/bo0SMGDRrEli1bgNdN3cuUKUPt2rXZvHkzU6dO5eXLlxQtWpSjR48C0K1bNy5cuECXLl346aef8PHxwcvLCwcHB4xGo6rTJF79uboSYOHChXTs2JFff/2VIkWKUK1aNR48eBBnB08fHx+uX79OQEAAL168wMLCglKlSjFixAiKFCnyt+OLiMiHp1BNRERERP4z3hUWhIaG8uTJE77//nsCAwNxdXXFysqKNGnSMGbMGM6ePcsvv/xCaGiouerMw8ODVatWMWnSJPbs2UPlypWBP3b4VHWaxCdTdWVkZKT5WOfOnUmVKhXLli3jxYsXeHp6UqJECWbNmmU+J1++fHh6erJmzRqOHDkCgJOTE15eXtjY2JjDYG0+ICLycShUExEREZFP3rvCAtOxzJkzM3XqVEqXLs2YMWPYtWsXTZo0YfHixVSoUIFWrVoRFRXFyZMn2bt3r/n5qVOnJm/evMAfO4YqTJP48mb1Y0xMDB07dmTOnDm8ePHCfLx3795s3ryZAwcOkDZtWmrWrMm9e/dYtmyZ+ZwOHTrg5uZGmjRp3hpf96+IyMelUE1EREREPmlvhgUHDhygfv36/Pbbb+ZjprBi9OjRFClShFGjRnHp0iWKFCnCtm3bKF26NH379sVgMPDy5UtzgPYmKyurjzch+aK8K7C1tLQkSZIkrFmzhitXrpiP16xZk7x58/LTTz8RGhqKh4cHZcqUYdGiRTx+/BiAlClTsnTpUrJmzRrndRSoiYh8fArVREREROSTZjAYCA4OxtfXl1WrVlG2bFmcnJziPG40GnF0dKRjx440aNCAgQMHcu/ePe7cuUNUVBR58+Zl27ZtjBs3TgGafFSm+23Dhg0sWbKETZs2ATBmzBhevXrF6tWrefLkifn8wYMH8+uvv+Lv70+SJEnw9PTk1atXHDx4MM646psmIpLw9IlCRERERD4pMTExb/WE2rJlC+PGjSNXrlxMmjTprcdNVTpOTk506tSJly9fMmfOHAIDA2nXrh2AeUfEd40vEl/OnDlD3759efnyJSlSpODJkydkyZKF7Nmz07t3b4YNG0aFChUoX748ALa2tiROnJg1a9aQL18+SpUqxapVq0iRIkWccXUPi4gkPINRWxuJiIiIyCcgNjY2ziYBERERODg4ABAVFUWrVq149uwZ8+fPfytgeHMMCwsLIiIiOHHiBHny5CFp0qQfbQ7yZTPdf29+3aNHD1xcXBg6dChRUVE8fvw4zv1bq1YtUqRIwXfffUe2bNnw9fXl1KlTBAUFMXDgQLJlywb8scxZyzxFRD4dCtVERERE5JNy4sQJZsyYgY2NDY6OjpQvX57q1auzc+dOunTpwpQpU6hSpco/Hk+VaRLf/uoeu3z5Ml26dKF79+7UqFGDTZs28fvvv3Pr1i1Sp06Nj48PZ8+epWXLlqRJk4YUKVLw66+/8tNPP1GoUKEEmImIiLwPhWoiIiIikuBMmxEsWbKEqVOn4uXlRcaMGTl37hwrV65k3rx5lClThvbt2xMWFsacOXNwdXVN6MsWicPX15dz587h6OhIu3btcHBwoGrVqhiNRm7fvo27uzsuLi7Y2tpy5MgRBg0aRLNmzdi7dy+nT5/m0aNHeHt7m3f2VCAsIvJpU081EREREfno/hwWGAwGIiIi2Lp1K4MHD6Z27doA3LhxA4A7d+4A0KtXL+rVq8fWrVtp2rSplsLJJ+HmzZt899133Llzh1KlSrFnzx5y5syJp6cnc+fO5dSpU1hZWZE+fXqSJEmCm5sb9evX5/LlywCUK1eOcuXKmccz/f1QoCYi8mlTqCYiIiIiH01sbCzwR5P1yMhI7OzsAPj999+JiIggT548bNu2jTFjxuDi4sKiRYuwt7fn4sWL5MiRg8aNG/PDDz9QokQJMmbMmGBzkS/Tn/umweudPZMlS8bKlSsBePbsGdbW1sTExJAuXTrc3d25f/8+SZMmxdrammPHjmE0GqlWrdo7x1eYJiLy36BQTUREREQ+GlMYce7cOaZOnQpAunTp6NevH5aWlty+fZuOHTsSERFBhw4daNiwIYkSJaJnz544OTkxbNgwOnXqxOXLl98KNkTik6l6zHTfRUdHY2VlRUREBFevXiVRokQ8f/6crVu38ttvv3Hz5k0SJUpE06ZNcXNz45tvviFFihQ4Ozuzb98+mjZtSrFixd56Hd3XIiL/HQrVRERERCRemfqlGY1GjEYj8+bNY86cOdSoUYMUKVJw+/ZtHj9+TJYsWShevDiBgYEsWbKEHDlyABASEsKvv/5KmzZtAHB1dWXp0qUJOSX5Arx48QJbW1vg9T1sqh7bunUr27ZtI3ny5LRq1Qp3d3fSpUvHrl27KFiwIClTpiRLliw4Oztz7tw5Fi1axOzZs/Hx8eHGjRs8evSIDRs2kCFDBvPYWsYsIvLfpI0KREREROSjefToEV27dqVt27ZUqFABeB2aWVtbkzhxYn777Tfq1atHvXr1qFy5MhkyZGD+/PmcPn2a8ePHkyVLFvNYauIu8WX8+PG4u7vTqFEj83LP33//nX79+vHbb79RrFgxjh49Stq0aZk5cyaurq5cvXqVsLAw0qVLh7W1NSlTpuTHH3/kyJEjrFq16q17NSYmBoPBoMo0EZH/MFWqiYiIiEi8OnbsGJcuXaJBgwaEhoYSHBzMpUuXsLCwYMuWLYSGhnL+/HmKFi3KgAEDmDx5MrNnz2b//v1YWVmRLFkyJkyYQObMmeOMq0BNPjRTgGZra8vjx4+BP5ZjLly40Lx008bGhosXL9KgQQP8/Pxo1KgROXLk4LfffiMyMhJ3d3euXLnC6dOnqVSp0lv3qvqmiYh8HhSqiYiIiMgH867qsfXr13Pw4EFy5MhBrly5KFeuHIsXLyYyMpIyZcqQIUMGChcujK+vL6tWrcLHx4dSpUrx+++/ExMTQ65cuYB3N4gX+ZBM99f169fJmzcv8Pq++/3339m0aRPjxo3DxsYGf39/Zs6ciYuLC4sXL6Zo0aJkzZqVWbNmcfLkSTJlysTJkyepXLkybdu2/cvXERGR/zYt/xQRERGRDyo6OpqwsDBSpEgBvF7y2aRJEwoWLEi/fv1wcnLi9u3buLi4YGlpad79s3r16jRr1oxmzZq9NaaWesrHYOpvNnXqVI4ePcqyZcvMj02aNIkGDRoQGBjInj17KFmyJI0aNaJw4cLUqVOHgQMHcuvWLU6fPs3t27epWLEi2bNnBxQIi4h8rvTOLiIiIiIfTFhYGLVq1WLRokVERUUB4OLiQpMmTTh06BC7d+82n7t//34uXLhAeHg4Y8aMwcLCwlwd9GcK1ORjMG0YYAp8r127Zn6sc+fOxMbGsmzZMvLly0eFChV4+vQpiRMnxt/fnwkTJpA+fXpq165N586dyZ49O7GxsQrUREQ+Y1r+KSIiIiIfjKurK7ly5eLIkSOcPHmS4sWLA9CqVSs2b96Mn58fJUqU4MWLFyxfvpybN29iY2ODnZ0do0ePJk+ePAk8AxHInDkzs2bN4tatW2TMmBEAa2trfvnlF16+fGle0rl3716yZ8+Oo6OjeRMNU4imME1E5POnUE1EREREPgjTEs3vvvuOxo0b4+/vT9asWXF1dQWgS5cutG/fnu3bt9OiRQumTJnCxYsXsbS0NIdvpuV3IgmpRIkSJE2alPXr11O4cGEcHBwwGo0kS5aMK1eusGjRIu7du4evry/dunXDy8uLRIkSAX/0S1OgJiLy+dM7vYiIiIj8IzExMW8de7M9r6WlJTExMaRIkYJGjRqxb98+jhw5Yn7cYDBgZ2fHpk2bOHz4MK6urpQqVcocqMXExChQk09Gr1692L59O/v37+fVq1cYDAYqVKhAy5Yt2bx5M6dOnWLGjBk0bdqURIkSERsbi9pVi4h8WbRRgYiIiIj8T29WkO3fv5+oqCjSpk2Lu7s7iRMnNi91e/O8unXrkjp1atq1a0fhwoX58ccfAUiSJAlNmzbF3t4+weYj8k/4+PgQFBRE3759KVu2rPn4gwcPzBtx/L/27jys6jL///jzHJZAUTBQMMHUzF3EDZNMXMhdm0mS/CZq6oh7uW+lGI4piVai38EtcvlKjJYw5jLmOC4DjqGkNe6pISAKkiIoIJzz+8MfpwhLaVRUXo/r8g8+5z6fz32D1+Xxxft93yaTCYPBoEBYRKQcUqgmIiIiIvfkxIkTTJ06lZycHCpXrkx2djaNGzdm8eLFxcYVtYHu3r2b+fPnc+PGDQAcHR1ZuXIlbm5uZTF9kVLLyclh9OjRFBQUMG7cOLy9vYGfQmadSisiUr4pVBMRERGRu8rJyWH69OlUqVKFadOmYW9vz+bNm5k2bRohISH4+/vfsVLn9OnTJCYmUqFCBXr16mW5rk3c5XFx8uRJNm7cyNatW5kzZw6dOnXS310REQEUqomIiIgIkJ2djYODw69W3vznP/9hyJAhbNmyhapVqxIeHs7atWvx9fVl3LhxuLu739NzCgoKsLbWWVny+Fm+fDlHjx7FYDDw3nvvUaVKlbKekoiIlDF9ohEREREpx/Lz8wkICKBZs2bMmDEDW1tbAL7++mtu3bpF48aNcXR0JDk5GQ8PD3bs2MHq1aupVKkSCxYswMfHh/DwcJ5//nl69+5919M7FajJ46bo7/Tw4cPJy8tj//79CtRERARQpZqIiIhIuZSfn09ubi6VK1cmIiKCFStWsG7dOipWrMikSZM4deoUdnZ21KhRg4iICAB8fX2xtrbmrbfeYtCgQRiNRi5cuEBgYCCvv/46I0aMKONViTw4alkWEZFf0r8KIiIiIuWM2Wxm//79HDp0CICgoCBcXV0JDw/ns88+o2nTpmzZsoVFixZx7tw5PvroIypXrszAgQOxt7enZcuWlnDh/Pnz2Nvb06FDhzJckciDp0BNRER+SZVqIiIiIuVQQEAANjY2fPTRR2RlZZGens7AgQNxcHBg1apVNGvWDICoqCjmzp1LREQELVq0oG/fvty4cYOmTZtib2/Pjh07GDx4MOPGjdMpiCIiIlKuKFQTERERKUeKWtiSkpLo3r079vb2dO7cmZCQEGbMmMG+ffvYuHEjHh4elvf07NmTatWqsXz5cjIyMti5cydnzpwhNzeXwYMH06hRozJckYiIiEjZ0E6xIiIiIuVIUQvb2rVrKSwsxMbGhqFDh2Jra0tQUBDbt29n165dDBw4EIPBgMFgIDg4mEGDBrF582b++Mc/MnDgwGKnhJpMpmL3FhERESkP9MlHREREpBwpCsCGDx/Otm3buH79Ol9++SXZ2dk8//zz9O/fn1WrVvHDDz9gMBgwm820bt0aLy8v1q9fz/Xr1wGKBWpGo1GBmoiIiJQ7av8UEREReQLd7aTCW7duYWNjw8cff8yaNWtYunQpbdq04dq1a/To0YOePXsyadIkbG1tAbh+/TqFhYU4OTk9pBWIiIiIPNr0K0URERGRJ4jZbKawsPCulWPW1rd3ARk3bhwVKlQgOjqaK1eu4OjoyNixY1mzZg2HDx+2jHdwcMDJyYnCwsIHOn8RERGRx4X2VBMRERF5ghgMBqysrEhLS2PZsmVUqlQJe3t7AgICqFq1arFxBQUFWFtbM3PmTN566y1eeuklGjZsiJ+fH3FxccWCOYPBAKATPkVERET+P7V/ioiIiDwhilo+o6OjmT9/Pm3atKFWrVrs3LmTGjVqMGLECNq2bYvZbLaEZEWGDh3Kf/7zH/Ly8li6dCk+Pj5ltAoRERGRx4Mq1UREREQeU788ddNoNJKfn8/f/vY3JkyYwIABAwCwtbUlIiICHx8f2rZtWyxQKzrFc9GiRSQkJNCkSRNcXV0t99cBBCIiIiJ3pk9JIiIiIo+JzMxMpkyZQnR0tOWa0Wjk6NGj7Nu3D4C4uDhSU1MZMGAAhw8fpm/fvmzatIlFixbRo0cPkpKSit2zqJ3T0dGRzp074+rqatk3TYGaiIiIyK/TJyURERGRR9z169fJysoiPz+flJQUtm7dyrVr1zAajVy8eJGxY8eSkpICgKurKykpKQwfPpygoCBatGjBli1b6NGjB/PmzePgwYN3fZ72TRMRERG5O4VqIiIiIo+wK1eu0Lp1a+Li4nBzc6Nv375kZmaydu1aAL7//nuys7Px8/MDoGLFirRt25YjR46wZcsWZs6ciZOTExkZGSQkJHDz5s2yXI6IiIjIE0OhmoiIiMgjKD4+nqSkJJydndm8eTPdunUDoGvXrjRu3Jhdu3Zx6dIlkpOTadGiBS4uLgDUqFGDjh07kpuby+7du0lNTeXWrVusW7cOd3d3OnToUIarEhEREXly6KACERERkUfMmTNnmD17NrVr1yYiIoIGDRpw9uxZ4uLiGDBgAH369OHkyZOEh4dz5coVEhMTiY+Pp0GDBlSpUoVevXqRmZnJ3LlzqV69OlZWVuTl5RESEoKHh0dZL09ERETkiWAwm83msp6EiIiIiPykoKCATz/9lDVr1vDnP/+Zdu3asWLFCsLCwoiMjOSFF14gNDSUXbt2kZycTLNmzThz5gzVq1dnwoQJ+Pr6AnDixAmSkpIoKCigR48eZbwqERERkSeLQjURERGRR4jZbMZgMPD999+zYMECsrKyiIqKAqB79+7UrFmTDz/8kNTUVGbOnMmlS5f48ssvOX/+PPPnz+f48eNUqVKFIUOG8Prrrxe7d0FBAdbWalQQERERuR+0p5qIiIjII8RgMADw3HPP0b17d9LS0oiMjARg+vTp7Nmzhx07dvDcc8/Rq1cvrKys2LZtG40aNSIiIoKVK1fi6emJt7d3iXsrUBMRERG5f1SpJiIiIvKIKapWu3z5MosXL+bw4cNER0fj6OjIkCFDSE9PZ+XKlVhbWzNnzhzS0tL4+OOPcXNzK+upi4iIiJQbqlQTERERKQOFhYW/+lpRtVq1atXo1q0bVlZWfPzxxwC89957nD59mi+++AJnZ2c6depEfn4+Fy5cKHYPk8n04CYvIiIiIqpUExEREXmYij56FQVnX3/9NRUrVqRmzZo4ODgUG2cwGMjJySEiIoIvvviCiIgIGjVqxNy5c1m3bh0bN26kYcOG5ObmUrFixTJZj4iIiEh5pUo1ERERkYfIYDBgMBg4fPgwPXr0YPLkyQwcOJAPPviAn/+u02AwYDabqVixIn5+ftSsWZOlS5cC8M4779C2bVscHR2xsrKiYsWKqkwTERERechUqSYiIiLygBVVnRX59ttvmT59Ol27dqV///5kZGRgMplo1KjRr74/MjKSBQsWsGzZMjp16vSwpi4iIiIiv0JHQImIiIg8IIWFhVhZWRUL1ACSkpKoUKECo0aNwsrKiqSkJK5evcqxY8do3bo1zz77rGVsUSDXsWNHXFxc6NixY4n7i4iIiMjDp1BNRERE5AEpCrx27drFDz/8wMsvv4yHhwfXrl0jMzOT4cOHc+HCBezs7Lh69SqXL1/G29ubGTNm0KBBA+Cnvddq1apFrVq1gJ+CNgVqIiIiImVHoZqIiIjIfWI2myksLMTa+vZHrKysLKZMmcKhQ4ews7MjKiqKhQsX4u/vz1NPPcXf//53evfuzfPPP0/z5s05d+4cI0aMIDc39zef88vKNxERERF5+BSqiYiIiNwnBoMBa2trsrOzSU9PJz09HQcHB3bu3ElWVhbDhg0jMjKSyZMn07dvX1599dViAdk333xDgwYNqF69ehmuQkRERETuhUI1ERERkfsoIiKCv/zlL9jb22MwGPD398fJyQknJydGjRrFokWL2Lt3LwEBAaxdu5b4+Hi8vLxITU0lNjaWMWPGUK1atbJehoiIiIjchbGsJyAiIiLyJIiLiyMhIYHExESWLFlCUFAQZrOZ77//3jLmD3/4A7Vr1+bLL7/k4sWLeHt7U6lSJfbv38+lS5eIiopi6NChau8UEREReQwYzGazuawnISIiIvI4MZlMGI1Gy4EBAH369OHUqVMEBAQwZ84cCgoK+PTTT/nkk08IDQ3Fx8cHgMOHDzN+/Hj8/f0JCgrC1taWrKwsKleubLm3wWBQsCYiIiLyiFOlmoiIiMg9KiwsBMBoNFJYWMitW7csr4WEhGBjY4Ozs7PlsIJ27drRoEEDwsPDLeNatGiBp6cne/fuJSMjA8ASqBUWFmI0GhWoiYiIiDwGVKkmIiIiUkqRkZHs2rWLChUqULt2bQICAqhduzZTpkzh8OHDREZG4u7uDsCmTZtYunQpQUFBBAQEALdPBTUajTg4OJTlMkRERETkv6BKNREREZF7dP36dUaNGsWaNWvo1asXLVu25PTp0wwePJjr168zYcIEfvzxRz7//HPy8/MBaNeuHZ6enixatIjc3FwAKlWqhIODg6XyTUREREQePwrVRERERO7AZDKVuHbs2DGSk5P561//SkBAAH369CEnJ4esrCxSUlJwc3PjT3/6E2vXruXs2bMAuLq6EhAQQFhYGHZ2dgCW9k4rK6uHtyARERERua8UqomIiIj8zM/3Tfs5s9nM8ePHcXd3x87Ojvfff5/u3bvz7LPPEhMTQ1paGvn5+QwbNgxHR0cWLVpETk4OAG3btqVdu3YPfS0iIiIi8uAoVBMRERH5maLqsZiYGObOncvKlSs5fvw4BoOBvLw8Dhw4QNeuXTl8+DAREREsWLCAgoICFi5cyN69e7G2tubtt9/G0dERGxubMl6NiIiIiDwoOqhARERE5GeSk5OZNGkSly9fxsfHh9OnT5ORkcGQIUPo0aMHfn5+vPDCCyxcuBB7e3sAtm7dSkhICOvWreO5554r4xWIiIiIyMNgXdYTEBERESkrJpOpRJvnP/7xD+zs7Ni+fTu2trbcuHGD1q1bs3XrVnr16sWgQYOIjIxk9erVdO7cmezsbNasWUP79u0tJ34WKSws1L5pIiIiIk8oVaqJiIhIufNrYVdeXh5//OMfGTlyJL1792bBggVs2rSJtm3bMmHCBIxGIx4eHsydO5cdO3bg5OTEpUuX6NatG7Nnz1aAJiIiIlKOKFQTERGRcsVsNltO3/z73/9OYmIiNWvWpF27dnh4eBAYGAjA5cuXsbe3Z8KECbRv357o6Gj279/Pxx9/TH5+PllZWVy4cIFnnnkGV1dXQJVpIiIiIuWJ2j9FRESkXDEYDCQnJzNlyhSSkpJo2LAhBw4cwMXFherVq9O0aVOio6N57bXXmDp1quV9R48e5dy5c9y8eRN7e3tcXFxwcXEBbodpBoNBgZqIiIhIOaJQTURERMqd2NhYXFxciIyMxNbWlvT0dKpWrQpAly5dOHDgAKdOnSI7Oxtra2suXLjAN998wxtvvGE5nODnFKaJiIiIlD8K1UREROSJkpuby6lTp2jQoAG2trYlDiMoKCggNjYWX19fTCYT27Zt4+TJk5w/f56CggJmzJjBsGHDeP/99/Hz86NWrVqcPHmS3r1707dv3zJcmYiIiIg8SrSnmoiIiDwRivYz27ZtG1FRUYSFhVnaM385ZuHChfz1r3/l5s2bVK5cmeeff56nnnqKU6dO0ahRI8LDw7lw4QJnzpzh/PnzvPTSS9StWxcoviebiIiIiJRfCtVERETksZaVlUVwcDCenp4MHjyYK1eu8OKLLxIYGEhOTg6BgYE0bNiwxPv27NnDrVu3qF+/PgaDAXd3dxYvXsw//vEPoqOjS7R5mkwmgGJVbyIiIiJSfulToYiIiDzWCgsLad26Nf369cNsNuPs7Iyrqyvr1q0jJyfHUmFWpOj3ib6+vri7u+Pq6oq7uzspKSnEx8fj7+9fIlAzm80YjUYFaiIiIiJioT3VRERE5LFlNpupUqUK/fv3B+C7776jVq1a1KhRg6ysLJydncnNzcXGxsbynqLWzR9//JEPP/yQU6dOUbduXRISEujQoQP+/v4lnqN2TxERERH5JbV/ioiIyGNj3759HDhwgMDAQNzc3Iq9tnLlSlatWsWSJUto1aoVGzduJDg4mCVLltCxY8c73u/8+fPEx8eTmprKyy+/jKenJ6B900RERETk7tTDICIiIo+FrVu38qc//YmqVavi7OxsuV70+0EvLy/q1q3LunXrAPD396d27dqsXbuWtLS0O96zVq1a9O/fn4kTJ+Lp6YnJZMJkMilQExEREZG7UqgmIiIij7zCwkKOHDlC48aNGTx4sKWds6CgwBKAtWrVihdffJEzZ86wceNGAGbNmkVcXBz79u0rdr+iQwd+eU37pomIiIjIvdKnRhEREXkk7d69m8WLF5ORkYGVlRX169cnMzOTadOm8dJLL5Gfn4+19e3tYYtCsp49e+Lu7k5sbCyZmZm0bt2ajh07smzZMiZPnkxYWBhw5xM8FaaJiIiISGno06OIiIg8khITE4mOjubgwYMA1K5dm7S0NL766iv69euHra2tJUwrCsQ8PDzw8/Pjxx9/ZMOGDQDMmzcPb29vUlNT6dChQ5msRURERESePArVRERE5JFStEfa+PHjeeaZZ9i+fTtZWVkcO3aMNm3aYGdnh7OzM4WFhcWqy4re161bNzw9Pdm5cyffffcdVapUYdasWaxfv56WLVuWyZpERERE5MmjUE1EREQeKQaDgcLCQgwGA8OGDSMhIYGtW7fyxhtvEBkZiZeXFzExMXz77bfAT2GawWDAbDbj4OBAx44dMRgMXLx4EYCKFSsCt/dmExERERG5Hwzmok+iIiIiIg9ZSkoK1apVsxw8cCfDhw/nxo0bTJo0CS8vL06dOsWwYcPo06cPI0aMwMHBAbPZXOLEzmvXruHo6PiglyAiIiIi5ZQq1URERKRMLF++nEGDBnHy5Mk7vl5UVTZu3DjOnz/Pnj17yM7Opl69enTv3p2vvvqKhIQEgBKBGoCjoyMmkwn9/lBEREREHgSFaiIiIvJQFYVcKSkpJCcns2/fPrKzs4u9BmBlZYXZbKZJkyZ06dKFnTt3cujQIQDGjh2LtbU1W7duJTU19VefZTQa7xi4iYiIiIj8txSqiYiIyENVFJwV7X/2f//3fxw7dgwoWXFWNHbMmDHk5uby1VdfcenSJRwcHHj11VfZs2cPly9ffrgLEBERERFBoZqIiIg8ZEajkRs3bpCSksKKFSt46qmn2LBhA+np6QCYTKZiYwsLC3n66acJDAwkPj6evXv3AjBkyBA2bdqEl5dXWSxDRERERMo5hWoiIiLyUJnNZipUqEBmZiZ2dnZMmzaNbdu2cfToUeCnarWicM1ovP1xZdCgQZjNZo4cOUJOTg5msxl3d/diIZyIiIiIyMOi0z9FRETkocvMzOSVV17h008/pU6dOgQGBpKfn0+dOnWoXr0648aNKza+oKAAa2trkpKSqFmzZhnNWkRERETkJ6pUExERkYfKZDKRl5dHtWrVcHZ2BqBFixYcOXKEr7/+Gl9f3xLvsba2BrAEakUng4qIiIiIlBXrsp6AiIiIlC9Go5Eff/yR/Px8vv32W0JDQ8nLy6NVq1ZcvHgRe3v7u97DysrqIcxUREREROTXqVJNREREHjqTycTp06eZOHEivr6+bNmyhTVr1pCWlsYnn3xCdnZ2WU9RREREROQ3qVJNREREHrp69eoxZswYevfuzbPPPktBQQFGo5FJkyZx8+ZNHBwcynqKIiIiIiK/SQcViIiISJkzm82WUz9FRERERB4Hav8UERGRMvfLQM1kMpXRTERERERE7o0q1UREREREREREREpJlWoiIiIiIiIiIiKlpFBNRERERERERESklBSqiYiIiIiIiIiIlJJCNRERERERERERkVJSqCYiIiIiIiIiIlJKCtVERERERERERERKSaGaiIiIiIiIiIhIKSlUExERERERkXLLbDaX9RRKeBTnJCIlKVQTERERERERi8DAQAIDAx/qM//9739Tv359/v3vf1uuffDBB3h7e+Pl5cXmzZvp1KkT06ZNu6/PPX36NP379y92rX79+ixZsuS+PudepaWlMXz4cFJSUsrk+SJSOtZlPQEREREREREp3xo3bsxnn31G3bp1ATh16hQrV66kX79+vPLKK9SpU4d69erh4OBwX5+7fft2EhMTi1377LPPcHNzu6/PuVdxcXHs2bOnTJ4tIqWnUE1ERERERETKlIODA15eXpavr169CkDPnj1p1aoVAE8//fRDmcvP5yEi8lvU/ikiIiIiIlLOmM1mIiMj6d69O56enrz88susWrXqjnt5ZWZmMmfOHDp27EiTJk3w9vZm9OjRJCcnW8YkJSUxYsQI2rRpQ7NmzQgICChWcZWbm0twcDDt27enSZMmdOvWjVWrVlle/3n755IlSyztp4MGDaJTp04AJdo/s7OzCQkJ4aWXXsLLy4u+ffvyz3/+s9gzw8LC6NKlC02aNKFFixa8+eabHD9+HIAlS5YQHh4OFG/5/GX75+XLl5k+fTq+vr54enri7+/Prl27in2P6tevz/r165k5cybe3t40b96ct956i4yMjHv+mXz++edMnz4dgM6dOzNt2jQWLFiAp6cn169fLzZ22bJltGzZkps3b7JkyRI6derE7t276datG82aNaNfv37FWmnhdlA5a9YsfHx8aNq0Kf369SM+Pv6e5yciJSlUExERERERKWdCQ0MJDQ2lU6dO/OUvf8Hf35+FCxeyfPnyYuPMZjNBQUH861//YtKkSaxatYoxY8YQHx/P7NmzATCZTAQFBXHz5k1CQ0NZtmwZTk5OjBw5kh9++AGAefPmsXfvXqZOncqqVavo3LkzoaGhbNq0qcTcXnvtNWbNmgXArFmzLMHXzxUWFjJkyBD+9re/ERQUxLJly6hTpw6jR48mISEBgClTprBp0yaGDx/O6tWrmT59OqdPn2bixImYzWZee+01/P39gdstn6+99lqJ52RkZODv709CQgLjx49nyZIl1KhRg9GjRxMbG1ts7OLFizGZTCxatIgpU6awe/du5s2bd88/kw4dOjBy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X19Wr15NWFgYf/7zn8nKyqJWrVq89957vPrqq8DtUO7DDz9k9erVpKen4+zsjL+/P2+99dbvmr+VlRUrVqxg4cKFfPTRR9y8eZP69euzevVqSxAYFhZGeHg4I0eOxNHRES8vL9auXUtgYCAJCQnUr1+fLl26EBMTw7Rp0/D39yc4OLjYc6pWrcqGDRsICwtj7ty53Lp1iwYNGrBs2TI6d+78+775v6FNmzb4+PgQFhZGfHw8y5cvt7zWoUMHMjMzLaed/lJwcDDz5s0jMzOTFi1asGHDBkslXYUKFVi/fj1hYWF88MEHXL9+nRo1ajBx4kSGDBly39chUl4YzPdj50QREREREREReSDMZjM9e/akXbt2zJgxo9hrS5YsITw8nJMnT5bR7ETKL1WqiYiIiIiIiDxABQUFdx1jNBpLtJNmZ2cTGRnJt99+y4ULFwgMDHxQUxSR30GhmoiIiIiIiMgDkpycfE+tomPGjGHs2LHFrtnZ2REVFYXJZGLevHkl9nwTkbKl9k8RERERERGRByQ/P/+eWjOrVatW4lRPEXm0KVQTEREREREREREppft7/q+IiIiIiIiIiEg5oFBNRERERERERESklBSqiYiIiIiIiIiIlJJCNRERERERERERkVJSqCYiIiIiIiIiIlJKCtVERERERERERERKSaGaiIiIiIiIiIhIKf0/RBGuVtAGurEAAAAASUVORK5CYII=", + "text/plain": [ + "
    " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df = pd.DataFrame(results3, columns = ['size', 'sort_by_downloads', 'missing_values', 'classification_type'])\n", + "df['temperature'] = range_of_temps\n", + "plot_yes_no(df, title = query)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This seems to have been very easy for the model. But as always, the model starts adding extra information at higher temperatures. A lot of extra information in fact. Even though the prompt says to ONLY answer with one or two words" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Experiment 4\n", + "- \"Find me a dataset that 2 classes and is a big dataset\". You know the drill by now. We want a binary classification dataset that is large." + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 20/20 [00:42<00:00, 2.14s/it]\n" + ] + } + ], + "source": [ + "range_of_temps = np.linspace(0, 1, 20)\n", + "query = \"Find me a dataset that 2 classes and is a big dataset\"\n", + "results4 = generate_results_for_temp(query, range_of_temps)" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [], + "source": [ + "results4 = [combine_last_two_elements(x) for x in results4]" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n", + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n", + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n", + "/var/folders/_f/ng_zp8zj2dgf828sb6s5wdb00000gn/T/ipykernel_42184/3521201435.py:10: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n", + " ax.set_xticklabels(ax.get_xticklabels(), rotation=30, horizontalalignment='right')\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABNUAAAWXCAYAAABgMULBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeZyVZcE+8GtYhkVARGUVdwdcARVEwX2hNEvNXHKt9H3NyCUt663U0nzNJcvKtFxSUTPNUnMXNTUDd1MRNEVEBVERkEUGZs7vD3/M6zgDzqMwB4bv9/Phj7mf55y5zpmZc+5z8Tz3U1EqlUoBAAAAAJqsVbkDAAAAAMCKRqkGAAAAAAUp1QAAAACgIKUaAAAAABSkVAMAAACAgpRqAAAAAFCQUg0AAAAAClKqAQAAAEBBSjUAAAAAKEipBsAnuummm9KvX79P/HfvvffW2/+Pf/zjUs1x7733pl+/fvn1r3+9VO93RXTsscemX79+ef311z/1ffz973/P5MmTl2Kqz27+/Pm5/PLLP/W+3//+99OvX7+88MILSz3b+++/n1GjRjVp31KplGuvvTb77rtvtthiiwwaNCgHHXRQ7r777qWa6bDDDku/fv0ya9aspXq/NNTUv7lf//rX9V4Plwf9+vXLl770pSbt25y/Uy+88EL69euX73//+5/6PqZNm5a//OUvSzHV0vHvf/87Dz/8cLljALCMtSl3AABWHEOGDMmQIUMWu3299dZLkmy88cYZOXJkBg4c2EzJKOrcc8/NpZdemr/97W/ljlLPoYcemokTJ+brX//6Ut13aRgxYkTWXHPNHHrooZ+4749//OPccMMN6du3b77yla+kuro6d999d7797W/n+9//fr72ta81Q2LKYciQIRk5cmTd6+GKZt99982QIUPSrl27ckf5RO+++24+97nPZejQofnyl79c7jh1HnjggXzzm9/MKaeckuHDh5c7DgDLkFINgCYbMmRIvv3tb3/ifhtvvHE23njjZkjEp/Xuu++WO0KjiuRq7sfw7rvvZs011/zE/Z5++unccMMNGThwYP74xz+mQ4cOSZLjjz8+++23X37xi19kr732Svfu3Zd1ZMpgm222yTbbbFPuGJ/afvvtV+4ITTZv3rzMmTOn3DEamD59empra8sdA4Bm4PRPAIClaNEpnsccc0xdoZYka6yxRg466KBUV1dnzJgx5YoHAMBSolQDYKlrbE21XXbZJYcddlhefvnlHHPMMdlqq60yaNCgHH300Rk/fnyD+3j88cdzxBFHZKuttsp2222Xs88+Ox988EGTvv/rr7+efv365aKLLsrdd99dt67VLrvskiuuuCJJ8sQTT+SrX/1qBg4cmF122SW//vWvs3Dhwnr3UyqVct1119XdfvDgwTnmmGMybty4Jj8XTzzxREaOHJnhw4dns802y+DBg/O1r32tyaVKTU1NLr300owYMSJbbLFF9t577yWuy/W3v/0thx12WAYPHpzNNtssw4cPz0knnVRv7bRddtklf/3rX5Mk++yzT3bZZZe6bdOnT8/Pf/7zfP7zn8+AAQMyYMCA7LXXXrn44osbPD8PP/xwjjjiiGy77bZ12S655JJUV1c3yHXHHXfkoIMOyqBBg7LlllvmiCOOqPccLPqZvfHGG3n//feXuM5SU/adNWtWzjjjjAwfPjxbbLFF9t1339xxxx0N7qspj3fs2LHp169fkmT8+PGfuK7fsGHDMnLkyGy++eYNtlVWViZJ5s6du9jbfzTbWWedlV122SVbbLFFRowYkQsuuOATj8xZsGBBrrzyyhxwwAHZaqutstlmm2XnnXfOqaeemunTp9fbd9KkSTn++OOz8847Z7PNNssuu+yS008/PW+//fan2i9Jnn/++Rx77LHZZpttssUWW+RLX/pSrrvuupRKpXr7vfPOO/mf//mf7L777tl8880zfPjwfPe7382kSZM+8blZ9Pw05Xd10c/vpptuyo033pi99947m2++eXbYYYf8/Oc/z7x58+rdb9G/uY9rbE21Is9fY954442cdtpp2W233bL55ptn0KBB2W+//XLdddc1OVeSPPbYY/nKV76SzTffPDvttFPOPffcBr9Pja2ptnDhwlxyySV1z8mee+6ZG2+8MRdddFGT13YcP358vvnNb2bIkCEZPHhwfvCDH2TGjBmf+vHedNNN2XXXXZMko0ePrvsZL3L//ffnqKOOytChQ7Pppptm6NChOfbYYxustzhnzpycddZZ+dznPpfNN9882267bUaOHJnnn3++Qa633347p59+enbYYYe6n+O5556b2bNn1+3z/e9/Pz/4wQ+SJP/7v//7mde+BGD55vRPAJrNlClTctBBB2XdddfNAQcckIkTJ+b+++/P008/nbvuuivdunVLkjz44IM59thjU1lZmREjRqR169b561//mr///e+Fvt/dd9+diy66KJ/73Oey9dZb55ZbbsnZZ5+dN954I9dff3122GGHHHzwwbnzzjvzm9/8Jl26dMkRRxxRd/tTTjklN998czbaaKMcdNBBmTdvXl05dMkll2Tbbbdd4ve/9957c9xxx6Vbt27Zbbfdssoqq+Sll17Kgw8+mEcffTQ33njjJ54m+/3vfz+33HJLNtxwwxx44IF59dVXc9xxx2X11VdvsO/Pf/7zXH755enfv3/23XffVFRU5LHHHsvf//73PPHEE7nzzjvTvn37HH744fnrX/+a8ePH58ADD8z666+f5MOF+A844IBMmTIlu+yyS3bbbbdMnz4999xzTy644ILMnDkzp5xySpIPS89jjjkmq622Wvbcc8+0a9cujzzySH7xi19k0qRJOeuss+py/epXv8pFF12UPn361OW6884787WvfS1nn312vvSlL6VLly4ZOXJkrrzyysyfPz//9V//tdjnpin7nnjiiWnXrl323HPPzJkzJ7feemtOOOGEVFZW1n0Qb+rj7dOnT0aOHJnf/OY3dUebLWltwWHDhmXYsGGNbltUtGy44YaLvX3y4Yf3Aw88MG+88Ua22WabjBgxIuPGjcvFF1+cZ555JpdeemnatGl8GnfSSSflrrvuylZbbZUDDjgg1dXVefjhh3P99dfn+eefr1vUffr06TnyyCPz3nvvZcSIEenevXsmTJiQ6667LmPHjs0tt9yStm3bNnm/JPnHP/6RkSNHpm3bttljjz3SrVu3PPTQQzn99NMzbty4nHHGGUk+vMjE0UcfnRdffDG77757Pve5z+W1117Lbbfdlocffjh33HFHunbtutjnp8jv6iKjRo3Kiy++mD322CPbb7997rnnnlx++eWZNm1azj///Lr9ivzNNUWR568xr7/+evbff//Mmzcvu+++e3r16pW33nord911V04//fTU1NQ0aZ2/N998M1//+tczaNCgHHrooRk7dmwuvfTSPPnkk7n66qsX+/uUJCeccELuueee9OvXL1/96lfz2muv5Yc//GH69u3bpOfghRdeyCGHHJLq6uqMGDEiXbp0yejRo/PQQw996se78cYb5/DDD89VV12V9dZbL3vttVfd68CoUaNyxhlnZO21184XvvCFtG3bNs8++2xGjx6dMWPG5M4776w7/fqEE07Igw8+mJ133jm77bZb3nnnndx+++15+OGHc9NNN9W9Pr755ps5+OCD89Zbb2XnnXfOBhtskBdeeCGXXnppHnnkkVxzzTXp2LFjdtttt8yaNSujR4/O8OHDM3DgwHTp0qVJzxMAK6ASAHyCv/zlL6WqqqrSoYceWrrwwgsb/Td58uQG+19xxRV1YzvvvHOpqqqq9JOf/KRUW1tbN/6jH/2oVFVVVbr22mtLpVKptHDhwtIuu+xSGjhwYGnChAl1+02aNKm03XbblaqqqkoXXnjhEvNOnjy5VFVVVaqqqirdc889deMPPfRQ3fioUaMa7L///vvXjd1+++2lqqqq0ne+853SggUL6sZfe+210pAhQ0rbb799af78+UvMMWLEiNKQIUNKb7/9dr3x3//+96WqqqrS+eefv8Tb/+tf/ypVVVWVvv71r9f7XqNGjap7HIue96lTp5b69+9fOuSQQ0oLFy6sdz9HH310qaqqqvTQQw/VjZ1yyimlqqqq0rhx4+rGLrnkklJVVVXpz3/+c73bv/nmm6XNNtusNGzYsLqxb3/726WqqqrSa6+9VjdWXV1d+tKXvlTaeOONS++//36pVCqVnnnmmVK/fv1Khx56aGnu3Ll1+06fPr20++67lwYMGFB6991368Z33nnn0lZbbbXE52VJ+y56XPvuu29p9uzZdeP33HNPqaqqqnTMMcd8qsdbKpVKVVVVpS9+8YtNytaYm266qVRVVVX6whe+UKqpqVnivt/97ncb/A2VSqXSj3/841JVVVXprrvuKpVKpdKhhx5aqqqqKs2cObNUKpVKTz31VKmqqqp00kkn1bvdggULSl/4whdKVVVVpVdeeaVUKpVKV199damqqqp044031tv3Jz/5Samqqqp0//33F9pv7ty5paFDh5a23Xbbeq8HNTU1db8vDzzwQKlUKpXuu+++UlVVVelXv/pVvfu89NJLG/x9NqbIz27MmDGlqqqq0sYbb1x68skn68ZnzZpVGjp0aGmTTTap+10p8je3OBdeeGG9156mPn+Ls+hn/s9//rPe+DPPPFOqqqoqHXjggUu8falUqst+1lln1Y0tXLiwdNJJJ5WqqqpK119/fd34x3+n7rzzzlJVVVXp2GOPLVVXV9ftV+Q5OeSQQ0obb7xx6ZFHHqkbe/fdd0t77rlnqaqqqnTKKad8qse76LX7m9/8Zt3Y/PnzS1tuuWVpjz32KM2ZM6fefZx22mmlqqqq0p/+9KdSqVQqTZgwoVRVVVX63ve+V2+/O+64o1RVVVU6++yz68aOPvroUr9+/Rr8vK688spSVVVV6ec//3ndWGPvgQC0TE7/BKDJHn300fzmN79p9N8bb7zRpPs4+uijU1FRUff1jjvumCR1t3/mmWfy+uuvZ999901VVVXdfmuvvXa9o8iaok+fPtltt93qvt5yyy2TJB07dsxBBx1UN77WWmtljTXWqPcYbrzxxiTJD3/4w3pHcPTt2zcHHXRQ3nrrrTzyyCOL/d61tbU56aSTcs4552SNNdaot23RIuaftND+bbfdliR1R1gtcsghh9QdPbFIZWVlzjnnnPzwhz9M69at620bPHhwk77f8OHD85Of/CT77LNPvfFevXqlb9++9U4dXLQI97PPPls31rZt2/zhD3/I2LFj06lTpyQfPo+lUinf+9736q0vttpqq+Xoo4+uO/pvaTv88MOzyiqr1H294447plWrVvVOwyryeD+rRx55JKeeemratm2bM888M61aLX4KVl1dnXvuuSfrrrtujjzyyHrb/vu//zvHHHPMYi+Y0LNnz5x99tk5/vjj6423adMmW221VZL/+z1Y9DN8/vnnU1NTU7fviSeemIcffjg77bRTof3uu+++TJ8+Pd/4xjey1lpr1e3XqlWrnHTSSUlSd5TcovucMGFC5s+fX7fvV7/61TzwwAP56le/utjnJ/l0P7vBgwdn0KBBdV937tw5gwYNysKFCzN16tQkxf7mmqqpz9/ifPGLX8xZZ52V7bbbrt74Fltskfbt2zf5gh2dOnWqd6GZ1q1b53vf+14qKipy6623LvZ2i04VP+WUU+odUXfwwQc36Qqnb731Vh577LFsv/329Y7u7datW771rW812P+zPt6ampqcccYZ+dnPfpaOHTvW27boCNOP/w1MnDix3imcu+22W+69996cfPLJSZJp06blwQcfzI477tjg53XooYemV69edc8TACsXp38C0GQjR45s0tU/F6ddu3bp1atXvbFF5cuidbgWra+22WabNbj9olKsqdZZZ516Xy/6gNWzZ88GxVO7du3qrSH0/PPPp127drnmmmsa3O/EiROTfHhK0+I+ELdq1Sq77757kg8Lw5deeimvvfZa/vOf/2Ts2LFJ8olXhxs/fnxat27d6GmQgwYNyiuvvFL39WqrrZa99947tbW1efHFF/Pyyy9n8uTJmTBhQl3590nfb5NNNskmm2ySOXPm5JlnnsmkSZPy6quv5tlnn82kSZPqFQJf+cpXcu+99+bEE0/Mr371q2y//fbZYYcdMnTo0HplxKJ1ie6+++488MAD9b7foiLj42scLQ3rrrtuva/btm2bVVZZpd76UUUe72dx//335/jjj8/ChQtzzjnnZMCAAUvc/7XXXsvcuXMzcODABtv69OmTE088cbG37dmzZ/bdd98sXLgwzz//fCZOnJjXXnstL7zwQoPfgxEjRuS3v/1trrnmmtx+++0ZPnx4dthhh+y44471Srum7vfcc88l+fBn3tiac61bt677+95uu+3St2/f3Hvvvdluu+2y3XbbZYcddshOO+3U4DWiMZ/mZ/fx34nkw2It+XAduqTY31xTNfX5W5ytt946W2+9dWbMmJEXXnghr732WiZOnJinn3468+fPb/LvaVVVVd3r7SLdu3dPz549G13XcpHnnnsuXbt2zdprr11vvFWrVhk0aFDd6+HiLOk1/aMl5yKf9fF26NAhe+65Z5IPX6tffvnlvPbaa3nppZfyr3/9K8n//Q3069cvgwYNylNPPZVhw4ZlyJAh2WGHHbLzzjvXO7V13LhxKZVKmTFjRqO/223bts2UKVPy1ltvpUePHkvMB0DLolQDoNl8tGxZZNFRa6X/v4j5omLro0cZLbLqqqsW+n4fPTLqk3J83Pvvv5+FCxfmN7/5zWL3mTlz5hLvY8KECTnzzDPz6KOPJvnwg9cGG2yQzTbbLK+++mqDhds/btasWWnXrl2jax019lzcfffdOf/88/Pqq68m+bBE3GyzzdK/f/888sgjn/j95s+fn1/84he5/vrr6xZv79GjRwYPHpzVVlut3qLqO+64Y6666qpcdtlleeSRR3L11Vfn6quvTteuXTNy5MgcdthhST58HpPk97///WK/7yc9j59Gu3btPnGfIo/307rhhhty2mmnpaKiImeffXb23nvvT7zNoufj4wVIU/3pT3/Kb3/720ybNi3Jh2vQDRgwIBtssEGeeeaZut+DHj165MYbb8zvfve7jB49OrfeemtuvfXWtG3bNvvtt19+9KMfpbKyssn7LfpZLzraa0mPrUOHDvnzn/+c3/3ud7njjjty99135+67764ro3/6058ucU21T/Oza+rrT5G/uaZo6vO3ODNnzsz//u//5u9//3sWLFiQioqK9OnTJ0OHDi100ZSPHzG7yCqrrLLE3/X33ntvsUekLVqXbEmKvqYvjcf72GOP5X//93/rSv127dqlf//+2XTTTTNlypS6n3dFRUUuu+yyXHrppbn11lvz4IMP5sEHH8yZZ56Z7bbbLmeccUbWWmutusfw9NNP5+mnn17s950xY4ZSDWAlo1QDYLmyaEHnRR/QP6opV0xcWjp27JhVVlmlwdFVTTV79ux8/etfz/vvv59TTjkl2223XdZff/1UVlbmmWeeadJFF7p06ZLXXnstCxYsaLCQ+cefi2eeeSbHH398evbsmV/84hfZfPPN07dv31RUVOT3v//9Ek9VXeTss8/OtddemxEjRuSQQw5Jv3796oqNz3/+8w0+eA8ZMiRDhgzJ3Llz8/jjj+eBBx7IX//615x55plZe+21s+OOO6Zjx45p3bp1nnnmmSUuxl4ORR9vURdffHEuuOCCtGvXLhdccEHdBRI+yaLyYXFX+Zw7d26D09oWueOOO3LaaaelX79+Oe2007LpppvWHfl12mmn5Zlnnqm3f9++fXPWWWelpqYmzz33XB566KHcdNNNuf7669O5c+d897vfbfJ+izL98Y9//MSLeCQfnv73wx/+MP/zP/+TCRMm5KGHHsrNN9+cu+66K61atcovf/nLxd52Wf3sivzNFdHU57kx3/3ud/OPf/wjBx10UL70pS/VO+JsSadtftxHj8T9qGnTpi2xMOzUqVO9UyM/anHjH1X0Nf2zPt433ngjRx11VNq3b58zzjgjW221VdZdd920bt06t99+e72rsiYf/r0df/zxOf744zNx4sT885//zK233ppHHnkkJ554Ym644Ya63+1jjz22wanVAKzcrKkGwHJl0SlCTz75ZINti04vaw79+vXL1KlTG/1w/sADD+SCCy5Y4ilTY8aMyTvvvJNDDjkkX//619O/f/+6o1FefvnlJPnEI8c23XTT1NbWNihCkobPxW233Zba2tqcdtpp2WuvvbL22mvXHYWz6JS1j36/j65rt8jf//73rL766vnVr36VbbbZpq6k+OCDD/Lmm2/Wu48rr7yyrvTo2LFjdthhh5x66qk57bTTkiRPPPFEkg+fx5qamkZP8Xz66adz3nnn5fHHH1/i87CsFHm8RV111VW54IIL0qlTp1x++eVNLtSSZL311kvbtm3z73//u8G2t956K4MGDcqPf/zjRm+7qKw9//zzs9tuu9U7lfLjvwejR4/O6aefntmzZ6d169YZMGBARo4cWXfK86KfYVP369evX5LG/05nzJiRn/3sZ7n55puTfHgk0ZlnnpnXXnstFRUV6d+/f44++ui6AuOTfieW1c+uyN9cUzX1+WvMrFmz8o9//CObbbZZfvKTn2TLLbesK5hef/31zJ8/v8mPc/z48XWnuS7y8ssvZ9asWdl0000Xe7tNN900U6dOrTvy8aMae54+bpNNNklFRUWTXtOLPt7GXsfuvffefPDBBznuuONywAEHZIMNNqg73f/jr73jx4/Pz3/+87qjz9Zbb70ceuihufbaa7Puuuvm3//+d6qrq5f4u50kF154YX7/+9/XLWPQWC4AWialGgDLlc033zwbbrhhbr311nofwqZNm5bLL7+82XLsu+++KZVKOeOMM+o+KC3Kcdppp+X3v/99o6czLbLo9MOPL6r95ptv1p1SunDhwk/MUFFRkfPOO6/eESG33XZbgw93i77fO++8U2/8X//6V13R8tHvt+j0to9+yG7Xrl3mz59f74iWmpqa/OxnP8sHH3xQb/+HH344F198cYNToRZd7KF37951jyFJzjrrrHqPYfbs2Tn99NPzhz/8od4aSW3btv3E5+XT7NuYIo930ff7eCnRmOeffz4///nPU1lZmcsvvzxbb7114VwjRozIyy+/nD//+c/1tl188cVJstgjwRb3e/C3v/2t7jTkRc/ZK6+8kuuuuy7XXXddvX0//jNs6n677757OnXqlEsvvbTBOlvnnnturrrqqrz22mtJkrfffjtXX311g7/pd955J/Pnz0+fPn0afXwffZxFfnZNVeRvrqma+vw1pm3btmnVqlVmzZpV73Xogw8+yBlnnJGk6Y9zxowZufLKK+u+rq6uzjnnnJMk+fKXv7zY2+23334plUo555xz6v2t3nzzzfUuVLI4a665ZrbffvuMGTMmd911V9347NmzG5xeX/TxLu51LGn4NzB+/PhcddVVSf7vb6C6ujqXX355Lrroonpl3ezZszNz5sysueaaqaysTN++fTN48OA8+OCDufPOO+vd79/+9rf89re/zUMPPVT3HyeN5QKgZXL6JwDLlYqKipx11lk58sgjc8QRR2TEiBHp1KlT7rnnnsWe8rYs7Lfffrnvvvty1113ZcKECdl+++2zcOHC3HHHHZkxY0ZOOumkegtZf9xWW22VPn365Oabb857772X/v37Z8qUKRk9enTatWuXioqKzJgxY4kZBgwYkK9//eu57LLLss8++2SnnXbK1KlTc++992bttdeuKyiSZM8998wVV1yRn/zkJ3nsscey5pprZsKECXn44Yez2mqr5d133633/Rat+3P22Wdnu+22y8iRI7P33nvn8ssvz5e//OXstttuWbhwYR5++OFMnDgx3bp1y/Tp0zNjxox079493/72tzN27Ngcfvjh+dznPpcePXrkP//5T+6///5ssMEG+eIXv5gkGTp0aA477LBcffXV2WuvvbLjjjumsrIy9957b6ZMmZKDDjqo7mqoyYdrNL366qs5+eSTM3z48AZXd/yoIvs2psjjXfT9XnnllZx22mnZcccds8suuzR6v7/+9a+zcOHCbLrppnVrNH3c9ttv3+iFCBb53ve+lyeeeCI//vGPc/fdd2ejjTbKs88+m8ceeyy77bZb3ULsH/fFL34xt912W0aOHJm99tornTp1yrPPPptHH300q6++er3fgwMOOCB//vOfc9555+XRRx9Nv3798u677+bOO+9Mx44d81//9V+F9uvSpUvOPPPMnHzyydl3332z2267pXv37nnsscfy73//O5tvvnm+/vWvJ/nw6oqDBg3KddddlxdffDEDBw7M7Nmz60qX4447bqn+7JqqyN9cUzX1+WtMhw4dsvvuu+euu+7KV77ylQwbNixz587N/fffn3feeSerrrpq3n///dTW1i7xirLJhxe5uOCCC/LEE09knXXWyT//+c+8+OKL2WuvvfK5z31usbfba6+9cvPNN+fWW2/Nf/7zn2yzzTaZNGlSHnjggay22mp57733Glz45eNOPfXUHHTQQTnhhBOy2267pUePHrn//vsbZC76eFdbbbVUVlZm7Nix+d///d/svvvu2XnnnXP++efnkksuySuvvJK11147kyZNyv333193YYpFfwNbbLFFRowYkbvuuiv77rtvhg4dmoULF+bee+/Ne++9l5/97Gd12X7605/mkEMOyfHHH58ddtghG220USZOnJgHHnggXbt2rTtKN/m/19frrrsuM2fOzGGHHWatNYAWypFqACx3BgwYkOuuuy7Dhg3LAw88kNtuuy077bRTzjrrrGbLUFFRkQsvvDA//OEP06FDh9xwww254447suGGG+a3v/3tEj8IJx+eEnnFFVdkjz32yPPPP59Ro0Zl3Lhx+eIXv5hbbrkl/fv3z+OPP77YdbMW+d73vpczzzyzbmH3F198MWeeeWaDq45uvPHG+f3vf59NN9009957b/785z/nnXfeyXHHHZebb745rVq1yj/+8Y+6/b/61a9m2LBhee6553L11Vdnzpw5OfHEE/Ptb387rVq1yrXXXpt77703ffr0yWWXXZZjjjkmSeruY4sttsioUaMybNiwjBkzJldccUUmTJiQww8/PNdcc029AvRHP/pRzjnnnPTq1Su33HJL/vrXv2aNNdbIWWedVe+DaPLhekobbbRR7rzzzrpTBRenyL6NKfJ4kw+LgbXWWit/+ctfMnr06MXe76LT+Z5//vn85je/afTfkhY7Tz78UH7DDTfkwAMPzIQJE3LVVVflzTffzDe/+c1ccMEFi73dTjvtlAsuuCBrr712br311vz1r3/N/Pnzc+qpp+bSSy+t95hWXXXVjBo1KgcffHBeffXVXHnllXnggQeyww475M9//nP69+9faL/kw/XMRo0alaFDh+ahhx7KqFGjMnv27Bx77LH54x//WHd0Z2VlZS655JIcffTRmT59eq655prceeedGTBgQK6++uoMGzZsic9P0Z9dEU39m2uqIs9fY84666wcccQRef/99zNq1Kg89NBD2XzzzXPddddln332yQcffFB3ReEl6d+/fy666KK88cYbGTVqVObNm5eTTz4555577hJvV1FRkV//+tc55phjMnPmzFxzzTWZPHlyzjnnnAwdOjRJ0r59+yXeR9++fXP99ddnzz33zGOPPZa//OUv2WSTTfK73/3uMz3eysrKnHrqqVl11VVz7bXXZsyYMenRo0euuOKKDB06NGPGjMm1116biRMn5rDDDssdd9yRrl275qGHHqo7Mu2cc87JSSedlJqamlx//fW56aab0rdv3/zud7/L/vvvX5dr/fXXz0033ZQDDjig7m9ywoQJ+dKXvpQbb7wxG264Yd2+gwcPziGHHFL3fC067RSAlqei9GkXCwEAAFq0KVOmpHPnzo1e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ZXgEAAA0xjwPAGjpylqqjR8/PnPmzMm2225bN9alS5dssskmeeyxxxrs/89//jOdO3fODjvsUG//++67r959AABQXuZ5AEBLV9ZSberUqUmSXr161Rvv3r173baPmjhxYvr27Zu77747++23X4YNG5ajjz46L7/8crPkBQCgaczzAICWrqyl2rx585IklZWV9cbbtWuX+fPnN9h/9uzZmTRpUi666KJ85zvfye9+97u0adMmX/3qV/Puu+82S2YAAD6ZeR4A0NKVtVRr3759kjRYrHb+/Pnp0KFDg/3btGmT2bNn54ILLsjw4cOzxRZb5IILLkiS/PWvf132gQEAaBLzPACgpStrqbbodIBp06bVG582bVp69OjRYP+ePXumTZs22WCDDerG2rdvn759++b1119ftmEBAGgy8zwAoKUra6nWv3//dOrUKWPHjq0bmzVrVsaNG5fBgwc32H/w4MFZuHBhnn322bqxDz74IJMnT84666zTLJkBAPhk5nkAQEvXppzfvLKyMoceemjOO++8dOvWLX369Mm5556bnj17Zo899khNTU2mT5+ezp07p3379tl6662z3Xbb5ZRTTslPf/rTdO3aNRdeeGFat26dL33pS+V8KAAAfIR5HgDQ0pX1SLUkOe6447L//vvnRz/6UQ4++OC0bt06l112Wdq2bZspU6Zk+PDhuf322+v2//Wvf50hQ4Zk5MiR2X///TN79uxcddVV6datWxkfBQAAH2eeBwC0ZBWlUqn0aW5YW1ubF198MdOmTcuWW26ZhQsXpmvXrks53rK36667JklGjx5d5iQAwIqkJc8hzPMAgJVZU+cQn+r0z5tvvjnnn39+pk2bllatWuWGG27Ir3/967Rt2zbnn39+g0unA1A+E9+cmdv+OTFvTZ+bqrVXyxeGrZfVurQvdyxgOWWex4rk/bnVuf2fE/P8K+9mtS7t8/nt1k3/dRzZCEDzKHz65+23355TTjklQ4cOzQUXXJDa2tokye67755//OMfueiii5Z6SAA+nSfHT8t3fvlg7hozKU+/+Hb+fO+LOeGCf2Tae3PLHQ1YDpnnsSKZNac6J//qwYy6c3yeevHt3Pf45Jzy64fywJOuFgtA8yhcql188cU56KCDcs4552SPPfaoG//yl7+cb3/727ntttuWakAAPr0r/v58FtbU1hubPuuD/OW+l8qUCFiemeexIrntnxPz5jtz6o3VlpI//v351HzsvQ8AloXCpdrEiROz++67N7ptwIABeeuttz5zKAA+u/fnVufVKbMa3fbcK+82cxpgRWCex4rkuZffaXT83ZkfNCjbAGBZKFyqrb766nn55Zcb3fbyyy9n9dVX/8yhAPjs2le2TvvK1o1u69qpXTOnAVYE5nmsSLp2bvy9rFWrinRZxdp/ACx7hUu1PffcMxdeeGHuvPPOVFdXJ0kqKiry3HPP5aKLLsrnPve5pR4SgOLatmmd3bdZp9Fte263XjOnAVYE5nmsSD637bqpqGg4PmyL3lnVfx4B0AwKX/3zhBNOyIsvvpgTTjghrVp92MkddthhmTt3brbeeuscf/zxSz0kAJ/O176wST6YvzD3PzE5C2tKWaVD2xy4W1WGDehd7mjAcsg8jxXJ5huskeMOGJgrb3shM2bPT6uKZNstemfkVwaUOxoAK4nCpVplZWUuvfTS/POf/8yYMWMyY8aMdO7cOUOGDMmOO+6Yisb+uwiAsmjbpnWOO3BQjvzCpnl35rz0XrNT2rVt/JRQAPM8VjS7DVknO27ZN2+8PTurdqrMap3blzsSACuRwqXaN77xjRx11FEZNmxYhg0btiwyAbCUdVml0voywCcyz2NF1LZNq6zbq0u5YwCwEiq8ptqTTz7pfykBAFog8zwAgKYrXKptv/32ueWWW7JgwYJlkQcAgDIxzwMAaLrCp3+2a9cut9xyS+64445ssMEG6dixY73tFRUVufLKK5daQAAAmod5HgBA0xUu1aZOnZpBgwbVfV0qlept//jXAACsGMzzAACarnCpdvXVVy+LHAAAlJl5HgBA0xVeUw0AAAAAVnaFj1TbZZddPvGqUKNHj/7UgQAAKA/zPACApitcqg0ZMqTBZGvOnDl59tlnM3/+/BxxxBFLLRwAAM3HPA8AoOkKl2pnn312o+MLFizIsccem3nz5n3mUAAAND/zPACApltqa6q1bds2hx9+eG688caldZcAACwHzPMAABpaqhcqmDlzZubMmbM07xIAgOWAeR4AQH2FT//829/+1mCspqYmU6dOzahRo7L11lsvjVwAADQz8zwAgKYrXKp9//vfX+y2QYMG5Uc/+tFnCgQAQHmY5wEANF3hUq2xy6hXVFSkU6dO6dKly1IJBQBA8zPPAwBousJrqv31r39NmzZt0qdPn7p/vXv3TpcuXfL666/npz/96bLICQDAMmaeBwDQdIVLtd/+9rd56623Gt32zDPP5IYbbvjMoQAAaH7meQAATdek0z8POuigPPPMM0mSUqmUAw88cLH7br755ksnGQANPPfyO/nnM28mFcnwAX2y6fqrlzsSsIIzz4PklTdm5v4nJmd+dU223qRHBm/cIxUVFeWOBcByrkml2plnnpk777wzpVIpv/3tb/PlL385PXv2rLdPq1at0qVLl+yxxx7LJCjAyu7K28blxvteqvv67w9PzFd23SiH77lJGVMBKzrzPFZ2dzwyMb+76d8plf7/1/96NTsM6pOTD9lKsQbAEjWpVNtwww0zcuTIJB8uVvuVr3wlPXr0WKbBAPg/k996v16htsiN972UXbbum7W6dy5DKqAlMM9jZTZ73oJcesvzdYXaIg8+9UZ23XrtbNm/e3mCAbBCKHz1z0WTrnfffTfV1dUp/f93oNra2sybNy+PP/54Dj744KWbEmAl98T4aY2Ol0ofblOqAUuDeR4rm2f/806qF9Q0uu2xF6Yq1QBYosKl2vjx43PyySfn5ZdfbnR7RUWFyRbAUtah3eJfrpe0DaAI8zxWNh2X8B7asX3bZkwCwIqo8NU/zznnnMycOTOnnHJKhgwZkuHDh+fHP/5xdtxxx1RUVOSqq65aFjkBVmrDtuiVDu1aNxjv0K5NttuidxkSAS2ReR4rm802XCPdu3VsMN6qVUV23mqtMiQCYEVSuFR75plncvzxx+fII4/MnnvumXnz5uWrX/1qLr744uy22265+uqrl0VOgJVap46V+Z8jh6Rrp3Z1Y107t8sPjxySTh38TzqwdJjnsbJp3aoiP/rakPRc/f+KtY7t2+SEgwZZWgGAT1T4nKHq6uqsu+66SZJ1110348ePr9u233775bTTTltq4QD4PwOruufyH++R5195J0my6fprpG2bwv83ArBY5nmsjNbrvWou+f5uGTfx3XxQXZPN1l897S2tAEATFP401rt370yePDnJh5Ot2bNn5/XXX0+SVFZWZubMmUs3IQB12rZplYFV3TOwqrtCDVjqzPNYWbVqVZHNNlgjW2/cQ6EGQJMV/kS2xx575Pzzz89dd92VHj16ZP31188vf/nLTJgwIZdffnn69u27LHICALCMmecBADRd4VJt5MiR2XLLLXPjjTcmSX7wgx/knnvuyT777JMxY8bk29/+9lIPCQDAsmeeBwDQdJ9qTbULL7wwCxYsSJJsv/32+fvf/57nnnsum266adZee+2lHhIAgGXPPA8AoOkKH6m255575vbbb0/btv93tbm+ffvm85//vIkWAMAKzDwPAKDpCpdq1dXVWW211ZZFFgAAysg8DwCg6Qqf/nn44Yfnl7/8Zdq3b5/+/funQ4cOyyIXAADNzDwPAKDpCpdqN998c95888189atfbXR7RUVFxo0b95mDAQDQvMzzAACarnCp9sUvfnFZ5AAAoMzM8wAAmq5wqTZy5MhlkQMAgDIzzwMAaLrCpdoi//jHP/LII4/k7bffzoknnpgXXnghm266afr06bM08wEA0MzM8wAAPlnhUm3evHn51re+lUceeSSdOnXKnDlz8o1vfCPXXXddxo0bl1GjRmWjjTZaFlkBAFiGzPMAAJquVdEb/OIXv8jzzz+fP/7xjxkzZkxKpVKS5Oc//3l69OiRX/3qV0s9JAAAy555HgBA0xUu1e6444585zvfydChQ1NRUVE33r1793zzm9/ME088sVQDAgDQPMzzAACarnCpNmvWrMWup7Hqqqtm7ty5nzkUAADNzzwPAKDpCpdqG220UW699dZGt913333W2QAAWEGZ5wEANF3hCxV885vfzMiRIzNjxozsvPPOqaioyGOPPZabbropf/rTn3L++ecvi5wAACxj5nkAAE1XUVq0Am0Bt956a84///xMnTq1bmz11VfPCSeckK985StLNeCytuuuuyZJRo8eXeYk0LK9Pu39jHluatq0bpVhW/TOmqt1KHckgM+kpc4hzPNYGU15Z07+9eybqaioyHZb9E6Pbh3LHQmAMmrqHKLwkWpJsvfee2fvvffOK6+8khkzZqRLly5Zf/3106pV4bNJgZXADaNfzNV3vJBFFf4f//58jjtwUHbZum95gwHQgHkeK5tbHnw5l97y3P/NU24bl2/ut0U+t+26Zc0FwPLvU5VqSTJx4sQ8/vjjmTFjRlZfffV06NBhsQvbAiuvSVNn5arbX6g3VlNbym9veDpbb9wjXVapLFMyABbHPI+VxdR35+SyjxRqSVJbW8rFN/07QzbtmW5d2pcvHADLvcKlWnV1db7//e/njjvuyEfPHG3VqlUOPPDAnHrqqfUuwQ6s3P717JRG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Lrroolx77bU544wz8qc//Sm1tbU56qijUl1d3ej+xx13XCZNmpQ//vGP+dWvfpV//OMfOf3005s3NEAZvfH27NzxyMT8899vZsHCmnLHAVgs8zw+jZmz5+eesZMy+rHXMntu478rALA8aFPOb15dXZ3LL788J598cnbaaackyQUXXJDtt98+d999d77whS/U2/+pp57Ko48+mttvvz0bbLBBkuSnP/1pjjrqqHznO99Jjx49mvshADSrP9z8bG596JWUSh9+3a1L+5x+9NCs13vV8gYD+BjzPD6Nex99LRf95ZksWFibJKls2zrfOXjLDBvQu8zJAKChsh6pNn78+MyZMyfbbrtt3ViXLl2yySab5LHHHmuw/+OPP54111yzbqKVJEOGDElFRUWeeOKJZskMUC5jnpuSWx78v0ItSabP+iDnX+P1D1j+mOdR1Nvvzctvbni6rlBLkuoFNfnFdU9m1hxHrAGw/ClrqTZ16tQkSa9eveqNd+/evW7bR7311lsN9q2srEzXrl0zZcqUZRcUYDnw0FNvNDo+aer7mTRlVjOnAVgy8zyK+ue/30xNbanBePWCmox9zu8AAMufspZqixaeraysrDferl27zJ8/v9H9P77vkvYHaElqSg0/aNRta+RDCEA5medRVO0S3su8zwGwPCprqda+ffskabBY7fz589OhQ4dG929sYdv58+enY8eOyyYkwHJiu817NTrea/VVsl7vLs2cBmDJzPMoaujmPVNR0XC8TeuKDNm0Z/MHAoBPUNZSbdEh/tOmTas3Pm3atEYXo+3Zs2eDfaurqzNjxox079592QUFWA4MH9AnOwzqU2+sY/s2Of6gQalo7FMIQBmZ51FU7zU65ci9Nq1XrLWqSP573y3SrUv78gUDgMUo69U/+/fvn06dOmXs2LFZe+21kySzZs3KuHHjcuihhzbYf/DgwTnvvPMyadKkrLPOOkmSRx99NEmy1VZbNV9wgDJo1aoi3z106+w1bL0889I7WbVTZXYY2CedOjY8XQqg3Mzz+DT223nDDN2sZ/757zfTulVFhg3okx7dHKkIwPKprKVaZWVlDj300Jx33nnp1q1b+vTpk3PPPTc9e/bMHnvskZqamkyfPj2dO3dO+/btM2DAgGy55ZY58cQTc/rpp2fu3Lk59dRTs88++7jMOrDS2GS91bPJequXOwbAEpnn8Wn1XrNTvrJrVbljAMAnKuvpn0ly3HHHZf/998+PfvSjHHzwwWndunUuu+yytG3bNlOmTMnw4cNz++23J0kqKirym9/8JmuttVaOOOKInHDCCdlhhx1y+umnl/dBAADQgHkeANCSVZRKS7ic3Epg1113TZKMHj26zEkAgBWJOcTyz88IAPg0mjqHKPuRagAAAACwolGqAQAAAEBBSjUAAAAAKEipBgAAAAAFKdUAAAAAoCClGgAAAAAUpFQDAAAAgIKUagAAAABQkFINAAAAAApSqgEAAABAQUo1AAAAAChIqQYAAAAABSnVAAAAAKAgpRoAAAAAFKRUAwAAAICClGoAAAAAUFCbcgcot2nTpqWmpia77rpruaMAACuQKVOmpHXr1uWOwRKY5wEAn0ZT53kr/ZFq7dq1S5s2K323CAAU1KZNm7Rr167cMVgC8zwA4NNo6jyvolQqlZohDwAAAAC0GCv9kWoAAAAAUJRSDQAAAAAKUqoBAAAAQEFKNQAAAAAoSKkGAAAAAAUp1QAAAACgIKUaAAAAABSkVAMAAACAgpRqAAAAAFCQUg0AAAAAClKqAQAAAEBBSjUAAAAAKEipBgAAAAAFKdWAlVZtbW25IwAAAMtYqVQqdwRaKKUasNKpqalJkrRq9eFL4JgxY1JdXV3OSADAp7TofR3g4xa9PlRUVJQ5CS2VUg1YqZRKpbRu3TpJ8tJLL+WKK67IkUcemfHjx5c5GQDQVLW1tSmVSqmtra17X3/nnXf8JxlQz6LXh7vvvjvXXHNN/vWvf2X27NllTkVL0qbcAQCaU0VFRV566aWcfPLJ+eCDD7LmmmsmSa6//vpsuOGG6dixY5kTAgCNmTp1aq677rocc8wx6dChQ5IP39cnTJiQM888M/PmzcvChQtz4IEHZtddd0337t1TW1tbd2Q60HKNHz8+jz76aA466KBUVlbWjb/00ks55ZRT8t5772X11VfPq6++mo033jjnn39+unfvXsbEtBTeYYAW7ePrJ9TW1uY3v/lN1ltvvdx444354Q9/mB/+8Ie56aabMmbMmDKlBAA+yd13352//OUvuf7665N8+B5///3359hjj02/fv3yjW98IxtttFEuueSSnH322UmiUIOVxJgxY3LWWWflhRdeqBtbuHBhrrzyyvTr1y+33nprfv/73+fSSy/NCy+8kAsuuCAzZswoX2BaDO8yQIu0uPUTXnzxxTzwwAM58MAD07lz52y88cY57LDDMmLEiPz2t/+PvfuOz/ne/z/+vLJDEgRJ7C2xxQgxahUdiqM6OFTVqFbNVnGOb6vqqBZVozrpUEqXUUVp1Ci190jVKEEiISEyZF3X7w+/XEdOQvMhySfjcb/derudvD+f68rz4sj1yvP6jPcVHR1tRlwAAJAFm81m/4CsW7duCg4O1rp163Tu3DlZLBb99NNPCgwM1KRJk/Twww9rxowZ6tu3rw4ePKi1a9fanwNA4da/f3/Vr19fH374of30zr/++ksrV67Ugw8+KA8PD3l7e6tx48b6v//7P/344486f/68yalRGFCqAShU0ofv9Osn7NixQytXrtTly5clSV5eXnJzc7Pf+TP92itjx45VaGioNmzYoNTUVHPCAwAASVJYWJikWx+OWSwWWa1WeXt7q0uXLkpJSbEfrbZt2zYFBQVJ+u97epcuXVS5cmX9/PPPslqtXKAcKGSioqLs87rVarVfW3HMmDH69ddf9dtvv0mSrl27Jh8fHzk5Odn3tdls6tGjh0qXLq2tW7dKonjH/aFUA1CghYaGKiQkxP51+vB9+fJl/fOf/9SoUaM0ffp0vfDCC9q6davc3NxUqVIlbdiwQcnJyfZrLiQnJ8tisWjZsmW6ePGiWS8HAIAib+rUqercubOmTp2q3bt3S/rvaZwdOnRQkyZNtHXrVu3YsUMNGzbUtm3bMuxTtWpVeXp6Kj4+nkINKESSkpI0YcIEPfTQQ5oxY4YuXLggBwcH+7/91q1bq0uXLnr//fcVGxur6tWrKy4uTvv27VNsbKwcHBxksVgUFRUlFxcXpaSkSOLOoLg/lGoACrTPPvtMhw8ftn+dnJysLVu26LPPPlONGjW0ceNGzZkzRx4eHlq4cKE8PDzUvn177d+/X6tWrbI/7s8//1SbNm0UFhamH3/8URKfWgEAYIbHHntMkvTNN99o6NChmjBhgkJDQ5WcnCwnJyc99NBDKlGihJYuXaqgoCDt3r1b+/fvl5OTk2w2m1JSUhQfH6/KlSvzyzJQiNhsNlWpUkVJSUn64osv9Nxzz+n111/X0aNH7fuMHj1a586d09KlS+Xt7a0+ffpo+fLl+vXXX+37nDx5Um5ubnr44YfNeBkoZCw2fmsEUMBs2LBB+/bt08SJEzPd1euXX37R66+/LqvVqtmzZ6tly5aSpO+//16fffaZnnrqKfXu3VvTpk3Td999pw4dOsjV1VWbNm3S22+/rTNnzmjFihXauHGjWS8PAIAib8SIEbp69aqqVKmiU6dOKTQ0VK1bt9bYsWNVu3ZtffLJJwoJCVFgYKAiIyO1f/9+jRkzRrVr19aaNWu0bt06zZo1S40bNzb7pQDIQadPn9Y777yj0NBQjR8/XtOmTVN8fLyefPJJde/eXfXq1dP8+fP1+eefa8WKFapUqZIGDx6so0ePqnbt2vL29tamTZs0cOBAjRw50n70GnCvOFINQIGzdetWbdq0Sb///rscHBwUFhamJ554QkePHtWDDz6oLl26KDExUUlJSfbHdOnSRQ0aNNCKFSsUFRWlN998U9OmTVOVKlXk4OCgxYsX66GHHtL169dVuXJlJSUl2a+7BgAA8takSZMUERGhevXqacmSJZo0aZLOnj2rp556Sq+++qo8PDxUunRpHT9+XIMGDVLt2rX17rvvasSIEdqyZYtmzpxJoQYUQtWqVVO3bt10+fJllS1b1l6QhYSEqE+fPnr99dfVvn17ubq66osvvpAkzZw5U5MmTVLjxo3l5eWlb775RmPGjJGjoyOFGu4bR6oBKDBSU1Pl5OSk0NBQTZs2TZ6enpo/f75sNptatWql4OBgzZ49W6GhoRo3bpwaNmyoSZMmyd3dXZK0ZcsWffDBB6pWrZreeust2Ww2+620S5UqpV27dmnq1Kl6+umn9c9//tPEVwoAAGbPnq0dO3Zo8uTJqlevnq5fv64tW7bo/fffV3x8vK5fv64SJUpo1KhReuKJJxQTE6OIiAjVqVPH7OgAclFUVJQmT56c4drKsbGx+uyzz7R69WolJycrOjpa3t7emjFjhv3Mldulf3h++xkvwL3g/0EACgSr1Wq/c09AQICCgoIUHh6uH374QQ4ODpoyZYrWr1+vX3/9VQEBAerYsaOOHj2a4SYG7dq1U+3atXX8+HFduHBBN27c0HfffadOnTrp2Wef1fPPP6+OHTtSqAEAkA+8+OKLunz5stavX68bN26oRIkS6t69uxYvXqzx48erZs2aunLlir744gtFR0erVKlSFGpAEVC2bFn169dP0dHR+uSTTyRJXl5eGjVqlNasWaOBAweqevXqioqK0rJlyzKcvSLJfvkYCjXkBI5UA1CgfPnll1qzZo1KlCih7du3q3Hjxpo/f768vb01cOBAxcbG6uuvv9b169c1cuRI+fj46F//+pd8fX0lSZcuXZKnp6c8PT0l3fqka+/evYqJiVGXLl1UpkwZM18eAAC4zdq1azVv3jxNmDBB7dq1y7AtJSVFmzZtUqNGjeTn52dSQgB5yWazyWKxKC4uTu+//76WLl2qHTt2qHjx4kpOTpaLi4skKSIiQnv27NEDDzygEiVKmJwahRnVLIAC49tvv9Xnn3+up59+Ws8995x69eqlsLAwLV68WJI0btw4hYaGavny5Spbtqx69eqlw4cP6/vvv7c/R/ny5eXp6anU1FTZbDaVLVtWDz/8sPr27UuhBgBAPvPwww/L3d1dP//8syIjIyVJaWlpstlscnZ2VteuXSnUgALOZrMpu8f6pF8DzcPDQ927d1eZMmU0depUSZKjo6N9Pz8/Pz322GMqUaIE10lGrqJUA5DvpKamZrkeEhKiJk2aqFevXgoODtbUqVP16KOPauvWrTp27Jjq1q2rJ554Qp999pnCw8P1j3/8Q0FBQVleqNjJyYkLkwIAkM9ZLBZNmzZNW7dutd+Zm4uLA4VHamqqLBZLpn/T2SnCatSooeeee04rVqzQ0aNHM5Rq6Ww2G6d5Ilfx/y4A+U76tdMOHDigixcvSpKio6MVFRWlypUrZ9i3c+fOstlsWrZsmSRp1KhRunTpkhYuXCgnJye9/fbbatWqVd6+AAAAkGMCAgLUpEkT+2ldAAqP9Ll/wYIFmj59uj788ENJ2buBgIuLi9q0aaMmTZooNDQ0y30o4JHbuKYagHwh/YKhkrR69WpNnz5dTk5OslqtmjZtmh544AG9+OKLiomJ0fz581W6dGn7Yx9//HFdvnxZkydP1oMPPqjNmzerTp069uuo3f7cAACg4ElLS8vyKBQABdvmzZs1adIk+fr6qly5crpy5YreeOMN+fv7Z/s5br+WGpDXKNUA5BtnzpyR1WrV5MmT1aNHD1WrVk3vv/++/vrrLy1atEgJCQl6/PHHNXHiRPXp00cuLi6KiorSmDFjFBcXp8DAQL322mv2T6Qo0wAAAADzpdcOtx85ZrPZ9Morr6hChQoaO3asJOn69esqUaKE/YYEUvZmeqvVmuVppEBuo1QDYIr0N8f0N8yUlBR16tRJsbGx6t69u6ZMmSLp1nUWmjVrpt69e2vSpEmaMWOGVq1apVq1aqlbt25auXKlPD09NWLECNWpU8fkVwUAAAAgNTVVTk5O9huLpJ/mebtTp05p4MCBevHFF9WxY0etWbNGFy9e1MmTJ1WxYkWNHj3afiOSs2fPytnZWRUrVuTIVeQrHMIBIE+lpaVJ+u91EtI/TXJ2dtbrr7+umzdvysfHR5Lsb8CjRo3SN998o71792rcuHEaP368ihUrplWrVqlixYqaPXu2vVBLf34AAAAAeW/RokWaMmWKvfxKL9SWLFmiDz74QN99950SExNVs2ZN1a5dWx9++KHatWunVatW6eLFi6pVq5bWrl2rFStWSJJCQ0M1fPhwjRkzRpIo1JCvcKQaAFP88ssvWrdunYoXL65atWrpscceU8mSJTVw4EDduHFDH330UYbrpnXt2lU1atTQlClTVKZMGUlSfHy8ihcvLolrrQAAAAD5Qfv27dW1a1dNnDhRkrRnzx69+uqrKlWqlCpUqKCjR4+qTJkymjx5smrVqqUjR47I2dlZZcuWVbFixVSiRAk988wzqly5sqZOnWp/3gkTJqh///6qV6+eWS8NyIQj1QDkqYSEBL3yyiv697//rYoVKyolJUUrVqzQCy+8IEkaN26cTpw4oY0bN8pms9mvv/Cvf/1LmzZt0qFDhyTdOoqtePHistlsslqtFGoAAACAya5duyYHBwdVrVrVvvb999+rQ4cO+uGHHzRv3jzNmDFDR44c0dq1a2Wz2VS3bl1Jkqurq0qUKKH169crOjpajz76qKRbc//Vq1dVqVIl++mgQH6R+cRmAMghWR09dvz4cZ09e1bffPONqlSposTERL300kvavn27Tpw4obp166p37976+OOP1bp1a1WqVEk2m03t2rXTvHnz1KlTJ0n/PW2UC5ICAAAAeS/9ummS7NdJdnd3V3Jysv1SL6dOndLPP/+skJAQJScn69///rc2bdqk5557Tv369VNsbKxSU1M1btw4OTs7y8PDQ3/88YdGjBih4OBgSbfm/dKlS2v48OGmvVbgTjhSDUCOs1qtstls9kLtxo0b9m379++Xt7e3qlSpoi+++EIdOnSQzWbT999/r+TkZEnSqFGjlJCQoEWLFiklJcVemnXu3FnSf+8eBAAAACDvrV27Vg888IDmzZun8+fP2+f1iIgIpaamqlKlSpJuXf+sQoUK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YcI11YBCwmq1ymazZSi70j853Lp1qzw8POTv76+zZ89q69atioyM1MWLFzVw4EDVr1/f/rjTp0+rRo0ad/zUkbt6AgAAQJK+/fZbnT592uwYAGAafjsGCqi4uDj95z//0YEDByTdKrscHR117do1LVmyRNu3b9cff/whSWrYsKGOHDmi7t27q0ePHlq3bp327NmjP//8U+PGjdO1a9dktVq1YMEC9e7dW3v37pXFYrEflQYAAAAAADKiVAMKqG3btmnx4sWqXbu2fe3jjz9Wp06dtGbNGk2bNk3//Oc/9cMPP+jhhx/Wxx9/rKFDh+rzzz/X66+/rm+++UYzZ87U+fPnFRMTIwcHB/Xu3VtTpkzRL7/8Iomj0gAAAAqDo0ePasCAAWratKkCAwP17LPP6uDBg/bt27dvV9++fdW0aVO1aNFCL7/8ssLDw+3bf/jhB9WtW1fffvutWrduraCgII0aNUorVqzQxYsX5e/vrx9++MFQppSUFE2dOlXNmzdXs2bNNH78eEVHR0uSNm/eLH9/f/32228ZHrN37175+/tr37592f4+SUlJeuutt9S6dWsFBgZq4sSJSkpKyrTf3f4MQkJC5O/vr+PHj9v3X7lypfz9/fXtt9/a106cOCF/f38dOHDA/md26NAhPfXUU2rQoIE6dOighQsX3jXvkSNHNGjQILVo0UJNmjTRsGHD9Oeff2bYJzQ0VC+99JJatmypevXqqW3btpo6dapu3rxp6HVHR0fr5ZdfVuvWrdWgQQP16NFDK1euzPafLQBKNaDAioyMVKVKlZSSkiLp1rC0Zs0avf322/r666/1008/qUqVKnr33Xd18OBBNW/eXA8++KACAgJUp04dSdI333yjhx56SBUqVJAk+fj4yGq1qk6dOhylBgAAUAjExcVp8ODBKlWqlObNm6fZs2crMTFRgwYN0o0bN7Ry5Uo999xzKleunN59911NnDhRBw4c0FNPPaWrV6/anyctLU2LFi3Sf/7zH02cOFEvv/yy2rVrp7Jly2r58uVq3769oVzr1q3TsWPHNH36dI0fP16bN2/WkCFDlJaWprZt28rHx0erVq3K8JiVK1eqatWqatq0aba/z7hx4/TNN9/o+eef13vvvafr16/r888/z/S8d/szCA4OlouLi3bs2GF/zM6dOyXdKvrSbd26Vd7e3mrUqJGkW5dn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", + "text/plain": [ + "
    " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df = pd.DataFrame(results4, columns = ['size', 'sort_by_downloads', 'missing_values', 'classification_type'])\n", + "df['temperature'] = range_of_temps\n", + "plot_yes_no(df, title = query)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice how some things changed? At higher temperatures, we get extended answers." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In conclusion, we can see that we should probably stick to lower temperatures for our use case. As we go higher, the model starts being more \"creative\" and either adds extra information to the answers or gets them wrong. While this behaviour might be useful in cases like creative writing, it is not something we want in our search.\n", + "\n", + "Using LLMs can sometimes be a bit of a hit or miss. But of course, learning to control it's parameters can help us get the most out of it. This blog post was just a simple experiment, but in the deluge of content made by people who have no idea what Softmax is, I hope this was helpful." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "openml", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/blog/posts/Experiments-with-temperature/search.png b/blog/posts/Experiments-with-temperature/search.png new file mode 100644 index 0000000..89193ec Binary files /dev/null and b/blog/posts/Experiments-with-temperature/search.png differ diff --git a/blog/posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.qmd b/blog/posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.qmd new file mode 100644 index 0000000..8771e72 --- /dev/null +++ b/blog/posts/OpenML-Hacktoberfest/2020-10-23-OpenML-Hacktoberfest.qmd @@ -0,0 +1,110 @@ +--- +toc: true +layout: post +description: Join us at the 2020 Fall Workshop on gather.town! +categories: [OpenML, Hacktoberfest, Workshop] +title: Participate in the OpenML Hacktoberfest Workshop! +image: hackathon.png +author: Pieter Gijsbers, Prabhant Singh +date : 2020-10-23 +--- + +Twice a year the [OpenML](https://www.openml.org/) community organizes an OpenML workshop. +Next week we will kick off our fall workshop, which will be hosted virtually and is open to everyone! +At the workshop we work on the development and maintenance of the OpenML platform (website, APIs and extensions), +but also encourage discussions on a broad range of topics, from using the platform to building the platform to building the community. +If you are already sure you want to join, please [register](https://docs.google.com/forms/d/e/1FAIpQLSedDOBZzuQP9dACFWiPqXcl1HvURB9h3SOdwPq45PB-87TPyg/viewform) and we will see you next week! + +The workshops are the perfect time to get involved with the OpenML community. +We welcome first time contributors to the project. You can contribute in many ways, such as giving feedback, cleaning data, or helping with design, planning, or content. +If you are looking to contribute to the software projects, we are there to help you get started on beginner issues. +Even better, the workshop coincides with [Hacktoberfest](https://hacktoberfest.digitalocean.com/), +which means you can earn a shirt through your open source software contributions! +To get an even better idea of what happens at an OpenML workshop, read the [write-up of last year's fall workshop](https://openml.github.io/blog/openml/2019/10/24/OpenML-workshop-at-Dagstuhl.html) +and look at [the workshop agenda](https://docs.google.com/document/d/1-cjXSqjbce0Gq5zydkp-RNQQmxmcSW4WQ0fWTHUwU9E/edit#). + +In this blog post we will go over the basics on how you can participate in the workshop. +This includes pointers to our code repositories, the platform we will use ([gather.town](https://gather.town/)), and participating in Hacktoberfest. + +## Overview + +**Where?** [openml at gather.town](https://gather.town/app/c5wA3zo8WPkg579u/openml) +**When?** 26th through 30th of October 2020, 09.00-17.00 CET. +**What?** Discussions about OpenML, contributing to any OpenML project, or experimenting with OpenML. + +Please [register](https://docs.google.com/forms/d/e/1FAIpQLSedDOBZzuQP9dACFWiPqXcl1HvURB9h3SOdwPq45PB-87TPyg/viewform) if you plan to join. +It is not required to attend the workshop in full. +You are free to join only for a day or specific discussions. +However, it is helpful to indicate which meetings you want to attend, so we know who to expect. + +The [workshop agenda](https://docs.google.com/document/d/1-cjXSqjbce0Gq5zydkp-RNQQmxmcSW4WQ0fWTHUwU9E/edit#) is public. +If you see a meeting which you would like to join, just add your name to the list. +Feel free to propose a new meeting by adding a proposal to the meeting list! + + +## Gather Town +This fall, we will host the OpenML Hackathon at our [gather.town space](https://gather.town/app/c5wA3zo8WPkg579u/openml). +Gather.town is a web-based platform that allows you to video conference with other people, but with a twist. +Rather than the conventional conference call, in gather.town you control an avatar that can navigate a virtual world. +You will automatically be connected to anyone that is within the vicinity of your avatar. +This means you can more organically join groups of people, or walk from one meeting room to the next. +Here is a preview of our OpenML map: +![](gathertown-openml.png) + +At a glance you see two types of areas: those marked with purple and those that are not marked. +Areas that are not marked (e.g. the main lobby) function exactly as described above. +However, whenever you are in a purple area you will automatically be connected to everyone else in the same purple area. +So whenever you are interested in joining people discussing the [new openml website](https://new.openml.org/), you just head over to that room! + +## Breakout Sessions +In the [workshop agenda](https://docs.google.com/document/d/1-cjXSqjbce0Gq5zydkp-RNQQmxmcSW4WQ0fWTHUwU9E/edit#) you will find various breakout sessions. +These cover a wide range of topics, and we will briefly cover a few of them to give you an impression. + +1. The **Dataset Quality** break-out session discusses what quality standards we want to uphold for datasets on OpenML. +Ideally, we would like all our datasets perfectly annotated with a description of how the data was collected, what each features means, and what the feature types are. +In reality, datasets are collected from different sources and often uploaded by someone other than the original creator. +This leads to issues such as incomplete data, badly annotated columns, or multiple uploads of the same data.How can we ensure that despite these practical issues, it remains easy to find datasets of interest on OpenML? +How can we improve the dataset quality of datasets uploaded to OpenML? +How can we set these new standards and guidelines in a maintainable way? +How can we automate annotation of attribute types to the dataset? +How can we detect corrupt datasets before uploading it to server? + +2. The **Website Feedback** break-out session is to discuss the newly designed [OpenML website](https://github.com/minio/minio/issues/4364). +We will appreciate any feedback on frontend, functionalities and limitations of the [new openml website](https://new.openml.org). + +3. We [recently discussed](https://openml.github.io/blog/openml/data/2020/03/23/Finding-a-standard-dataset-format-for-machine-learning.html) that OpenML wants to improve support for a wider range of datasets. +For this reason we are moving away from the ARFF format. The **Dataset Format** break-out session discusses this transition. +Our current plan is to migrate to parquet format, we will be discussing about limitations and advantages of new format and how can we integrate parquet to OpenML. + +We welcome your participation in any these sessions. +And if you have an interesting topic we should discuss, feel free to submit your own breakout proposal! + +## Hacktoberfest + +[Hacktoberfest](https://hacktoberfest.digitalocean.com/) is a global event to support open source software. +If you contribute "enough" to open source projects, you will also be eligible to receive a free t-shirt and some other swag! +Our repositories welcome Hacktoberfest participation, so whenever you contribute to our repositories, you are working towards your Hacktoberfest goal. +The rules are simple: + - Sign up at [Hacktoberfest](https://hacktoberfest.digitalocean.com/) with [Github](https://github.com/) credentials + - Find an issue you can help with (more on that below) + - Submit a pull request resolving the issue + - To be eligible for the t-shirt and swag, you must open four pull requests (this is the "enough" part) + +![](hacktoberfest-2020.png) + +You can browse our repositories and identify issues which you would like to work on. +To make things easier, here are the list of openml repositories that are extra prepared for Hacktoberfest. +These repositories have core developers registered to attend the workshop, and have marked issues which are suitable for newcomers with the `hacktoberfest` label. + + - [openml.org](https://github.com/openml/openml.org) The front-end for the new OpenML! (python, React.js) + - [OpenML](https://github.com/openml/OpenML) The back-end for OpenML. (php) + - [openml-python](https://github.com/openml/openml-python) The Python API for interacting with the OpenML server. Please read [this welcome message](https://github.com/openml/openml-python/issues/953) to get started. (python) + - [docs](https://github.com/openml/docs) Documentation for OpenML. + +Please be sure to check the respective repositories contribution guidelines, and don't be afraid to ask questions! +We were all new to open source once and are happy to help you get started too. +If you are just getting your feet wet with open source contribution, a great way to get started it to just try and use the packages/website. +If you see documentation which needs clarification, or perhaps even just a simple typo, we appreciate your help in fixing it! + +## We hope to see you at our workshop! +If you have any questions about the workshop, feel free to leave a comment. diff --git a/blog/posts/OpenML-Hacktoberfest/gathertown-openml.png b/blog/posts/OpenML-Hacktoberfest/gathertown-openml.png new file mode 100644 index 0000000..a94e007 Binary files /dev/null and b/blog/posts/OpenML-Hacktoberfest/gathertown-openml.png differ diff --git a/blog/posts/OpenML-Hacktoberfest/hackathon.png b/blog/posts/OpenML-Hacktoberfest/hackathon.png new file mode 100644 index 0000000..6e10107 Binary files /dev/null and b/blog/posts/OpenML-Hacktoberfest/hackathon.png differ diff --git a/blog/posts/OpenML-Hacktoberfest/hacktoberfest-2020.png b/blog/posts/OpenML-Hacktoberfest/hacktoberfest-2020.png new file mode 100644 index 0000000..e2b0a5d Binary files /dev/null and b/blog/posts/OpenML-Hacktoberfest/hacktoberfest-2020.png differ diff --git a/blog/posts/_metadata.yml b/blog/posts/_metadata.yml new file mode 100644 index 0000000..3e9dd01 --- /dev/null +++ b/blog/posts/_metadata.yml @@ -0,0 +1,8 @@ +# options specified here will apply to all posts in this folder + +# freeze computational output +# (see https://quarto.org/docs/projects/code-execution.html#freeze) +freeze: true + +# Enable banner style title blocks +title-block-banner: true diff --git a/blog/styles.css b/blog/styles.css new file mode 100644 index 0000000..2ddf50c --- /dev/null +++ b/blog/styles.css @@ -0,0 +1 @@ +/* css styles */