diff --git a/README.md b/README.md index 42e6aa3552..6f813a6a7e 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ----------- [![MIT licensed](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE) -[![Build Status](https://msrasrg.visualstudio.com/NNIOpenSource/_apis/build/status/integration-test-local?branchName=master)](https://msrasrg.visualstudio.com/NNIOpenSource/_build/latest?definitionId=17&branchName=master) +[![Build Status](https://msrasrg.visualstudio.com/NNIOpenSource/_apis/build/status/full%20test%20-%20linux?branchName=master)](https://msrasrg.visualstudio.com/NNIOpenSource/_build/latest?definitionId=62&branchName=master) [![Issues](https://img.shields.io/github/issues-raw/Microsoft/nni.svg)](https://github.com/Microsoft/nni/issues?q=is%3Aissue+is%3Aopen) [![Bugs](https://img.shields.io/github/issues/Microsoft/nni/bug.svg)](https://github.com/Microsoft/nni/issues?q=is%3Aissue+is%3Aopen+label%3Abug) [![Pull Requests](https://img.shields.io/github/issues-pr-raw/Microsoft/nni.svg)](https://github.com/Microsoft/nni/pulls?q=is%3Apr+is%3Aopen) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 8a20e51b74..6eab27e09a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -34,8 +34,7 @@ jobs: python3 -m pip install gym onnx peewee thop --user python3 -m pip install sphinx==1.8.3 sphinx-argparse==0.2.5 sphinx-markdown-tables==0.0.9 sphinx-rtd-theme==0.4.2 sphinxcontrib-websupport==1.1.0 recommonmark==0.5.0 nbsphinx --user sudo apt-get install swig -y - nnictl package install --name=SMAC - nnictl package install --name=BOHB + python3 -m pip install -e .[SMAC,BOHB] displayName: 'Install dependencies' - script: | cd test @@ -73,8 +72,7 @@ jobs: python3 -m pip install keras==2.1.6 --user python3 -m pip install gym onnx peewee --user sudo apt-get install swig -y - nnictl package install --name=SMAC - nnictl package install --name=BOHB + python3 -m pip install -e .[SMAC,BOHB] displayName: 'Install dependencies' - script: | set -e diff --git a/deployment/registered_algorithms.yml b/deployment/registered_algorithms.yml new file mode 100644 index 0000000000..3cf8a322d8 --- /dev/null +++ b/deployment/registered_algorithms.yml @@ -0,0 +1,78 @@ +advisors: +- builtinName: Hyperband + classArgsValidator: nni.algorithms.hpo.hyperband_advisor.hyperband_advisor.HyperbandClassArgsValidator + className: nni.algorithms.hpo.hyperband_advisor.hyperband_advisor.Hyperband + source: nni +- builtinName: BOHB + classArgsValidator: nni.algorithms.hpo.bohb_advisor.bohb_advisor.BOHBClassArgsValidator + className: nni.algorithms.hpo.bohb_advisor.bohb_advisor.BOHB + source: nni +assessors: +- builtinName: Medianstop + classArgsValidator: nni.algorithms.hpo.medianstop_assessor.medianstop_assessor.MedianstopClassArgsValidator + className: nni.algorithms.hpo.medianstop_assessor.medianstop_assessor.MedianstopAssessor + source: nni +- builtinName: Curvefitting + classArgsValidator: nni.algorithms.hpo.curvefitting_assessor.curvefitting_assessor.CurvefittingClassArgsValidator + className: nni.algorithms.hpo.curvefitting_assessor.curvefitting_assessor.CurvefittingAssessor + source: nni +tuners: +- builtinName: PPOTuner + classArgsValidator: nni.algorithms.hpo.ppo_tuner.ppo_tuner.PPOClassArgsValidator + className: nni.algorithms.hpo.ppo_tuner.ppo_tuner.PPOTuner + source: nni +- builtinName: SMAC + classArgsValidator: nni.algorithms.hpo.smac_tuner.smac_tuner.SMACClassArgsValidator + className: nni.algorithms.hpo.smac_tuner.smac_tuner.SMACTuner + source: nni +- builtinName: TPE + classArgs: + algorithm_name: tpe + classArgsValidator: nni.algorithms.hpo.hyperopt_tuner.hyperopt_tuner.HyperoptClassArgsValidator + className: nni.algorithms.hpo.hyperopt_tuner.hyperopt_tuner.HyperoptTuner + source: nni +- acceptClassArgs: false + builtinName: Random + classArgs: + algorithm_name: random_search + classArgsValidator: nni.algorithms.hpo.hyperopt_tuner.hyperopt_tuner.HyperoptClassArgsValidator + className: nni.algorithms.hpo.hyperopt_tuner.hyperopt_tuner.HyperoptTuner + source: nni +- builtinName: Anneal + classArgs: + algorithm_name: anneal + classArgsValidator: nni.algorithms.hpo.hyperopt_tuner.hyperopt_tuner.HyperoptClassArgsValidator + className: nni.algorithms.hpo.hyperopt_tuner.hyperopt_tuner.HyperoptTuner + source: nni +- builtinName: Evolution + classArgsValidator: nni.algorithms.hpo.evolution_tuner.evolution_tuner.EvolutionClassArgsValidator + className: nni.algorithms.hpo.evolution_tuner.evolution_tuner.EvolutionTuner + source: nni +- acceptClassArgs: false + builtinName: BatchTuner + className: nni.algorithms.hpo.batch_tuner.batch_tuner.BatchTuner + source: nni +- acceptClassArgs: false + builtinName: GridSearch + className: nni.algorithms.hpo.gridsearch_tuner.gridsearch_tuner.GridSearchTuner + source: nni +- builtinName: NetworkMorphism + classArgsValidator: nni.algorithms.hpo.networkmorphism_tuner.networkmorphism_tuner.NetworkMorphismClassArgsValidator + className: nni.algorithms.hpo.networkmorphism_tuner.networkmorphism_tuner.NetworkMorphismTuner + source: nni +- builtinName: MetisTuner + classArgsValidator: nni.algorithms.hpo.metis_tuner.metis_tuner.MetisClassArgsValidator + className: nni.algorithms.hpo.metis_tuner.metis_tuner.MetisTuner + source: nni +- builtinName: GPTuner + classArgsValidator: nni.algorithms.hpo.gp_tuner.gp_tuner.GPClassArgsValidator + className: nni.algorithms.hpo.gp_tuner.gp_tuner.GPTuner + source: nni +- builtinName: PBTTuner + classArgsValidator: nni.algorithms.hpo.pbt_tuner.pbt_tuner.PBTClassArgsValidator + className: nni.algorithms.hpo.pbt_tuner.pbt_tuner.PBTTuner + source: nni +- builtinName: RegularizedEvolutionTuner + classArgsValidator: nni.algorithms.hpo.regularized_evolution_tuner.regularized_evolution_tuner.EvolutionClassArgsValidator + className: nni.algorithms.hpo.regularized_evolution_tuner.regularized_evolution_tuner.RegularizedEvolutionTuner + source: nni diff --git a/docs/archive_en_US/NAS/Benchmarks.md b/docs/archive_en_US/NAS/Benchmarks.md index d90982616c..1f79c798c7 100644 --- a/docs/archive_en_US/NAS/Benchmarks.md +++ b/docs/archive_en_US/NAS/Benchmarks.md @@ -1,5 +1,7 @@ # NAS Benchmarks +[TOC] + ```eval_rst .. toctree:: :hidden: @@ -9,7 +11,7 @@ ## Introduction -To imporve the reproducibility of NAS algorithms as well as reducing computing resource requirements, researchers proposed a series of NAS benchmarks such as [NAS-Bench-101](https://arxiv.org/abs/1902.09635), [NAS-Bench-201](https://arxiv.org/abs/2001.00326), [NDS](https://arxiv.org/abs/1905.13214), etc. NNI provides a query interface for users to acquire these benchmarks. Within just a few lines of code, researcher are able to evaluate their NAS algorithms easily and fairly by utilizing these benchmarks. +To imporve the reproducibility of NAS algorithms as well as reducing computing resource requirements, researchers proposed a series of NAS benchmarks such as [NAS-Bench-101](https://arxiv.org/abs/1902.09635), [NAS-Bench-201](https://arxiv.org/abs/2001.00326), [NDS](https://arxiv.org/abs/1905.13214), [NLP](https://arxiv.org/abs/2006.07116), etc. NNI provides a query interface for users to acquire these benchmarks. Within just a few lines of code, researcher are able to evaluate their NAS algorithms easily and fairly by utilizing these benchmarks. ## Prerequisites @@ -27,7 +29,7 @@ cd nni/examples/nas/benchmarks ``` Replace `${NNI_VERSION}` with a released version name or branch name, e.g., `v1.9`. -2. Install dependencies via `pip3 install -r xxx.requirements.txt`. `xxx` can be `nasbench101`, `nasbench201` or `nds`. +2. Install dependencies via `pip3 install -r xxx.requirements.txt`. `xxx` can be `nasbench101`, `nasbench201`, `nds` or `nlp`. 3. Generate the database via `./xxx.sh`. The directory that stores the benchmark file can be configured with `NASBENCHMARK_DIR` environment variable, which defaults to `~/.nni/nasbenchmark`. Note that the NAS-Bench-201 dataset will be downloaded from a google drive. Please make sure there is at least 10GB free disk space and note that the conversion process can take up to hours to complete. @@ -109,7 +111,7 @@ _On Network Design Spaces for Visual Recognition_ released trial statistics of o Instead of storing results obtained with different configurations in separate files, we dump them into one single database to enable comparison in multiple dimensions. Specifically, we use `model_family` to distinguish model types, `model_spec` for all hyper-parameters needed to build this model, `cell_spec` for detailed information on operators and connections if it is a NAS cell, `generator` to denote the sampling policy through which this configuration is generated. Refer to API documentation for details. -## Available Operators +### Available Operators Here is a list of available operators used in NDS. @@ -158,3 +160,22 @@ Here is a list of available operators used in NDS. .. autoclass:: nni.nas.benchmarks.nds.NdsIntermediateStats ``` + +## NLP + +[Paper link](https://arxiv.org/abs/2006.07116)     [Open-source](https://github.com/fmsnew/nas-bench-nlp-release) + +The paper "NAS-Bench-NLP: Neural Architecture Search Benchmark for Natural Language Processing" have provided search space of recurrent neural networks on the text datasets and trained 14k architectures within it, and have conducted both intrinsic and extrinsic evaluation of the trained models using datasets for semantic relatedness and language understanding evaluation. There are 2 datasets - PTB and wikitext-2. In the end, the precomputed results(ptb_single_run + ptb_multi_run + wikitext-2) can be utilized. + +### API Documentation + +```eval_rst +.. autofunction:: nni.nas.benchmarks.nlp.query_nlp_trial_stats + +.. autoclass:: nni.nas.benchmarks.nlp.NlpTrialConfig + +.. autoclass:: nni.nas.benchmarks.nlp.NlpTrialStats + +.. autoclass:: nni.nas.benchmarks.nlp.NlpIntermediateStats +``` + diff --git a/docs/archive_en_US/TrainingService/AdaptDLMode.md b/docs/archive_en_US/TrainingService/AdaptDLMode.md index 4b95a00865..feae1d5fb0 100644 --- a/docs/archive_en_US/TrainingService/AdaptDLMode.md +++ b/docs/archive_en_US/TrainingService/AdaptDLMode.md @@ -52,6 +52,7 @@ trialConcurrency: 2 maxTrialNum: 2 trial: + namespace: adaptive: false # optional. image: imagePullSecrets: # optional @@ -66,7 +67,7 @@ trial: path: / containerMountPath: /nfs checkpoint: # optional - storageClass: microk8s-hostpath + storageClass: dfs storageSize: 1Gi ``` @@ -79,18 +80,22 @@ IP address of the machine with NNI manager (NNICTL) that launches NNI experiment * **logCollection**: *Recommended* to set as `http`. It will collect the trial logs on cluster back to your machine via http. * **tuner**: It supports the Tuun tuner and all NNI built-in tuners (only except for the checkpoint feature of the NNI PBT tuners). * **trial**: It defines the specs of an `adl` trial. - * **adaptive**: (*Optional*) Boolean for AdaptDL trainer. While `true`, it the job is preemptible and adaptive. - * **image**: Docker image for the trial - * **imagePullSecret**: (*Optional*) If you are using a private registry, - you need to provide the secret to successfully pull the image. - * **codeDir**: the working directory of the container. `.` means the default working directory defined by the image. - * **command**: the bash command to start the trial - * **gpuNum**: the number of GPUs requested for this trial. It must be non-negative integer. - * **cpuNum**: (*Optional*) the number of CPUs requested for this trial. It must be non-negative integer. - * **memorySize**: (*Optional*) the size of memory requested for this trial. It must follow the Kubernetes - [default format](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#meaning-of-memory). - * **nfs**: (*Optional*) mounting external storage. For more information about using NFS please check the below paragraph. - * **checkpoint** (*Optional*) [storage settings](https://kubernetes.io/docs/concepts/storage/storage-classes/) for AdaptDL internal checkpoints. You can keep it optional if you are not dev users. + * **namespace**: (*Optional*) Kubernetes namespace to launch the trials. Default to `default` namespace. + * **adaptive**: (*Optional*) Boolean for AdaptDL trainer. While `true`, it the job is preemptible and adaptive. + * **image**: Docker image for the trial + * **imagePullSecret**: (*Optional*) If you are using a private registry, + you need to provide the secret to successfully pull the image. + * **codeDir**: the working directory of the container. `.` means the default working directory defined by the image. + * **command**: the bash command to start the trial + * **gpuNum**: the number of GPUs requested for this trial. It must be non-negative integer. + * **cpuNum**: (*Optional*) the number of CPUs requested for this trial. It must be non-negative integer. + * **memorySize**: (*Optional*) the size of memory requested for this trial. It must follow the Kubernetes + [default format](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#meaning-of-memory). + * **nfs**: (*Optional*) mounting external storage. For more information about using NFS please check the below paragraph. + * **checkpoint**: (*Optional*) storage settings for model checkpoints. + * **storageClass**: check [Kubernetes storage documentation](https://kubernetes.io/docs/concepts/storage/storage-classes/) for how to use the appropriate `storageClass`. + * **storageSize**: this value should be large enough to fit your model's checkpoints, or it could cause disk quota exceeded error. + ### NFS Storage diff --git a/docs/archive_en_US/Tuner/BohbAdvisor.md b/docs/archive_en_US/Tuner/BohbAdvisor.md index d27a9958f5..26ee4446cd 100644 --- a/docs/archive_en_US/Tuner/BohbAdvisor.md +++ b/docs/archive_en_US/Tuner/BohbAdvisor.md @@ -46,7 +46,7 @@ The sampling procedure (using Multidimensional KDE to guide selection) is summar BOHB advisor requires the [ConfigSpace](https://github.com/automl/ConfigSpace) package. ConfigSpace can be installed using the following command. ```bash -nnictl package install --name=BOHB +pip install nni[BOHB] ``` To use BOHB, you should add the following spec in your experiment's YAML config file: diff --git a/docs/archive_en_US/Tuner/BuiltinTuner.md b/docs/archive_en_US/Tuner/BuiltinTuner.md index c8ad5af398..dd2bb1a6eb 100644 --- a/docs/archive_en_US/Tuner/BuiltinTuner.md +++ b/docs/archive_en_US/Tuner/BuiltinTuner.md @@ -12,7 +12,7 @@ Currently, we support the following algorithms: |[__Random Search__](#Random)|In Random Search for Hyper-Parameter Optimization show that Random Search might be surprisingly simple and effective. We suggest that we could use Random Search as the baseline when we have no knowledge about the prior distribution of hyper-parameters. [Reference Paper](http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf)| |[__Anneal__](#Anneal)|This simple annealing algorithm begins by sampling from the prior, but tends over time to sample from points closer and closer to the best ones observed. This algorithm is a simple variation on the random search that leverages smoothness in the response surface. The annealing rate is not adaptive.| |[__Naïve Evolution__](#Evolution)|Naïve Evolution comes from Large-Scale Evolution of Image Classifiers. It randomly initializes a population-based on search space. For each generation, it chooses better ones and does some mutation (e.g., change a hyperparameter, add/remove one layer) on them to get the next generation. Naïve Evolution requires many trials to work, but it's very simple and easy to expand new features. [Reference paper](https://arxiv.org/pdf/1703.01041.pdf)| -|[__SMAC__](#SMAC)|SMAC is based on Sequential Model-Based Optimization (SMBO). It adapts the most prominent previously used model class (Gaussian stochastic process models) and introduces the model class of random forests to SMBO, in order to handle categorical parameters. The SMAC supported by NNI is a wrapper on the SMAC3 GitHub repo. Notice, SMAC needs to be installed by `nnictl package` command. [Reference Paper,](https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf) [GitHub Repo](https://github.com/automl/SMAC3)| +|[__SMAC__](#SMAC)|SMAC is based on Sequential Model-Based Optimization (SMBO). It adapts the most prominent previously used model class (Gaussian stochastic process models) and introduces the model class of random forests to SMBO, in order to handle categorical parameters. The SMAC supported by NNI is a wrapper on the SMAC3 GitHub repo. Notice, SMAC needs to be installed by `pip install nni[SMAC]` command. [Reference Paper,](https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf) [GitHub Repo](https://github.com/automl/SMAC3)| |[__Batch tuner__](#Batch)|Batch tuner allows users to simply provide several configurations (i.e., choices of hyper-parameters) for their trial code. After finishing all the configurations, the experiment is done. Batch tuner only supports the type choice in search space spec.| |[__Grid Search__](#GridSearch)|Grid Search performs an exhaustive searching through a manually specified subset of the hyperparameter space defined in the searchspace file. Note that the only acceptable types of search space are choice, quniform, randint. | |[__Hyperband__](#Hyperband)|Hyperband tries to use limited resources to explore as many configurations as possible and returns the most promising ones as a final result. The basic idea is to generate many configurations and run them for a small number of trials. The half least-promising configurations are thrown out, the remaining are further trained along with a selection of new configurations. The size of these populations is sensitive to resource constraints (e.g. allotted search time). [Reference Paper](https://arxiv.org/pdf/1603.06560.pdf)| @@ -27,7 +27,9 @@ Currently, we support the following algorithms: Using a built-in tuner provided by the NNI SDK requires one to declare the **builtinTunerName** and **classArgs** in the `config.yml` file. In this part, we will introduce each tuner along with information about usage and suggested scenarios, classArg requirements, and an example configuration. -Note: Please follow the format when you write your `config.yml` file. Some built-in tuners need to be installed using `nnictl package`, like SMAC. +Note: Please follow the format when you write your `config.yml` file. Some built-in tuners have +dependencies need to be installed using `pip install nni[]`, like SMAC's dependencies can +be installed using `pip install nni[SMAC]`. @@ -144,10 +146,10 @@ tuner: **Installation** -SMAC needs to be installed by following command before the first usage. As a reminder, `swig` is required for SMAC: for Ubuntu `swig` can be installed with `apt`. +SMAC has dependencies need to be installed by following command before the first usage. As a reminder, `swig` is required for SMAC: for Ubuntu `swig` can be installed with `apt`. ```bash -nnictl package install --name=SMAC +pip install nni[SMAC] ``` **Suggested scenario** @@ -340,7 +342,7 @@ tuner: BOHB advisor requires [ConfigSpace](https://github.com/automl/ConfigSpace) package. ConfigSpace can be installed using the following command. ```bash -nnictl package install --name=BOHB +pip install nni[BOHB] ``` **Suggested scenario** diff --git a/docs/archive_en_US/Tuner/InstallCustomizedTuner.md b/docs/archive_en_US/Tuner/InstallCustomizedTuner.md index f24c0248b7..f02565ffc1 100644 --- a/docs/archive_en_US/Tuner/InstallCustomizedTuner.md +++ b/docs/archive_en_US/Tuner/InstallCustomizedTuner.md @@ -1,22 +1,19 @@ -# How to install customized tuner as a builtin tuner +# How to register a customized tuner as a builtin tuner -You can following below steps to install a customized tuner in `nni/examples/tuners/customized_tuner` as a builtin tuner. +You can following below steps to register a customized tuner in `nni/examples/tuners/customized_tuner` as a builtin tuner. -## Prepare installation source and install package +## Install the customized tuner package into python environment -There are 2 options to install this customized tuner: +There are 2 options to install the package into python environment: ### Option 1: install from directory -Step 1: From `nni/examples/tuners/customized_tuner` directory, run: +From `nni/examples/tuners/customized_tuner` directory, run: `python setup.py develop` This command will build the `nni/examples/tuners/customized_tuner` directory as a pip installation source. -Step 2: Run command: - -`nnictl package install ./` ### Option 2: install from whl file @@ -28,16 +25,22 @@ This command build a whl file which is a pip installation source. Step 2: Run command: -`nnictl package install dist/demo_tuner-0.1-py3-none-any.whl` +`pip install dist/demo_tuner-0.1-py3-none-any.whl` + +## Register the customized tuner as builtin tuner: + +Run following command: + +`nnictl algo register --meta meta_file.yml` -## Check the installed package +## Check the registered builtin algorithms -Then run command `nnictl package list`, you should be able to see that demotuner is installed: +Then run command `nnictl algo list`, you should be able to see that demotuner is installed: ``` +-----------------+------------+-----------+--------=-------------+------------------------------------------+ -| Name | Type | Installed | Class Name | Module Name | +| Name | Type | source | Class Name | Module Name | +-----------------+------------+-----------+----------------------+------------------------------------------+ -| demotuner | tuners | Yes | DemoTuner | demo_tuner | +| demotuner | tuners | user | DemoTuner | demo_tuner | +-----------------+------------+-----------+----------------------+------------------------------------------+ ``` diff --git a/docs/archive_en_US/Tutorial/InstallCustomizedAlgos.md b/docs/archive_en_US/Tutorial/InstallCustomizedAlgos.md index ff5a3d3514..5b58105140 100644 --- a/docs/archive_en_US/Tutorial/InstallCustomizedAlgos.md +++ b/docs/archive_en_US/Tutorial/InstallCustomizedAlgos.md @@ -1,9 +1,9 @@ -**How to install customized algorithms as builtin tuners, assessors and advisors** +**How to register customized algorithms as builtin tuners, assessors and advisors** === ## Overview -NNI provides a lot of [builtin tuners](../Tuner/BuiltinTuner.md), [advisors](../Tuner/HyperbandAdvisor.md) and [assessors](../Assessor/BuiltinAssessor.md) can be used directly for Hyper Parameter Optimization, and some extra algorithms can be installed via `nnictl package install --name ` after NNI is installed. You can check these extra algorithms via `nnictl package list` command. +NNI provides a lot of [builtin tuners](../Tuner/BuiltinTuner.md), [advisors](../Tuner/HyperbandAdvisor.md) and [assessors](../Assessor/BuiltinAssessor.md) can be used directly for Hyper Parameter Optimization, and some extra algorithms can be registered via `nnictl algo register --meta ` after NNI is installed. You can check builtin algorithms via `nnictl algo list` command. NNI also provides the ability to build your own customized tuners, advisors and assessors. To use the customized algorithm, users can simply follow the spec in experiment config file to properly reference the algorithm, which has been illustrated in the tutorials of [customized tuners](../Tuner/CustomizeTuner.md)/[advisors](../Tuner/CustomizeAdvisor.md)/[assessors](../Assessor/CustomizeAssessor.md). @@ -13,8 +13,8 @@ tuner: builtinTunerName: mytuner ``` -## Install customized algorithms as builtin tuners, assessors and advisors -You can follow below steps to build a customized tuner/assessor/advisor, and install it into NNI as builtin algorithm. +## Register customized algorithms as builtin tuners, assessors and advisors +You can follow below steps to build a customized tuner/assessor/advisor, and register it into NNI as builtin algorithm. ### 1. Create a customized tuner/assessor/advisor Reference following instructions to create: @@ -48,56 +48,43 @@ class MedianstopClassArgsValidator(ClassArgsValidator): ``` The validator will be invoked before experiment is started to check whether the classArgs fields are valid for your customized algorithms. -### 3. Prepare package installation source -In order to be installed as builtin tuners, assessors and advisors, the customized algorithms need to be packaged as installable source which can be recognized by `pip` command, under the hood nni calls `pip` command to install the package. -Besides being a common pip source, the package needs to provide meta information in the `classifiers` field. -Format of classifiers field is a following: -``` -NNI Package :: :: :: :: -``` -* `type`: type of algorithms, could be one of `tuner`, `assessor`, `advisor` -* `builtin name`: builtin name used in experiment configuration file -* `full class name of tuner`: tuner class name, including its module name, for example: `demo_tuner.DemoTuner` -* `full class name of class args validator`: class args validator class name, including its module name, for example: `demo_tuner.MyClassArgsValidator` - -Following is an example of classfiers in package's `setup.py`: +### 3. Install your customized algorithms into python environment +Firstly, the customized algorithms need to be prepared as a python package. Then you can install the package into python environment via: +* Run command `python setup.py develop` from the package directory, this command will install the package in development mode, this is recommended if your algorithm is under development. +* Run command `python setup.py bdist_wheel` from the package directory, this command build a whl file which is a pip installation source. Then run `pip install ` to install it. -```python - classifiers = [ - 'Programming Language :: Python :: 3', - 'License :: OSI Approved :: MIT License', - 'Operating System :: ', - 'NNI Package :: tuner :: demotuner :: demo_tuner.DemoTuner :: demo_tuner.MyClassArgsValidator' - ], -``` -Once you have the meta info in `setup.py`, you can build your pip installation source via: -* Run command `python setup.py develop` from the package directory, this command will build the directory as a pip installation source. -* Run command `python setup.py bdist_wheel` from the package directory, this command build a whl file which is a pip installation source. +### 4. Prepare meta file -NNI will look for the classifier starts with `NNI Package` to retrieve the package meta information while the package being installed with `nnictl package install ` command. +Create a yaml file with following keys as meta file: +* `algoType`: type of algorithms, could be one of `tuner`, `assessor`, `advisor` +* `builtinName`: builtin name used in experiment configuration file +* `className`: tuner class name, including its module name, for example: `demo_tuner.DemoTuner` +* `classArgsValidator`: class args validator class name, including its module name, for example: `demo_tuner.MyClassArgsValidator` -Reference [customized tuner example](../Tuner/InstallCustomizedTuner.md) for a full example. +Following is an example of the yaml file: -### 4. Install customized algorithms package into NNI - -If your installation source is prepared as a directory with `python setup.py develop`, you can install the package by following command: - -`nnictl package install ` +```yaml +algoType: tuner +builtinName: demotuner +className: demo_tuner.DemoTuner +classArgsValidator: demo_tuner.MyClassArgsValidator -For example: +``` -`nnictl package install nni/examples/tuners/customized_tuner/` +### 5. Register customized algorithms into NNI +Run following command to register the customized algorithms as builtin algorithms in NNI: -If your installation source is prepared as a whl file with `python setup.py bdist_wheel`, you can install the package by following command: +```bash +nnictl algo register --meta +``` +The `` is the path to the yaml file your created in above section. -`nnictl package install ` -For example: +Reference [customized tuner example](../Tuner/InstallCustomizedTuner.md) for a full example. -`nnictl package install nni/examples/tuners/customized_tuner/dist/demo_tuner-0.1-py3-none-any.whl` -## 5. Use the installed builtin algorithms in experiment +## 6. Use the installed builtin algorithms in experiment Once your customized algorithms is installed, you can use it in experiment configuration file the same way as other builtin tuners/assessors/advisors, for example: ```yaml @@ -109,56 +96,42 @@ tuner: ``` -## Manage packages using `nnictl package` +## Manage builtin algorithms using `nnictl algo` -### List installed packages +### List builtin algorithms -Run following command to list the installed packages: +Run following command to list the registered builtin algorithms: -``` -nnictl package list -+-----------------+------------+-----------+--------=-------------+------------------------------------------+ -| Name | Type | Installed | Class Name | Module Name | -+-----------------+------------+-----------+----------------------+------------------------------------------+ -| demotuner | tuners | Yes | DemoTuner | demo_tuner | -| SMAC | tuners | No | SMACTuner | nni.smac_tuner.smac_tuner | -| PPOTuner | tuners | No | PPOTuner | nni.ppo_tuner.ppo_tuner | -| BOHB | advisors | Yes | BOHB | nni.bohb_advisor.bohb_advisor | -+-----------------+------------+-----------+----------------------+------------------------------------------+ -``` - -Run following command to list all packages, including the builtin packages can not be uninstalled. - -``` -nnictl package list --all +```bash +nnictl algo list +-----------------+------------+-----------+--------=-------------+------------------------------------------+ -| Name | Type | Installed | Class Name | Module Name | +| Name | Type | Source | Class Name | Module Name | +-----------------+------------+-----------+----------------------+------------------------------------------+ -| TPE | tuners | Yes | HyperoptTuner | nni.hyperopt_tuner.hyperopt_tuner | -| Random | tuners | Yes | HyperoptTuner | nni.hyperopt_tuner.hyperopt_tuner | -| Anneal | tuners | Yes | HyperoptTuner | nni.hyperopt_tuner.hyperopt_tuner | -| Evolution | tuners | Yes | EvolutionTuner | nni.evolution_tuner.evolution_tuner | -| BatchTuner | tuners | Yes | BatchTuner | nni.batch_tuner.batch_tuner | -| GridSearch | tuners | Yes | GridSearchTuner | nni.gridsearch_tuner.gridsearch_tuner | -| NetworkMorphism | tuners | Yes | NetworkMorphismTuner | nni.networkmorphism_tuner.networkmo... | -| MetisTuner | tuners | Yes | MetisTuner | nni.metis_tuner.metis_tuner | -| GPTuner | tuners | Yes | GPTuner | nni.gp_tuner.gp_tuner | -| PBTTuner | tuners | Yes | PBTTuner | nni.pbt_tuner.pbt_tuner | -| SMAC | tuners | No | SMACTuner | nni.smac_tuner.smac_tuner | -| PPOTuner | tuners | No | PPOTuner | nni.ppo_tuner.ppo_tuner | -| Medianstop | assessors | Yes | MedianstopAssessor | nni.medianstop_assessor.medianstop_... | -| Curvefitting | assessors | Yes | CurvefittingAssessor | nni.curvefitting_assessor.curvefitt... | -| Hyperband | advisors | Yes | Hyperband | nni.hyperband_advisor.hyperband_adv... | -| BOHB | advisors | Yes | BOHB | nni.bohb_advisor.bohb_advisor | +| TPE | tuners | nni | HyperoptTuner | nni.hyperopt_tuner.hyperopt_tuner | +| Random | tuners | nni | HyperoptTuner | nni.hyperopt_tuner.hyperopt_tuner | +| Anneal | tuners | nni | HyperoptTuner | nni.hyperopt_tuner.hyperopt_tuner | +| Evolution | tuners | nni | EvolutionTuner | nni.evolution_tuner.evolution_tuner | +| BatchTuner | tuners | nni | BatchTuner | nni.batch_tuner.batch_tuner | +| GridSearch | tuners | nni | GridSearchTuner | nni.gridsearch_tuner.gridsearch_tuner | +| NetworkMorphism | tuners | nni | NetworkMorphismTuner | nni.networkmorphism_tuner.networkmo... | +| MetisTuner | tuners | nni | MetisTuner | nni.metis_tuner.metis_tuner | +| GPTuner | tuners | nni | GPTuner | nni.gp_tuner.gp_tuner | +| PBTTuner | tuners | nni | PBTTuner | nni.pbt_tuner.pbt_tuner | +| SMAC | tuners | nni | SMACTuner | nni.smac_tuner.smac_tuner | +| PPOTuner | tuners | nni | PPOTuner | nni.ppo_tuner.ppo_tuner | +| Medianstop | assessors | nni | MedianstopAssessor | nni.medianstop_assessor.medianstop_... | +| Curvefitting | assessors | nni | CurvefittingAssessor | nni.curvefitting_assessor.curvefitt... | +| Hyperband | advisors | nni | Hyperband | nni.hyperband_advisor.hyperband_adv... | +| BOHB | advisors | nni | BOHB | nni.bohb_advisor.bohb_advisor | +-----------------+------------+-----------+----------------------+------------------------------------------+ ``` -### Uninstall package +### Unregister builtin algorithms Run following command to uninstall an installed package: -`nnictl package uninstall ` +`nnictl algo unregister ` For example: -`nnictl package uninstall demotuner` +`nnictl algo unregister demotuner` diff --git a/docs/archive_en_US/Tutorial/InstallationWin.md b/docs/archive_en_US/Tutorial/InstallationWin.md index 53daccba06..cea3449614 100644 --- a/docs/archive_en_US/Tutorial/InstallationWin.md +++ b/docs/archive_en_US/Tutorial/InstallationWin.md @@ -123,7 +123,7 @@ If there is a stderr file, please check it. Two possible cases are: ### Fail to use BOHB on Windows -Make sure a C++ 14.0 compiler is installed when trying to run `nnictl package install --name=BOHB` to install the dependencies. +Make sure a C++ 14.0 compiler is installed when trying to run `pip install nni[BOHB]` to install the dependencies. ### Not supported tuner on Windows diff --git a/docs/archive_en_US/Tutorial/Nnictl.md b/docs/archive_en_US/Tutorial/Nnictl.md index edb25afacd..45ffca6786 100644 --- a/docs/archive_en_US/Tutorial/Nnictl.md +++ b/docs/archive_en_US/Tutorial/Nnictl.md @@ -21,7 +21,7 @@ nnictl support commands: * [nnictl log](#log) * [nnictl webui](#webui) * [nnictl tensorboard](#tensorboard) -* [nnictl package](#package) +* [nnictl algo](#algo) * [nnictl ss_gen](#ss_gen) * [nnictl --version](#version) @@ -769,112 +769,89 @@ Debug mode will disable version check function in Trialkeeper. |------|------|------ |------| |id| False| |ID of the experiment you want to set| - + -### Manage package +### Manage builtin algorithms -* __nnictl package install__ +* __nnictl algo register__ * Description - Install a package (customized algorithms or nni provided algorithms) as builtin tuner/assessor/advisor. + Register customized algorithms as builtin tuner/assessor/advisor. * Usage ```bash - nnictl package install --name + nnictl algo register --meta ``` + `` is the path to the meta data file in yml format, which has following keys: + * `algoType`: type of algorithms, could be one of `tuner`, `assessor`, `advisor` + * `builtinName`: builtin name used in experiment configuration file + * `className`: tuner class name, including its module name, for example: `demo_tuner.DemoTuner` + * `classArgsValidator`: class args validator class name, including its module name, for example: `demo_tuner.MyClassArgsValidator` - The available `` can be checked via `nnictl package list` command. - - or - - ```bash - nnictl package install - ``` - - Reference [Install customized algorithms](InstallCustomizedAlgos.md) to prepare the installation source. * Example - > Install SMAC tuner + > Install a customized tuner in nni examples ```bash - nnictl package install --name SMAC + cd nni/examples/tuners/customized_tuner + python3 setup.py develop + nnictl algo register --meta meta_file.yml ``` - > Install a customized tuner - - ```bash - nnictl package install nni/examples/tuners/customized_tuner/dist/demo_tuner-0.1-py3-none-any.whl - ``` - -* __nnictl package show__ +* __nnictl algo show__ * Description - Show the detailed information of specified packages. + Show the detailed information of specified registered algorithms. * Usage ```bash - nnictl package show + nnictl algo show ``` * Example ```bash - nnictl package show SMAC + nnictl algo show SMAC ``` -* __nnictl package list__ +* __nnictl algo list__ * Description - List the installed/all packages. + List the registered builtin algorithms * Usage ```bash - nnictl package list [OPTIONS] + nnictl algo list ``` - * Options - - |Name, shorthand|Required|Default|Description| - |------|------|------ |------| - |--all| False| |List all packages| - * Example - > List installed packages - - ```bash - nnictl package list - ``` - - > List all packages - ```bash - nnictl package list --all + nnictl algo list ``` -* __nnictl package uninstall__ +* __nnictl algo unregister__ * Description - Uninstall a package. + Unregister a registered customized builtin algorithms. The NNI provided builtin algorithms can not be unregistered. * Usage ```bash - nnictl package uninstall + nnictl algo unregister ``` * Example - Uninstall SMAC package ```bash - nnictl package uninstall SMAC + nnictl algo unregister demotuner ``` diff --git a/docs/archive_en_US/Tutorial/SearchSpaceSpec.md b/docs/archive_en_US/Tutorial/SearchSpaceSpec.md index af07075745..a7f765f9d9 100644 --- a/docs/archive_en_US/Tutorial/SearchSpaceSpec.md +++ b/docs/archive_en_US/Tutorial/SearchSpaceSpec.md @@ -89,4 +89,4 @@ Known Limitations: * Note that for nested search space: - * Only Random Search/TPE/Anneal/Evolution tuner supports nested search space + * Only Random Search/TPE/Anneal/Evolution/Grid Search tuner supports nested search space diff --git a/docs/en_US/NAS/BenchmarksExample.ipynb b/docs/en_US/NAS/BenchmarksExample.ipynb index dd4f24a54b..4c0c8d6c2d 100644 --- a/docs/en_US/NAS/BenchmarksExample.ipynb +++ b/docs/en_US/NAS/BenchmarksExample.ipynb @@ -1,379 +1,396 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Example Usages of NAS Benchmarks" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pprint\n", - "import time\n", - "\n", - "from nni.nas.benchmarks.nasbench101 import query_nb101_trial_stats\n", - "from nni.nas.benchmarks.nasbench201 import query_nb201_trial_stats\n", - "from nni.nas.benchmarks.nds import query_nds_trial_stats\n", - "\n", - "ti = time.time()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## NAS-Bench-101" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use the following architecture as an example:\n", - "\n", - "![nas-101](../../img/nas-bench-101-example.png)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "tags": [] - }, - "outputs": [ + "cells": [ { - "output_type": "stream", - "name": "stdout", - "text": "{'config': {'arch': {'input1': [0],\n 'input2': [1],\n 'input3': [2],\n 'input4': [0],\n 'input5': [0, 3, 4],\n 'input6': [2, 5],\n 'op1': 'conv3x3-bn-relu',\n 'op2': 'maxpool3x3',\n 'op3': 'conv3x3-bn-relu',\n 'op4': 'conv3x3-bn-relu',\n 'op5': 'conv1x1-bn-relu'},\n 'hash': '00005c142e6f48ac74fdcf73e3439874',\n 'id': 4,\n 'num_epochs': 108,\n 'num_vertices': 7},\n 'id': 10,\n 'intermediates': [{'current_epoch': 54,\n 'id': 19,\n 'test_acc': 77.40384340286255,\n 'train_acc': 82.82251358032227,\n 'training_time': 883.4580078125,\n 'valid_acc': 77.76442170143127},\n {'current_epoch': 108,\n 'id': 20,\n 'test_acc': 92.11738705635071,\n 'train_acc': 100.0,\n 'training_time': 1769.1279296875,\n 'valid_acc': 92.41786599159241}],\n 'parameters': 8.55553,\n 'test_acc': 92.11738705635071,\n 'train_acc': 100.0,\n 'training_time': 106147.67578125,\n 'valid_acc': 92.41786599159241}\n{'config': {'arch': {'input1': [0],\n 'input2': [1],\n 'input3': [2],\n 'input4': [0],\n 'input5': [0, 3, 4],\n 'input6': [2, 5],\n 'op1': 'conv3x3-bn-relu',\n 'op2': 'maxpool3x3',\n 'op3': 'conv3x3-bn-relu',\n 'op4': 'conv3x3-bn-relu',\n 'op5': 'conv1x1-bn-relu'},\n 'hash': '00005c142e6f48ac74fdcf73e3439874',\n 'id': 4,\n 'num_epochs': 108,\n 'num_vertices': 7},\n 'id': 11,\n 'intermediates': [{'current_epoch': 54,\n 'id': 21,\n 'test_acc': 82.04126358032227,\n 'train_acc': 87.96073794364929,\n 'training_time': 883.6810302734375,\n 'valid_acc': 82.91265964508057},\n {'current_epoch': 108,\n 'id': 22,\n 'test_acc': 91.90705418586731,\n 'train_acc': 100.0,\n 'training_time': 1768.2509765625,\n 'valid_acc': 92.45793223381042}],\n 'parameters': 8.55553,\n 'test_acc': 91.90705418586731,\n 'train_acc': 100.0,\n 'training_time': 106095.05859375,\n 'valid_acc': 92.45793223381042}\n{'config': {'arch': {'input1': [0],\n 'input2': [1],\n 'input3': [2],\n 'input4': [0],\n 'input5': [0, 3, 4],\n 'input6': [2, 5],\n 'op1': 'conv3x3-bn-relu',\n 'op2': 'maxpool3x3',\n 'op3': 'conv3x3-bn-relu',\n 'op4': 'conv3x3-bn-relu',\n 'op5': 'conv1x1-bn-relu'},\n 'hash': '00005c142e6f48ac74fdcf73e3439874',\n 'id': 4,\n 'num_epochs': 108,\n 'num_vertices': 7},\n 'id': 12,\n 'intermediates': [{'current_epoch': 54,\n 'id': 23,\n 'test_acc': 80.58894276618958,\n 'train_acc': 86.34815812110901,\n 'training_time': 883.4569702148438,\n 'valid_acc': 81.1598539352417},\n {'current_epoch': 108,\n 'id': 24,\n 'test_acc': 92.15745329856873,\n 'train_acc': 100.0,\n 'training_time': 1768.9759521484375,\n 'valid_acc': 93.04887652397156}],\n 'parameters': 8.55553,\n 'test_acc': 92.15745329856873,\n 'train_acc': 100.0,\n 'training_time': 106138.55712890625,\n 'valid_acc': 93.04887652397156}\n" - } - ], - "source": [ - "arch = {\n", - " 'op1': 'conv3x3-bn-relu',\n", - " 'op2': 'maxpool3x3',\n", - " 'op3': 'conv3x3-bn-relu',\n", - " 'op4': 'conv3x3-bn-relu',\n", - " 'op5': 'conv1x1-bn-relu',\n", - " 'input1': [0],\n", - " 'input2': [1],\n", - " 'input3': [2],\n", - " 'input4': [0],\n", - " 'input5': [0, 3, 4],\n", - " 'input6': [2, 5]\n", - "}\n", - "for t in query_nb101_trial_stats(arch, 108, include_intermediates=True):\n", - " pprint.pprint(t)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "An architecture of NAS-Bench-101 could be trained more than once. Each element of the returned generator is a dict which contains one of the training results of this trial config (architecture + hyper-parameters) including train/valid/test accuracy, training time, number of epochs, etc. The results of NAS-Bench-201 and NDS follow similar formats." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## NAS-Bench-201" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use the following architecture as an example:\n", - "\n", - "![nas-201](../../img/nas-bench-201-example.png)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "tags": [] - }, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example Usages of NAS Benchmarks" + ] + }, { - "output_type": "stream", - "name": "stdout", - "text": "{'config': {'arch': {'0_1': 'avg_pool_3x3',\n '0_2': 'conv_1x1',\n '0_3': 'conv_1x1',\n '1_2': 'skip_connect',\n '1_3': 'skip_connect',\n '2_3': 'skip_connect'},\n 'dataset': 'cifar100',\n 'id': 7,\n 'num_cells': 5,\n 'num_channels': 16,\n 'num_epochs': 200},\n 'flops': 15.65322,\n 'id': 3,\n 'latency': 0.013182918230692545,\n 'ori_test_acc': 53.11,\n 'ori_test_evaluation_time': 1.0195916947864352,\n 'ori_test_loss': 1.7307863704681397,\n 'parameters': 0.135156,\n 'seed': 999,\n 'test_acc': 53.07999995727539,\n 'test_evaluation_time': 0.5097958473932176,\n 'test_loss': 1.731276072692871,\n 'train_acc': 57.82,\n 'train_loss': 1.5116578379058838,\n 'training_time': 2888.4371995925903,\n 'valid_acc': 53.14000000610351,\n 'valid_evaluation_time': 0.5097958473932176,\n 'valid_loss': 1.7302966793060304}\n{'config': {'arch': {'0_1': 'avg_pool_3x3',\n '0_2': 'conv_1x1',\n '0_3': 'conv_1x1',\n '1_2': 'skip_connect',\n '1_3': 'skip_connect',\n '2_3': 'skip_connect'},\n 'dataset': 'cifar100',\n 'id': 7,\n 'num_cells': 5,\n 'num_channels': 16,\n 'num_epochs': 200},\n 'flops': 15.65322,\n 'id': 7,\n 'latency': 0.013182918230692545,\n 'ori_test_acc': 51.93,\n 'ori_test_evaluation_time': 1.0195916947864352,\n 'ori_test_loss': 1.7572312774658203,\n 'parameters': 0.135156,\n 'seed': 777,\n 'test_acc': 51.979999938964845,\n 'test_evaluation_time': 0.5097958473932176,\n 'test_loss': 1.7429540189743042,\n 'train_acc': 57.578,\n 'train_loss': 1.5114233912658692,\n 'training_time': 2888.4371995925903,\n 'valid_acc': 51.88,\n 'valid_evaluation_time': 0.5097958473932176,\n 'valid_loss': 1.7715086591720581}\n{'config': {'arch': {'0_1': 'avg_pool_3x3',\n '0_2': 'conv_1x1',\n '0_3': 'conv_1x1',\n '1_2': 'skip_connect',\n '1_3': 'skip_connect',\n '2_3': 'skip_connect'},\n 'dataset': 'cifar100',\n 'id': 7,\n 'num_cells': 5,\n 'num_channels': 16,\n 'num_epochs': 200},\n 'flops': 15.65322,\n 'id': 11,\n 'latency': 0.013182918230692545,\n 'ori_test_acc': 53.38,\n 'ori_test_evaluation_time': 1.0195916947864352,\n 'ori_test_loss': 1.7281623031616211,\n 'parameters': 0.135156,\n 'seed': 888,\n 'test_acc': 53.67999998779297,\n 'test_evaluation_time': 0.5097958473932176,\n 'test_loss': 1.7327697801589965,\n 'train_acc': 57.792,\n 'train_loss': 1.5091403088760376,\n 'training_time': 2888.4371995925903,\n 'valid_acc': 53.08000000610352,\n 'valid_evaluation_time': 0.5097958473932176,\n 'valid_loss': 1.7235548280715942}\n" - } - ], - "source": [ - "arch = {\n", - " '0_1': 'avg_pool_3x3',\n", - " '0_2': 'conv_1x1',\n", - " '1_2': 'skip_connect',\n", - " '0_3': 'conv_1x1',\n", - " '1_3': 'skip_connect',\n", - " '2_3': 'skip_connect'\n", - "}\n", - "for t in query_nb201_trial_stats(arch, 200, 'cifar100'):\n", - " pprint.pprint(t)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Intermediate results are also available." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "tags": [] - }, - "outputs": [ + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import pprint\n", + "import time\n", + "\n", + "from nni.nas.benchmarks.nasbench101 import query_nb101_trial_stats\n", + "from nni.nas.benchmarks.nasbench201 import query_nb201_trial_stats\n", + "from nni.nas.benchmarks.nds import query_nds_trial_stats\n", + "\n", + "ti = time.time()" + ] + }, { - "output_type": "stream", - "name": "stdout", - "text": "{'id': 4, 'arch': {'0_1': 'avg_pool_3x3', '0_2': 'conv_1x1', '0_3': 'conv_1x1', '1_2': 'skip_connect', '1_3': 'skip_connect', '2_3': 'skip_connect'}, 'num_epochs': 12, 'num_channels': 16, 'num_cells': 5, 'dataset': 'imagenet16-120'}\nIntermediates: 12\n{'id': 8, 'arch': {'0_1': 'avg_pool_3x3', '0_2': 'conv_1x1', '0_3': 'conv_1x1', '1_2': 'skip_connect', '1_3': 'skip_connect', '2_3': 'skip_connect'}, 'num_epochs': 200, 'num_channels': 16, 'num_cells': 5, 'dataset': 'imagenet16-120'}\nIntermediates: 200\n{'id': 8, 'arch': {'0_1': 'avg_pool_3x3', '0_2': 'conv_1x1', '0_3': 'conv_1x1', '1_2': 'skip_connect', '1_3': 'skip_connect', '2_3': 'skip_connect'}, 'num_epochs': 200, 'num_channels': 16, 'num_cells': 5, 'dataset': 'imagenet16-120'}\nIntermediates: 200\n{'id': 8, 'arch': {'0_1': 'avg_pool_3x3', '0_2': 'conv_1x1', '0_3': 'conv_1x1', '1_2': 'skip_connect', '1_3': 'skip_connect', '2_3': 'skip_connect'}, 'num_epochs': 200, 'num_channels': 16, 'num_cells': 5, 'dataset': 'imagenet16-120'}\nIntermediates: 200\n" - } - ], - "source": [ - "for t in query_nb201_trial_stats(arch, None, 'imagenet16-120', include_intermediates=True):\n", - " print(t['config'])\n", - " print('Intermediates:', len(t['intermediates']))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## NDS" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use the following architecture as an example:
\n", - "![nds](../../img/nas-bench-nds-example.png)\n", - "\n", - "Here, `bot_muls`, `ds`, `num_gs`, `ss` and `ws` stand for \"bottleneck multipliers\", \"depths\", \"number of groups\", \"strides\" and \"widths\" respectively." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "tags": [] - }, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NAS-Bench-101" + ] + }, { - "output_type": "stream", - "name": "stdout", - "text": "{'best_test_acc': 90.48,\n 'best_train_acc': 96.356,\n 'best_train_loss': 0.116,\n 'config': {'base_lr': 0.1,\n 'cell_spec': {},\n 'dataset': 'cifar10',\n 'generator': 'random',\n 'id': 45505,\n 'model_family': 'residual_bottleneck',\n 'model_spec': {'bot_muls': [0.0, 0.25, 0.25, 0.25],\n 'ds': [1, 16, 1, 4],\n 'num_gs': [1, 2, 1, 2],\n 'ss': [1, 1, 2, 2],\n 'ws': [16, 64, 128, 16]},\n 'num_epochs': 100,\n 'proposer': 'resnext-a',\n 'weight_decay': 0.0005},\n 'final_test_acc': 90.39,\n 'final_train_acc': 96.298,\n 'final_train_loss': 0.116,\n 'flops': 69.890986,\n 'id': 45505,\n 'iter_time': 0.065,\n 'parameters': 0.083002,\n 'seed': 1}\n" - } - ], - "source": [ - "model_spec = {\n", - " 'bot_muls': [0.0, 0.25, 0.25, 0.25],\n", - " 'ds': [1, 16, 1, 4],\n", - " 'num_gs': [1, 2, 1, 2],\n", - " 'ss': [1, 1, 2, 2],\n", - " 'ws': [16, 64, 128, 16]\n", - "}\n", - "# Use none as a wildcard\n", - "for t in query_nds_trial_stats('residual_bottleneck', None, None, model_spec, None, 'cifar10'):\n", - " pprint.pprint(t)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "tags": [] - }, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the following architecture as an example:\n", + "\n", + "![nas-101](../../img/nas-bench-101-example.png)" + ] + }, { - "output_type": "stream", - "name": "stdout", - "text": "[{'current_epoch': 1,\n 'id': 4494501,\n 'test_acc': 41.76,\n 'train_acc': 30.421000000000006,\n 'train_loss': 1.793},\n {'current_epoch': 2,\n 'id': 4494502,\n 'test_acc': 54.66,\n 'train_acc': 47.24,\n 'train_loss': 1.415},\n {'current_epoch': 3,\n 'id': 4494503,\n 'test_acc': 59.97,\n 'train_acc': 56.983,\n 'train_loss': 1.179},\n {'current_epoch': 4,\n 'id': 4494504,\n 'test_acc': 62.91,\n 'train_acc': 61.955,\n 'train_loss': 1.048},\n {'current_epoch': 5,\n 'id': 4494505,\n 'test_acc': 66.16,\n 'train_acc': 64.493,\n 'train_loss': 0.983},\n {'current_epoch': 6,\n 'id': 4494506,\n 'test_acc': 66.5,\n 'train_acc': 66.274,\n 'train_loss': 0.937},\n {'current_epoch': 7,\n 'id': 4494507,\n 'test_acc': 67.55,\n 'train_acc': 67.426,\n 'train_loss': 0.907},\n {'current_epoch': 8,\n 'id': 4494508,\n 'test_acc': 69.45,\n 'train_acc': 68.45400000000001,\n 'train_loss': 0.878},\n {'current_epoch': 9,\n 'id': 4494509,\n 'test_acc': 70.14,\n 'train_acc': 69.295,\n 'train_loss': 0.857},\n {'current_epoch': 10,\n 'id': 4494510,\n 'test_acc': 69.47,\n 'train_acc': 70.304,\n 'train_loss': 0.832}]\n" - } - ], - "source": [ - "model_spec = {\n", - " 'bot_muls': [0.0, 0.25, 0.25, 0.25],\n", - " 'ds': [1, 16, 1, 4],\n", - " 'num_gs': [1, 2, 1, 2],\n", - " 'ss': [1, 1, 2, 2],\n", - " 'ws': [16, 64, 128, 16]\n", - "}\n", - "for t in query_nds_trial_stats('residual_bottleneck', None, None, model_spec, None, 'cifar10', include_intermediates=True):\n", - " pprint.pprint(t['intermediates'][:10])" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "tags": [] - }, - "outputs": [ + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "arch = {\n", + " 'op1': 'conv3x3-bn-relu',\n", + " 'op2': 'maxpool3x3',\n", + " 'op3': 'conv3x3-bn-relu',\n", + " 'op4': 'conv3x3-bn-relu',\n", + " 'op5': 'conv1x1-bn-relu',\n", + " 'input1': [0],\n", + " 'input2': [1],\n", + " 'input3': [2],\n", + " 'input4': [0],\n", + " 'input5': [0, 3, 4],\n", + " 'input6': [2, 5]\n", + "}\n", + "for t in query_nb101_trial_stats(arch, 108, include_intermediates=True):\n", + " pprint.pprint(t)" + ] + }, { - "output_type": "stream", - "name": "stdout", - "text": "{'best_test_acc': 93.58,\n 'best_train_acc': 99.772,\n 'best_train_loss': 0.011,\n 'config': {'base_lr': 0.1,\n 'cell_spec': {},\n 'dataset': 'cifar10',\n 'generator': 'random',\n 'id': 108998,\n 'model_family': 'residual_basic',\n 'model_spec': {'ds': [1, 12, 12, 12],\n 'ss': [1, 1, 2, 2],\n 'ws': [16, 24, 24, 40]},\n 'num_epochs': 100,\n 'proposer': 'resnet',\n 'weight_decay': 0.0005},\n 'final_test_acc': 93.49,\n 'final_train_acc': 99.772,\n 'final_train_loss': 0.011,\n 'flops': 184.519578,\n 'id': 108998,\n 'iter_time': 0.059,\n 'parameters': 0.594138,\n 'seed': 1}\n" - } - ], - "source": [ - "model_spec = {'ds': [1, 12, 12, 12], 'ss': [1, 1, 2, 2], 'ws': [16, 24, 24, 40]}\n", - "for t in query_nds_trial_stats('residual_basic', 'resnet', 'random', model_spec, {}, 'cifar10'):\n", - " pprint.pprint(t)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "tags": [] - }, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "An architecture of NAS-Bench-101 could be trained more than once. Each element of the returned generator is a dict which contains one of the training results of this trial config (architecture + hyper-parameters) including train/valid/test accuracy, training time, number of epochs, etc. The results of NAS-Bench-201 and NDS follow similar formats." + ] + }, { - "output_type": "stream", - "name": "stdout", - "text": "{'best_test_acc': 84.5,\n 'best_train_acc': 89.66499999999999,\n 'best_train_loss': 0.302,\n 'config': {'base_lr': 0.1,\n 'cell_spec': {},\n 'dataset': 'cifar10',\n 'generator': 'random',\n 'id': 139492,\n 'model_family': 'vanilla',\n 'model_spec': {'ds': [1, 12, 12, 12],\n 'ss': [1, 1, 2, 2],\n 'ws': [16, 24, 32, 40]},\n 'num_epochs': 100,\n 'proposer': 'vanilla',\n 'weight_decay': 0.0005},\n 'final_test_acc': 84.35,\n 'final_train_acc': 89.633,\n 'final_train_loss': 0.303,\n 'flops': 208.36393,\n 'id': 154692,\n 'iter_time': 0.058,\n 'parameters': 0.68977,\n 'seed': 1}\n" - } - ], - "source": [ - "# get the first one\n", - "pprint.pprint(next(query_nds_trial_stats('vanilla', None, None, None, None, None)))" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "tags": [] - }, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NAS-Bench-201" + ] + }, { - "output_type": "stream", - "name": "stdout", - "text": "{'best_test_acc': 93.37,\n 'best_train_acc': 99.91,\n 'best_train_loss': 0.006,\n 'config': {'base_lr': 0.1,\n 'cell_spec': {'normal_0_input_x': 0,\n 'normal_0_input_y': 1,\n 'normal_0_op_x': 'avg_pool_3x3',\n 'normal_0_op_y': 'conv_7x1_1x7',\n 'normal_1_input_x': 2,\n 'normal_1_input_y': 0,\n 'normal_1_op_x': 'sep_conv_3x3',\n 'normal_1_op_y': 'sep_conv_5x5',\n 'normal_2_input_x': 2,\n 'normal_2_input_y': 2,\n 'normal_2_op_x': 'dil_sep_conv_3x3',\n 'normal_2_op_y': 'dil_sep_conv_3x3',\n 'normal_3_input_x': 4,\n 'normal_3_input_y': 4,\n 'normal_3_op_x': 'skip_connect',\n 'normal_3_op_y': 'dil_sep_conv_3x3',\n 'normal_4_input_x': 2,\n 'normal_4_input_y': 4,\n 'normal_4_op_x': 'conv_7x1_1x7',\n 'normal_4_op_y': 'sep_conv_3x3',\n 'normal_concat': [3, 5, 6],\n 'reduce_0_input_x': 0,\n 'reduce_0_input_y': 1,\n 'reduce_0_op_x': 'avg_pool_3x3',\n 'reduce_0_op_y': 'dil_sep_conv_3x3',\n 'reduce_1_input_x': 0,\n 'reduce_1_input_y': 0,\n 'reduce_1_op_x': 'sep_conv_3x3',\n 'reduce_1_op_y': 'sep_conv_3x3',\n 'reduce_2_input_x': 2,\n 'reduce_2_input_y': 0,\n 'reduce_2_op_x': 'skip_connect',\n 'reduce_2_op_y': 'sep_conv_7x7',\n 'reduce_3_input_x': 4,\n 'reduce_3_input_y': 4,\n 'reduce_3_op_x': 'conv_7x1_1x7',\n 'reduce_3_op_y': 'skip_connect',\n 'reduce_4_input_x': 0,\n 'reduce_4_input_y': 5,\n 'reduce_4_op_x': 'conv_7x1_1x7',\n 'reduce_4_op_y': 'conv_7x1_1x7',\n 'reduce_concat': [3, 6]},\n 'dataset': 'cifar10',\n 'generator': 'random',\n 'id': 1,\n 'model_family': 'nas_cell',\n 'model_spec': {'aux': False,\n 'depth': 12,\n 'drop_prob': 0.0,\n 'num_nodes_normal': 5,\n 'num_nodes_reduce': 5,\n 'width': 32},\n 'num_epochs': 100,\n 'proposer': 'amoeba',\n 'weight_decay': 0.0005},\n 'final_test_acc': 93.27,\n 'final_train_acc': 99.91,\n 'final_train_loss': 0.006,\n 'flops': 664.400586,\n 'id': 1,\n 'iter_time': 0.281,\n 'parameters': 4.190314,\n 'seed': 1}\n" - } - ], - "source": [ - "# count number\n", - "model_spec = {'num_nodes_normal': 5, 'num_nodes_reduce': 5, 'depth': 12, 'width': 32, 'aux': False, 'drop_prob': 0.0}\n", - "cell_spec = {\n", - " 'normal_0_op_x': 'avg_pool_3x3',\n", - " 'normal_0_input_x': 0,\n", - " 'normal_0_op_y': 'conv_7x1_1x7',\n", - " 'normal_0_input_y': 1,\n", - " 'normal_1_op_x': 'sep_conv_3x3',\n", - " 'normal_1_input_x': 2,\n", - " 'normal_1_op_y': 'sep_conv_5x5',\n", - " 'normal_1_input_y': 0,\n", - " 'normal_2_op_x': 'dil_sep_conv_3x3',\n", - " 'normal_2_input_x': 2,\n", - " 'normal_2_op_y': 'dil_sep_conv_3x3',\n", - " 'normal_2_input_y': 2,\n", - " 'normal_3_op_x': 'skip_connect',\n", - " 'normal_3_input_x': 4,\n", - " 'normal_3_op_y': 'dil_sep_conv_3x3',\n", - " 'normal_3_input_y': 4,\n", - " 'normal_4_op_x': 'conv_7x1_1x7',\n", - " 'normal_4_input_x': 2,\n", - " 'normal_4_op_y': 'sep_conv_3x3',\n", - " 'normal_4_input_y': 4,\n", - " 'normal_concat': [3, 5, 6],\n", - " 'reduce_0_op_x': 'avg_pool_3x3',\n", - " 'reduce_0_input_x': 0,\n", - " 'reduce_0_op_y': 'dil_sep_conv_3x3',\n", - " 'reduce_0_input_y': 1,\n", - " 'reduce_1_op_x': 'sep_conv_3x3',\n", - " 'reduce_1_input_x': 0,\n", - " 'reduce_1_op_y': 'sep_conv_3x3',\n", - " 'reduce_1_input_y': 0,\n", - " 'reduce_2_op_x': 'skip_connect',\n", - " 'reduce_2_input_x': 2,\n", - " 'reduce_2_op_y': 'sep_conv_7x7',\n", - " 'reduce_2_input_y': 0,\n", - " 'reduce_3_op_x': 'conv_7x1_1x7',\n", - " 'reduce_3_input_x': 4,\n", - " 'reduce_3_op_y': 'skip_connect',\n", - " 'reduce_3_input_y': 4,\n", - " 'reduce_4_op_x': 'conv_7x1_1x7',\n", - " 'reduce_4_input_x': 0,\n", - " 'reduce_4_op_y': 'conv_7x1_1x7',\n", - " 'reduce_4_input_y': 5,\n", - " 'reduce_concat': [3, 6]\n", - "}\n", - "\n", - "for t in query_nds_trial_stats('nas_cell', None, None, model_spec, cell_spec, 'cifar10'):\n", - " assert t['config']['model_spec'] == model_spec\n", - " assert t['config']['cell_spec'] == cell_spec\n", - " pprint.pprint(t)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "tags": [] - }, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the following architecture as an example:\n", + "\n", + "![nas-201](../../img/nas-bench-201-example.png)" + ] + }, { - "output_type": "stream", - "name": "stdout", - "text": "NDS (amoeba) count: 5107\n" - } - ], - "source": [ - "# count number\n", - "print('NDS (amoeba) count:', len(list(query_nds_trial_stats(None, 'amoeba', None, None, None, None, None))))" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "tags": [] - }, - "outputs": [ + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "arch = {\n", + " '0_1': 'avg_pool_3x3',\n", + " '0_2': 'conv_1x1',\n", + " '1_2': 'skip_connect',\n", + " '0_3': 'conv_1x1',\n", + " '1_3': 'skip_connect',\n", + " '2_3': 'skip_connect'\n", + "}\n", + "for t in query_nb201_trial_stats(arch, 200, 'cifar100'):\n", + " pprint.pprint(t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Intermediate results are also available." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "for t in query_nb201_trial_stats(arch, None, 'imagenet16-120', include_intermediates=True):\n", + " print(t['config'])\n", + " print('Intermediates:', len(t['intermediates']))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NDS" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the following architecture as an example:
\n", + "![nds](../../img/nas-bench-nds-example.png)\n", + "\n", + "Here, `bot_muls`, `ds`, `num_gs`, `ss` and `ws` stand for \"bottleneck multipliers\", \"depths\", \"number of groups\", \"strides\" and \"widths\" respectively." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "model_spec = {\n", + " 'bot_muls': [0.0, 0.25, 0.25, 0.25],\n", + " 'ds': [1, 16, 1, 4],\n", + " 'num_gs': [1, 2, 1, 2],\n", + " 'ss': [1, 1, 2, 2],\n", + " 'ws': [16, 64, 128, 16]\n", + "}\n", + "# Use none as a wildcard\n", + "for t in query_nds_trial_stats('residual_bottleneck', None, None, model_spec, None, 'cifar10'):\n", + " pprint.pprint(t)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "model_spec = {\n", + " 'bot_muls': [0.0, 0.25, 0.25, 0.25],\n", + " 'ds': [1, 16, 1, 4],\n", + " 'num_gs': [1, 2, 1, 2],\n", + " 'ss': [1, 1, 2, 2],\n", + " 'ws': [16, 64, 128, 16]\n", + "}\n", + "for t in query_nds_trial_stats('residual_bottleneck', None, None, model_spec, None, 'cifar10', include_intermediates=True):\n", + " pprint.pprint(t['intermediates'][:10])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "model_spec = {'ds': [1, 12, 12, 12], 'ss': [1, 1, 2, 2], 'ws': [16, 24, 24, 40]}\n", + "for t in query_nds_trial_stats('residual_basic', 'resnet', 'random', model_spec, {}, 'cifar10'):\n", + " pprint.pprint(t)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# get the first one\n", + "pprint.pprint(next(query_nds_trial_stats('vanilla', None, None, None, None, None)))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# count number\n", + "model_spec = {'num_nodes_normal': 5, 'num_nodes_reduce': 5, 'depth': 12, 'width': 32, 'aux': False, 'drop_prob': 0.0}\n", + "cell_spec = {\n", + " 'normal_0_op_x': 'avg_pool_3x3',\n", + " 'normal_0_input_x': 0,\n", + " 'normal_0_op_y': 'conv_7x1_1x7',\n", + " 'normal_0_input_y': 1,\n", + " 'normal_1_op_x': 'sep_conv_3x3',\n", + " 'normal_1_input_x': 2,\n", + " 'normal_1_op_y': 'sep_conv_5x5',\n", + " 'normal_1_input_y': 0,\n", + " 'normal_2_op_x': 'dil_sep_conv_3x3',\n", + " 'normal_2_input_x': 2,\n", + " 'normal_2_op_y': 'dil_sep_conv_3x3',\n", + " 'normal_2_input_y': 2,\n", + " 'normal_3_op_x': 'skip_connect',\n", + " 'normal_3_input_x': 4,\n", + " 'normal_3_op_y': 'dil_sep_conv_3x3',\n", + " 'normal_3_input_y': 4,\n", + " 'normal_4_op_x': 'conv_7x1_1x7',\n", + " 'normal_4_input_x': 2,\n", + " 'normal_4_op_y': 'sep_conv_3x3',\n", + " 'normal_4_input_y': 4,\n", + " 'normal_concat': [3, 5, 6],\n", + " 'reduce_0_op_x': 'avg_pool_3x3',\n", + " 'reduce_0_input_x': 0,\n", + " 'reduce_0_op_y': 'dil_sep_conv_3x3',\n", + " 'reduce_0_input_y': 1,\n", + " 'reduce_1_op_x': 'sep_conv_3x3',\n", + " 'reduce_1_input_x': 0,\n", + " 'reduce_1_op_y': 'sep_conv_3x3',\n", + " 'reduce_1_input_y': 0,\n", + " 'reduce_2_op_x': 'skip_connect',\n", + " 'reduce_2_input_x': 2,\n", + " 'reduce_2_op_y': 'sep_conv_7x7',\n", + " 'reduce_2_input_y': 0,\n", + " 'reduce_3_op_x': 'conv_7x1_1x7',\n", + " 'reduce_3_input_x': 4,\n", + " 'reduce_3_op_y': 'skip_connect',\n", + " 'reduce_3_input_y': 4,\n", + " 'reduce_4_op_x': 'conv_7x1_1x7',\n", + " 'reduce_4_input_x': 0,\n", + " 'reduce_4_op_y': 'conv_7x1_1x7',\n", + " 'reduce_4_input_y': 5,\n", + " 'reduce_concat': [3, 6]\n", + "}\n", + "\n", + "for t in query_nds_trial_stats('nas_cell', None, None, model_spec, cell_spec, 'cifar10'):\n", + " assert t['config']['model_spec'] == model_spec\n", + " assert t['config']['cell_spec'] == cell_spec\n", + " pprint.pprint(t)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# count number\n", + "print('NDS (amoeba) count:', len(list(query_nds_trial_stats(None, 'amoeba', None, None, None, None, None))))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NLP" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "metadata": false + } + }, + "source": [ + "Use the following two architectures as examples. \n", + "The arch in the paper is called \"receipe\" with nested variable, and now it is nunested in the benchmarks for NNI.\n", + "An arch has multiple Node, Node_input_n and Node_op, you can refer to doc for more details.\n", + "\n", + "arch1 : \n", + "\n", + "\n", + "arch2 : \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "{'config': {'arch': {'h_new_0_input_0': 'node_3',\n 'h_new_0_input_1': 'node_2',\n 'h_new_0_input_2': 'node_1',\n 'h_new_0_op': 'blend',\n 'node_0_input_0': 'x',\n 'node_0_input_1': 'h_prev_0',\n 'node_0_op': 'linear',\n 'node_1_input_0': 'node_0',\n 'node_1_op': 'activation_tanh',\n 'node_2_input_0': 'h_prev_0',\n 'node_2_input_1': 'node_1',\n 'node_2_input_2': 'x',\n 'node_2_op': 'linear',\n 'node_3_input_0': 'node_2',\n 'node_3_op': 'activation_leaky_relu'},\n 'dataset': 'ptb',\n 'id': 20003},\n 'id': 16291,\n 'test_loss': 4.680262297102549,\n 'train_loss': 4.132040537087838,\n 'training_time': 177.05208373069763,\n 'val_loss': 4.707944253177966}\n" + ] + } + ], + "source": [ + "import pprint\n", + "from nni.nas.benchmarks.nlp import query_nlp_trial_stats\n", + "\n", + "arch1 = {'h_new_0_input_0': 'node_3', 'h_new_0_input_1': 'node_2', 'h_new_0_input_2': 'node_1', 'h_new_0_op': 'blend', 'node_0_input_0': 'x', 'node_0_input_1': 'h_prev_0', 'node_0_op': 'linear','node_1_input_0': 'node_0', 'node_1_op': 'activation_tanh', 'node_2_input_0': 'h_prev_0', 'node_2_input_1': 'node_1', 'node_2_input_2': 'x', 'node_2_op': 'linear', 'node_3_input_0': 'node_2', 'node_3_op': 'activation_leaky_relu'}\n", + "for i in query_nlp_trial_stats(arch=arch1, dataset=\"ptb\"):\n", + " pprint.pprint(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[{'current_epoch': 46,\n 'id': 1796,\n 'test_loss': 6.233430054978619,\n 'train_loss': 6.4866799231542664,\n 'training_time': 146.5680329799652,\n 'val_loss': 6.326836978687959},\n {'current_epoch': 47,\n 'id': 1797,\n 'test_loss': 6.2402057403023825,\n 'train_loss': 6.485401405247535,\n 'training_time': 146.05511450767517,\n 'val_loss': 6.3239741605870865},\n {'current_epoch': 48,\n 'id': 1798,\n 'test_loss': 6.351145308363877,\n 'train_loss': 6.611281181173992,\n 'training_time': 145.8849437236786,\n 'val_loss': 6.436160816865809},\n {'current_epoch': 49,\n 'id': 1799,\n 'test_loss': 6.227155079159031,\n 'train_loss': 6.473414458249545,\n 'training_time': 145.51414465904236,\n 'val_loss': 6.313294354607077}]\n" + ] + } + ], + "source": [ + "arch2 = {\"h_new_0_input_0\":\"node_0\",\"h_new_0_input_1\":\"node_1\",\"h_new_0_op\":\"elementwise_sum\",\"node_0_input_0\":\"x\",\"node_0_input_1\":\"h_prev_0\",\"node_0_op\":\"linear\",\"node_1_input_0\":\"node_0\",\"node_1_op\":\"activation_tanh\"}\n", + "for i in query_nlp_trial_stats(arch=arch2, dataset='wikitext-2', include_intermediates=True):\n", + " pprint.pprint(i['intermediates'][45:49])" + ] + }, { - "output_type": "stream", - "name": "stdout", - "text": "Elapsed time: 2.2023813724517822 seconds\n" + "cell_type": "code", + "execution_count": 4, + "metadata": { + "pycharm": {}, + "tags": [] + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Elapsed time: 5.60982608795166 seconds\n" + ] + } + ], + "source": [ + "print('Elapsed time: ', time.time() - ti, 'seconds')" + ] } - ], - "source": [ - "print('Elapsed time: ', time.time() - ti, 'seconds')" - ] - } - ], - "metadata": { - "language_info": { - "name": "python", - "codemirror_mode": { - "name": "ipython", + ], + "metadata": { + "file_extension": ".py", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "name": "python", + "version": "3.8.5-final" + }, + "mimetype": "text/x-python", + "name": "python", + "npconvert_exporter": "python", + "orig_nbformat": 2, + "pygments_lexer": "ipython3", "version": 3 - }, - "version": "3.6.10-final" }, - "orig_nbformat": 2, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "npconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": 3, - "kernelspec": { - "name": "python361064bitnnilatestcondabff8d66a619a4d26af34fe0fe687c7b0", - "display_name": "Python 3.6.10 64-bit ('nnilatest': conda)" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 2 } \ No newline at end of file diff --git a/docs/en_US/TrainingService/AdaptDLMode.rst b/docs/en_US/TrainingService/AdaptDLMode.rst index 3b8f547e9f..f77f0c0a78 100644 --- a/docs/en_US/TrainingService/AdaptDLMode.rst +++ b/docs/en_US/TrainingService/AdaptDLMode.rst @@ -72,7 +72,7 @@ Here is a template configuration specification to use AdaptDL as a training serv path: / containerMountPath: /nfs checkpoint: # optional - storageClass: microk8s-hostpath + storageClass: dfs storageSize: 1Gi Those configs not mentioned below, are following the @@ -86,6 +86,7 @@ Those configs not mentioned below, are following the * **tuner**\ : It supports the Tuun tuner and all NNI built-in tuners (only except for the checkpoint feature of the NNI PBT tuners). * **trial**\ : It defines the specs of an ``adl`` trial. + * **namespace**\: (*Optional*\ ) Kubernetes namespace to launch the trials. Default to ``default`` namespace. * **adaptive**\ : (*Optional*\ ) Boolean for AdaptDL trainer. While ``true``\ , it the job is preemptible and adaptive. * **image**\ : Docker image for the trial * **imagePullSecret**\ : (*Optional*\ ) If you are using a private registry, @@ -97,7 +98,10 @@ Those configs not mentioned below, are following the * **memorySize**\ : (*Optional*\ ) the size of memory requested for this trial. It must follow the Kubernetes `default format `__. * **nfs**\ : (*Optional*\ ) mounting external storage. For more information about using NFS please check the below paragraph. - * **checkpoint** (*Optional*\ ) `storage settings `__ for AdaptDL internal checkpoints. You can keep it optional if you are not dev users. + * **checkpoint** (*Optional*\ ) storage settings for model checkpoints. + + * **storageClass**\ : check `Kubernetes storage documentation `__ for how to use the appropriate ``storageClass``. + * **storageSize**\ : this value should be large enough to fit your model's checkpoints, or it could cause "disk quota exceeded" error. NFS Storage ^^^^^^^^^^^ diff --git a/docs/en_US/Tutorial/SearchSpaceSpec.rst b/docs/en_US/Tutorial/SearchSpaceSpec.rst index 881b99a3a6..0512e4d394 100644 --- a/docs/en_US/Tutorial/SearchSpaceSpec.rst +++ b/docs/en_US/Tutorial/SearchSpaceSpec.rst @@ -255,4 +255,4 @@ Known Limitations: Note that for nested search space: - * Only Random Search/TPE/Anneal/Evolution tuner supports nested search space + * Only Random Search/TPE/Anneal/Evolution/Grid Search tuner supports nested search space diff --git a/docs/img/nas-bench-nlp-example1.jpeg b/docs/img/nas-bench-nlp-example1.jpeg new file mode 100644 index 0000000000..3f5d3fe289 Binary files /dev/null and b/docs/img/nas-bench-nlp-example1.jpeg differ diff --git a/docs/img/nas-bench-nlp-example2.jpeg b/docs/img/nas-bench-nlp-example2.jpeg new file mode 100644 index 0000000000..850d15b735 Binary files /dev/null and b/docs/img/nas-bench-nlp-example2.jpeg differ diff --git a/examples/nas/benchmarks/.gitignore b/examples/nas/benchmarks/.gitignore index be45d0a317..d04628aeea 100644 --- a/examples/nas/benchmarks/.gitignore +++ b/examples/nas/benchmarks/.gitignore @@ -2,3 +2,4 @@ nasbench_full.tfrecord a.pth data.zip nds_data +nlp_data \ No newline at end of file diff --git a/examples/nas/benchmarks/nlp.requirements.txt b/examples/nas/benchmarks/nlp.requirements.txt new file mode 100644 index 0000000000..52b81ee53c --- /dev/null +++ b/examples/nas/benchmarks/nlp.requirements.txt @@ -0,0 +1 @@ +peewee diff --git a/examples/nas/benchmarks/nlp.sh b/examples/nas/benchmarks/nlp.sh new file mode 100644 index 0000000000..49a6b3140d --- /dev/null +++ b/examples/nas/benchmarks/nlp.sh @@ -0,0 +1,39 @@ +#!/bin/bash +set -e + +if [ -z "${NASBENCHMARK_DIR}" ]; then + NASBENCHMARK_DIR=~/.nni/nasbenchmark +fi + + +mkdir -p nlp_data +cd nlp_data +echo "Downloading NLP[1/3] wikitext2_data.zip..." +if [ -f "wikitext2_data.zip" ]; then + echo "wikitext2_data.zip found. Skip download." +else + wget -O wikitext2_data.zip https://github.com/fmsnew/nas-bench-nlp-release/blob/master/train_logs_wikitext-2/logs.zip?raw=true +fi +echo "Downloading NLP[2/3] ptb_single_run_data.zip..." +if [ -f "ptb_single_run_data.zip" ]; then + echo "ptb_single_run_data.zip found. Skip download." +else + wget -O ptb_single_run_data.zip https://github.com/fmsnew/nas-bench-nlp-release/blob/master/train_logs_single_run/logs.zip?raw=true +fi +echo "Downloading NLP[3/3] ptb_multi_runs_data.zip..." +if [ -f "ptb_multi_runs_data.zip" ]; then + echo "ptb_multi_runs_data.zip found. Skip download." +else + wget -O ptb_multi_runs_data.zip https://github.com/fmsnew/nas-bench-nlp-release/blob/master/train_logs_multi_runs/logs.zip?raw=true +fi +echo "### there exits duplicate log_files in ptb_single_run_data.zip and ptb_multi_run_data.zip, you can ignore all or replace all ###" +unzip -q wikitext2_data.zip +unzip -q ptb_single_run_data.zip +unzip -q ptb_multi_runs_data.zip +cd .. + +echo "Generating database..." +rm -f ${NASBENCHMARK_DIR}/nlp.db ${NASBENCHMARK_DIR}/nlp.db-journal +mkdir -p ${NASBENCHMARK_DIR} +python3 -m nni.nas.benchmarks.nlp.db_gen nlp_data +rm -rf nlp_data diff --git a/examples/trials/cifar10_pytorch/adl.Dockerfile b/examples/trials/cifar10_pytorch/adl.Dockerfile new file mode 100644 index 0000000000..5ed36a80fe --- /dev/null +++ b/examples/trials/cifar10_pytorch/adl.Dockerfile @@ -0,0 +1,8 @@ +# Dockerfile for building AdaptDL-enabled CIFAR10 image +# Set docker build context to current folder + +FROM pytorch/pytorch:1.4-cuda10.1-cudnn7-runtime + +RUN pip install nni adaptdl tensorboard + +COPY ./ /cifar10 diff --git a/examples/trials/cifar10_pytorch/config_adl.yml b/examples/trials/cifar10_pytorch/config_adl.yml index 69058880df..94002857c3 100644 --- a/examples/trials/cifar10_pytorch/config_adl.yml +++ b/examples/trials/cifar10_pytorch/config_adl.yml @@ -17,10 +17,11 @@ tuner: #choice: maximize, minimize optimize_mode: maximize trial: + namespace: default command: python3 /cifar10/main_adl.py codeDir: /cifar10 gpuNum: 1 - image: {replace_with_the_image_that_has_adaptdl_installed} + image: {image_built_by_adl.Dockerfile} # optional imagePullSecrets: - name: {secret} diff --git a/examples/tuners/customized_tuner/meta_file.yml b/examples/tuners/customized_tuner/meta_file.yml new file mode 100644 index 0000000000..64a79f6c9f --- /dev/null +++ b/examples/tuners/customized_tuner/meta_file.yml @@ -0,0 +1,4 @@ +algoType: tuner +builtinName: demotuner +className: demo_tuner.DemoTuner +classArgsValidator: demo_tuner.MyClassArgsValidator diff --git a/examples/tuners/customized_tuner/setup.py b/examples/tuners/customized_tuner/setup.py index 9dcd16c76e..9c32114917 100644 --- a/examples/tuners/customized_tuner/setup.py +++ b/examples/tuners/customized_tuner/setup.py @@ -12,10 +12,8 @@ classifiers = [ 'Programming Language :: Python :: 3', 'License :: OSI Approved :: MIT License', - 'Operating System :: ', - 'NNI Package :: tuner :: demotuner :: demo_tuner.DemoTuner :: demo_tuner.MyClassArgsValidator' + 'Operating System :: ' ], - author = 'Microsoft NNI Team', author_email = 'nni@microsoft.com', description = 'NNI control for Neural Network Intelligence project', diff --git a/nni/algorithms/hpo/gridsearch_tuner/gridsearch_tuner.py b/nni/algorithms/hpo/gridsearch_tuner/gridsearch_tuner.py index 8a9ab0a4ed..4787b3f0ee 100644 --- a/nni/algorithms/hpo/gridsearch_tuner/gridsearch_tuner.py +++ b/nni/algorithms/hpo/gridsearch_tuner/gridsearch_tuner.py @@ -169,7 +169,7 @@ def generate_parameters(self, parameter_id, **kwargs): """ self.count += 1 while self.count <= len(self.expanded_search_space) - 1: - _params_tuple = convert_dict2tuple(self.expanded_search_space[self.count]) + _params_tuple = convert_dict2tuple(copy.deepcopy(self.expanded_search_space[self.count])) if _params_tuple in self.supplement_data: self.count += 1 else: @@ -203,6 +203,6 @@ def import_data(self, data): if not _value: logger.info("Useless trial data, value is %s, skip this trial data.", _value) continue - _params_tuple = convert_dict2tuple(_params) + _params_tuple = convert_dict2tuple(copy.deepcopy(_params)) self.supplement_data[_params_tuple] = True logger.info("Successfully import data to grid search tuner.") diff --git a/nni/nas/benchmarks/nlp/__init__.py b/nni/nas/benchmarks/nlp/__init__.py new file mode 100644 index 0000000000..9dc929727c --- /dev/null +++ b/nni/nas/benchmarks/nlp/__init__.py @@ -0,0 +1,4 @@ +from .model import NlpTrialStats, NlpIntermediateStats, NlpTrialConfig +from .query import query_nlp_trial_stats + + diff --git a/nni/nas/benchmarks/nlp/db_gen.py b/nni/nas/benchmarks/nlp/db_gen.py new file mode 100644 index 0000000000..4c11980514 --- /dev/null +++ b/nni/nas/benchmarks/nlp/db_gen.py @@ -0,0 +1,46 @@ +import json +import os +import argparse +import tqdm + +from .model import db, NlpTrialConfig, NlpTrialStats, NlpIntermediateStats + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('input_dir', help='Path to extracted NLP data dir.') + args = parser.parse_args() + with db, tqdm.tqdm(total=len(os.listdir(args.input_dir)), desc="creating tables") as pbar: + db.create_tables([NlpTrialConfig, NlpTrialStats, NlpIntermediateStats]) + json_files = os.listdir(args.input_dir) + for json_file in json_files: + pbar.update(1) + if json_file.endswith('.json'): + log_path = os.path.join(args.input_dir, json_file) + cur = json.load(open(log_path, 'r')) + arch = json.loads(cur['recepie']) + unested_arch = {} + for k in arch.keys(): + # print(k) + unested_arch['{}_op'.format(k)] = arch[k]['op'] + for i in range(len(arch[k]['input'])): + unested_arch['{}_input_{}'.format(k, i)] = arch[k]['input'][i] + config = NlpTrialConfig.create(arch=unested_arch, dataset=cur['data'][5:]) + if cur['status'] == 'OK': + trial_stats = NlpTrialStats.create(config=config, train_loss=cur['train_losses'][-1], val_loss=cur['val_losses'][-1], + test_loss=cur['test_losses'][-1], training_time=cur['wall_times'][-1]) + epochs = 50 + intermediate_stats = [] + for epoch in range(epochs): + epoch_res = { + 'train_loss' : cur['train_losses'][epoch], + 'val_loss' : cur['val_losses'][epoch], + 'test_loss' : cur['test_losses'][epoch], + 'training_time' : cur['wall_times'][epoch] + } + epoch_res.update(current_epoch=epoch + 1, trial=trial_stats) + intermediate_stats.append(epoch_res) + NlpIntermediateStats.insert_many(intermediate_stats).execute(db) + + +if __name__ == '__main__': + main() diff --git a/nni/nas/benchmarks/nlp/model.py b/nni/nas/benchmarks/nlp/model.py new file mode 100644 index 0000000000..d83ab7ff23 --- /dev/null +++ b/nni/nas/benchmarks/nlp/model.py @@ -0,0 +1,92 @@ +import os + +from peewee import CharField, FloatField, ForeignKeyField, IntegerField, Model +from playhouse.sqlite_ext import JSONField, SqliteExtDatabase + +from nni.nas.benchmarks.utils import json_dumps +from nni.nas.benchmarks.constants import DATABASE_DIR + +db = SqliteExtDatabase(os.path.join(DATABASE_DIR, 'nlp.db'), autoconnect=True) + +class NlpTrialConfig(Model): + """ + Trial config for NLP. epoch_num is fixed at 50. + + Attributes + ---------- + arch: dict + aka recepie in NAS-NLP-Benchmark repo (https://github.com/fmsnew/nas-bench-nlp-release). + an arch has multiple Node, Node_input_n and Node_op. + ``Node`` can be ``node_n`` or ``h_new_n`` or ``f/i/o/j(_act)`` etc. (n is an int number and need not to be consecutive) + ``Node_input_n`` can be ``Node`` or ``x`` etc. + ``Node_op`` can be ``linear`` or ``activation_sigm`` or ``activation_tanh`` or ``elementwise_prod`` + or ``elementwise_sum`` or ``activation_leaky_relu`` ... + e.g., {"h_new_0_input_0":"node_3","h_new_0_input_1":"x","h_new_0_op":"linear","node_2_input_0":"x", + "node_2_input_1":"h_prev_0","node_2_op":"linear","node_3_input_0":"node_2","node_3_op":"activation_leaky_relu"} + dataset: str + Dataset used. Could be ``ptb`` or ``wikitext-2``. + """ + arch = JSONField(json_dumps=json_dumps, index=True) + dataset = CharField(max_length=15, index=True, choices=[ + 'ptb', + 'wikitext-2' + ]) + + class Meta: + database = db + +class NlpTrialStats(Model): + """ + Computation statistics for NAS-NLP-Benchmark. + Each corresponds to one trial result after 50 epoch. + + Attributes + ---------- + config : NlpTrialConfig + Corresponding config for trial. + train_loss : float or None + Final loss on training data. Could be NaN (None). + val_loss : float or None + Final loss on validation data. Could be NaN (None). + test_loss : float or None + Final loss on test data. Could be NaN (None). + training_time : float + Time elapsed in seconds. aka wall_time in in NAS-NLP-Benchmark repo. + """ + config = ForeignKeyField(NlpTrialConfig, backref='trial_stats', index=True) + train_loss = FloatField(null=True) + val_loss = FloatField(null=True) + test_loss = FloatField(null=True) + training_time = FloatField(null=True) + + class Meta: + database = db + +class NlpIntermediateStats(Model): + """ + Computation statistics for NAS-NLP-Benchmark. + Each corresponds to one trial result for 1-50 epoch. + + Attributes + ---------- + config : NlpTrialConfig + Corresponding config for trial. + train_loss : float or None + Final loss on training data. Could be NaN (None). + val_loss : float or None + Final loss on validation data. Could be NaN (None). + test_loss : float or None + Final loss on test data. Could be NaN (None). + training_time : float + Time elapsed in seconds. aka wall_time in in NAS-NLP-Benchmark repo. + """ + trial = ForeignKeyField(NlpTrialStats, backref='intermediates', index=True) + current_epoch = IntegerField(index=True) + train_loss = FloatField(null=True) + val_loss = FloatField(null=True) + test_loss = FloatField(null=True) + training_time = FloatField(null=True) + + class Meta: + database = db + \ No newline at end of file diff --git a/nni/nas/benchmarks/nlp/query.py b/nni/nas/benchmarks/nlp/query.py new file mode 100644 index 0000000000..98885896b4 --- /dev/null +++ b/nni/nas/benchmarks/nlp/query.py @@ -0,0 +1,61 @@ +import functools + +from peewee import fn +from playhouse.shortcuts import model_to_dict +from .model import NlpTrialStats, NlpTrialConfig + +def query_nlp_trial_stats(arch, dataset, reduction=None, include_intermediates=False): + """ + Query trial stats of NLP benchmark given conditions, including config(arch + dataset) and training results after 50 epoch. + + Parameters + ---------- + arch : dict or None + If a dict, it is in the format that is described in + :class:`nni.nas.benchmark.nlp.NlpTrialConfig`. Only trial stats matched will be returned. + If none, all architectures in the database will be matched. + dataset : str or None + If specified, can be one of the dataset available in :class:`nni.nas.benchmark.nlp.NlpTrialConfig`. + Otherwise a wildcard. + reduction : str or None + If 'none' or None, all trial stats will be returned directly. + If 'mean', fields in trial stats will be averaged given the same trial config. + Please note that some trial configs have multiple runs which make "reduction" meaningful, while some may not. + include_intermediates : boolean + If true, intermediate results will be returned. + + Returns + ------- + generator of dict + A generator of :class:`nni.nas.benchmark.nlp.NlpTrialStats` objects, + where each of them has been converted into a dict. + """ + fields = [] + if reduction == 'none': + reduction = None + if reduction == 'mean': + for field_name in NlpTrialStats._meta.sorted_field_names: + if field_name not in ['id', 'config']: + fields.append(fn.AVG(getattr(NlpTrialStats, field_name)).alias(field_name)) + elif reduction is None: + fields.append(NlpTrialStats) + else: + raise ValueError('Unsupported reduction: \'%s\'' % reduction) + query = NlpTrialStats.select(*fields, NlpTrialConfig).join(NlpTrialConfig) + + conditions = [] + if arch is not None: + conditions.append(NlpTrialConfig.arch == arch) + if dataset is not None: + conditions.append(NlpTrialConfig.dataset == dataset) + + for trial in query.where(functools.reduce(lambda a, b: a & b, conditions)): + if include_intermediates: + data = model_to_dict(trial) + # exclude 'trial' from intermediates as it is already available in data + data['intermediates'] = [ + {k: v for k, v in model_to_dict(t).items() if k != 'trial'} for t in trial.intermediates + ] + yield data + else: + yield model_to_dict(trial) \ No newline at end of file diff --git a/nni/tools/nnictl/algo_management.py b/nni/tools/nnictl/algo_management.py new file mode 100644 index 0000000000..e671f295c4 --- /dev/null +++ b/nni/tools/nnictl/algo_management.py @@ -0,0 +1,101 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +import os +import importlib +import json +from nni.tools.package_utils import read_registerd_algo_meta, get_registered_algo_meta, \ + write_registered_algo_meta, ALGO_TYPES, parse_full_class_name +from .common_utils import print_error, print_green, get_yml_content + +def read_reg_meta_list(meta_path): + content = get_yml_content(meta_path) + if content.get('algorithms'): + meta_list = content.get('algorithms') + else: + meta_list = [content] + for meta in meta_list: + assert 'algoType' in meta + assert meta['algoType'] in ['tuner', 'assessor', 'advisor'] + assert 'builtinName' in meta + assert 'className' in meta + return meta_list + +def verify_algo_import(meta): + def _do_verify_import(fullName): + module_name, class_name = parse_full_class_name(fullName) + class_module = importlib.import_module(module_name) + getattr(class_module, class_name) + + _do_verify_import(meta['className']) + + if meta.get('classArgsValidator'): + _do_verify_import(meta['classArgsValidator']) + +def algo_reg(args): + meta_list = read_reg_meta_list(args.meta_path) + for meta in meta_list: + if get_registered_algo_meta(meta['builtinName']) is not None: + print_error('builtinName {} already registered'.format(meta['builtinName'])) + return + verify_algo_import(meta) + save_algo_meta_data(meta) + print_green('{} registered sucessfully!'.format(meta['builtinName'])) + +def algo_unreg(args): + name = args.name[0] + meta = get_registered_algo_meta(name) + if meta is None: + print_error('builtin algorithms {} not found!'.format(name)) + return + if meta['source'] == 'nni': + print_error('{} is provided by nni, can not be unregistered!'.format(name)) + return + if remove_algo_meta_data(name): + print_green('{} unregistered sucessfully!'.format(name)) + else: + print_error('Failed to unregistered {}!'.format(name)) + +def algo_show(args): + builtin_name = args.name[0] + meta = get_registered_algo_meta(builtin_name) + if meta: + print(json.dumps(meta, indent=4)) + else: + print_error('package {} not found'.format(builtin_name)) + +def algo_list(args): + meta = read_registerd_algo_meta() + print('+-----------------+------------+-----------+--------=-------------+------------------------------------------+') + print('| Name | Type | source | Class Name | Module Name |') + print('+-----------------+------------+-----------+----------------------+------------------------------------------+') + MAX_MODULE_NAME = 38 + for t in ['tuners', 'assessors', 'advisors']: + for p in meta[t]: + module_name = '.'.join(p['className'].split('.')[:-1]) + if len(module_name) > MAX_MODULE_NAME: + module_name = module_name[:MAX_MODULE_NAME-3] + '...' + class_name = p['className'].split('.')[-1] + print('| {:15s} | {:10s} | {:9s} | {:20s} | {:40s} |'.format(p['builtinName'], t, p['source'], class_name, module_name[:38])) + print('+-----------------+------------+-----------+----------------------+------------------------------------------+') + + +def save_algo_meta_data(meta_data): + meta_data['source'] = 'user' + config = read_registerd_algo_meta() + config[meta_data['algoType']+'s'].append(meta_data) + write_registered_algo_meta(config) + +def remove_algo_meta_data(name): + config = read_registerd_algo_meta() + + updated = False + for t in ALGO_TYPES: + for meta in config[t]: + if meta['builtinName'] == name: + config[t].remove(meta) + updated = True + if updated: + write_registered_algo_meta(config) + return True + return False diff --git a/nni/tools/nnictl/config_schema.py b/nni/tools/nnictl/config_schema.py index 702d290eac..b801a6eb6a 100644 --- a/nni/tools/nnictl/config_schema.py +++ b/nni/tools/nnictl/config_schema.py @@ -6,7 +6,7 @@ import os import netifaces from schema import Schema, And, Optional, Regex, Or, SchemaError -from nni.tools.package_utils import create_validator_instance, get_all_builtin_names, get_builtin_algo_meta +from nni.tools.package_utils import create_validator_instance, get_all_builtin_names, get_registered_algo_meta from .constants import SCHEMA_TYPE_ERROR, SCHEMA_RANGE_ERROR, SCHEMA_PATH_ERROR from .common_utils import get_yml_content, print_warning @@ -75,8 +75,8 @@ def __init__(self, algo_type): def validate_class_args(self, class_args, algo_type, builtin_name): if not builtin_name or not class_args: return - meta = get_builtin_algo_meta(algo_type+'s', builtin_name) - if meta and 'accept_class_args' in meta and meta['accept_class_args'] == False: + meta = get_registered_algo_meta(builtin_name, algo_type+'s') + if meta and 'acceptClassArgs' in meta and meta['acceptClassArgs'] == False: raise SchemaError('classArgs is not allowed.') logging.getLogger('nni.protocol').setLevel(logging.ERROR) # we know IPC is not there, don't complain @@ -268,6 +268,7 @@ def validate(self, data): 'command': setType('command', str), 'gpuNum': setNumberRange('gpuNum', int, 0, 99999), 'image': setType('image', str), + Optional('namespace'): setType('namespace', str), Optional('imagePullSecrets'): [{ 'name': setType('name', str) }], diff --git a/nni/tools/nnictl/constants.py b/nni/tools/nnictl/constants.py index 19b2ccc366..171dcb1262 100644 --- a/nni/tools/nnictl/constants.py +++ b/nni/tools/nnictl/constants.py @@ -61,27 +61,6 @@ TRIAL_MONITOR_TAIL = '-------------------------------------------------------------------------------------\n\n\n' -INSTALLABLE_PACKAGE_META = { - 'SMAC': { - 'type': 'tuner', - 'class_name': 'nni.algorithms.hpo.smac_tuner.smac_tuner.SMACTuner', - 'code_sub_dir': 'smac_tuner', - 'class_args_validator': 'nni.algorithms.hpo.smac_tuner.smac_tuner.SMACClassArgsValidator' - }, - 'BOHB': { - 'type': 'advisor', - 'class_name': 'nni.algorithms.hpo.bohb_advisor.bohb_advisor.BOHB', - 'code_sub_dir': 'bohb_advisor', - 'class_args_validator': 'nni.algorithms.hpo.bohb_advisor.bohb_advisor.BOHBClassArgsValidator' - }, - 'PPOTuner': { - 'type': 'tuner', - 'class_name': 'nni.algorithms.hpo.ppo_tuner.ppo_tuner.PPOTuner', - 'code_sub_dir': 'ppo_tuner', - 'class_args_validator': 'nni.algorithms.hpo.ppo_tuner.ppo_tuner.PPOClassArgsValidator' - } -} - TUNERS_SUPPORTING_IMPORT_DATA = { 'TPE', 'Anneal', diff --git a/nni/tools/nnictl/launcher.py b/nni/tools/nnictl/launcher.py index d82ee7c326..a5ccbe244a 100644 --- a/nni/tools/nnictl/launcher.py +++ b/nni/tools/nnictl/launcher.py @@ -19,7 +19,7 @@ from .common_utils import get_yml_content, get_json_content, print_error, print_normal, \ detect_port, get_user -from .constants import NNICTL_HOME_DIR, ERROR_INFO, REST_TIME_OUT, EXPERIMENT_SUCCESS_INFO, LOG_HEADER, INSTALLABLE_PACKAGE_META +from .constants import NNICTL_HOME_DIR, ERROR_INFO, REST_TIME_OUT, EXPERIMENT_SUCCESS_INFO, LOG_HEADER from .command_utils import check_output_command, kill_command from .nnictl_utils import update_experiment @@ -452,10 +452,9 @@ def launch_experiment(args, experiment_config, mode, experiment_id): except CalledProcessError: print_error('some errors happen when import package %s.' %(package_name)) print_log_content(experiment_id) - if package_name in INSTALLABLE_PACKAGE_META: - print_error('If %s is not installed, it should be installed through '\ - '\'nnictl package install --name %s\'' % (package_name, package_name)) - exit(1) + if package_name in ['SMAC', 'BOHB', 'PPOTuner']: + print_error(f'The dependencies for {package_name} can be installed through pip install nni[{package_name}]') + raise log_dir = experiment_config['logDir'] if experiment_config.get('logDir') else None log_level = experiment_config['logLevel'] if experiment_config.get('logLevel') else None #view experiment mode do not need debug function, when view an experiment, there will be no new logs created diff --git a/nni/tools/nnictl/nnictl.py b/nni/tools/nnictl/nnictl.py index 91b8caabca..82340c0543 100644 --- a/nni/tools/nnictl/nnictl.py +++ b/nni/tools/nnictl/nnictl.py @@ -13,7 +13,7 @@ monitor_experiment, export_trials_data, trial_codegen, webui_url, \ get_config, log_stdout, log_stderr, search_space_auto_gen, webui_nas, \ save_experiment, load_experiment -from .package_management import package_install, package_uninstall, package_show, package_list +from .algo_management import algo_reg, algo_unreg, algo_show, algo_list from .constants import DEFAULT_REST_PORT from .tensorboard_utils import start_tensorboard, stop_tensorboard init(autoreset=True) @@ -212,26 +212,43 @@ def parse_args(): parser_log_trial.add_argument('--trial_id', '-T', dest='trial_id', help='find trial log path by id') parser_log_trial.set_defaults(func=log_trial) - #parse package command - parser_package = subparsers.add_parser('package', help='control nni tuner and assessor packages') - # add subparsers for parser_package - parser_package_subparsers = parser_package.add_subparsers() - parser_package_install = parser_package_subparsers.add_parser('install', help='install packages') - parser_package_install.add_argument('source', nargs='?', help='installation source, can be a directory or whl file') - parser_package_install.add_argument('--name', '-n', dest='name', help='package name to be installed', required=False) - parser_package_install.set_defaults(func=package_install) + #parse algo command + parser_algo = subparsers.add_parser('algo', help='control nni builtin tuner, assessor and advisor algorithms') + # add subparsers for parser_algo + parser_algo_subparsers = parser_algo.add_subparsers() + parser_algo_reg = parser_algo_subparsers.add_parser( + 'register', + aliases=('reg',), + help='''register algorithms as nni builtin algorithm, for example: + nnictl reg --meta_path + where is the path to a meta data in yml format, + reference the nni document and examples/tuners/customized_tuner example + for the format of the yml file.''' + ) + parser_algo_reg.add_argument('--meta_path', '-m', dest='meta_path', help='path to the meta file', required=True) + parser_algo_reg.set_defaults(func=algo_reg) - parser_package_uninstall = parser_package_subparsers.add_parser('uninstall', help='uninstall packages') - parser_package_uninstall.add_argument('name', nargs=1, help='package name to be uninstalled') - parser_package_uninstall.set_defaults(func=package_uninstall) + parser_algo_unreg = parser_algo_subparsers.add_parser('unregister', aliases=('unreg',), help='unregister algorithm') + parser_algo_unreg.add_argument('name', nargs=1, help='builtin name of the algorithm') + parser_algo_unreg.set_defaults(func=algo_unreg) - parser_package_show = parser_package_subparsers.add_parser('show', help='show the information of packages') - parser_package_show.add_argument('name', nargs=1, help='builtin name of the package') - parser_package_show.set_defaults(func=package_show) + parser_algo_show = parser_algo_subparsers.add_parser('show', help='show the information of algorithm') + parser_algo_show.add_argument('name', nargs=1, help='builtin name of the algorithm') + parser_algo_show.set_defaults(func=algo_show) - parser_package_list = parser_package_subparsers.add_parser('list', help='list installed packages') - parser_package_list.add_argument('--all', action='store_true', help='list all builtin packages') - parser_package_list.set_defaults(func=package_list) + parser_algo_list = parser_algo_subparsers.add_parser('list', help='list registered algorithms') + parser_algo_list.set_defaults(func=algo_list) + + # To show message that nnictl package command is replaced by nnictl algo, to be remove in the future release. + def show_messsage_for_nnictl_package(args): + print_error('nnictl package command is replaced by nnictl algo, please run nnictl algo -h to show the usage') + + parser_package_subparsers = subparsers.add_parser('package', help='control nni tuner and assessor packages').add_subparsers() + parser_package_subparsers.add_parser('install', help='install packages').set_defaults(func=show_messsage_for_nnictl_package) + parser_package_subparsers.add_parser('uninstall', help='uninstall packages').set_defaults(func=show_messsage_for_nnictl_package) + parser_package_subparsers.add_parser('show', help='show the information of packages').set_defaults( + func=show_messsage_for_nnictl_package) + parser_package_subparsers.add_parser('list', help='list installed packages').set_defaults(func=show_messsage_for_nnictl_package) #parse tensorboard command parser_tensorboard = subparsers.add_parser('tensorboard', help='manage tensorboard') diff --git a/nni/tools/nnictl/nnictl_utils.py b/nni/tools/nnictl/nnictl_utils.py index 23a121e83f..6901ef95bb 100644 --- a/nni/tools/nnictl/nnictl_utils.py +++ b/nni/tools/nnictl/nnictl_utils.py @@ -345,9 +345,9 @@ def log_internal(args, filetype): '''internal function to call get_log_content''' file_name = get_config_filename(args) if filetype == 'stdout': - file_full_path = os.path.join(NNICTL_HOME_DIR, file_name, 'stdout') + file_full_path = os.path.join(NNICTL_HOME_DIR, file_name, 'log', 'nnictl_stdout.log') else: - file_full_path = os.path.join(NNICTL_HOME_DIR, file_name, 'stderr') + file_full_path = os.path.join(NNICTL_HOME_DIR, file_name, 'log', 'nnictl_stderr.log') print(check_output_command(file_full_path, head=args.head, tail=args.tail)) def log_stdout(args): @@ -854,8 +854,9 @@ def save_experiment(args): except IOError: print_error('Write file to %s failed!' % os.path.join(temp_nnictl_dir, '.experiment')) exit(1) - nnictl_config_dir = os.path.join(NNICTL_HOME_DIR, args.id) - shutil.copytree(nnictl_config_dir, os.path.join(temp_nnictl_dir, args.id)) + nnictl_log_dir = os.path.join(NNICTL_HOME_DIR, args.id, 'log') + shutil.copytree(nnictl_log_dir, os.path.join(temp_nnictl_dir, args.id, 'log')) + shutil.copy(os.path.join(NNICTL_HOME_DIR, args.id, '.config'), os.path.join(temp_nnictl_dir, args.id, '.config')) # Step3. Copy code dir if args.saveCodeDir: diff --git a/nni/tools/nnictl/package_management.py b/nni/tools/nnictl/package_management.py deleted file mode 100644 index 5eef340752..0000000000 --- a/nni/tools/nnictl/package_management.py +++ /dev/null @@ -1,184 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -import os -from collections import defaultdict -import json -import pkginfo -import nni -from nni.tools.package_utils import read_installed_package_meta, get_installed_package_meta, \ - write_package_meta, get_builtin_algo_meta, get_not_installable_builtin_names, ALGO_TYPES - -from .constants import INSTALLABLE_PACKAGE_META -from .common_utils import print_error, print_green -from .command_utils import install_requirements_command, call_pip_install, call_pip_uninstall - -PACKAGE_TYPES = ['tuner', 'assessor', 'advisor'] - -def install_by_name(package_name): - if package_name not in INSTALLABLE_PACKAGE_META: - raise RuntimeError('{} is not found in installable packages!'.format(package_name)) - - requirements_path = os.path.join(nni.__path__[0], 'algorithms/hpo', INSTALLABLE_PACKAGE_META[package_name]['code_sub_dir'], 'requirements.txt') - assert os.path.exists(requirements_path) - - return install_requirements_command(requirements_path) - -def package_install(args): - '''install packages''' - installed = False - try: - if args.name: - if install_by_name(args.name) == 0: - package_meta = {} - package_meta['type'] = INSTALLABLE_PACKAGE_META[args.name]['type'] - package_meta['name'] = args.name - package_meta['class_name'] = INSTALLABLE_PACKAGE_META[args.name]['class_name'] - package_meta['class_args_validator'] = INSTALLABLE_PACKAGE_META[args.name]['class_args_validator'] - save_package_meta_data(package_meta) - print_green('{} installed!'.format(args.name)) - installed = True - else: - package_meta = get_nni_meta(args.source) - if package_meta: - if call_pip_install(args.source) == 0: - save_package_meta_data(package_meta) - print_green('{} installed!'.format(package_meta['name'])) - installed = True - except Exception as e: - print_error(e) - if not installed: - print_error('installation failed!') - -def package_uninstall(args): - '''uninstall packages''' - name = args.name[0] - if name in get_not_installable_builtin_names(): - print_error('{} can not be uninstalled!'.format(name)) - exit(1) - meta = get_installed_package_meta(None, name) - if meta is None: - print_error('package {} not found!'.format(name)) - return - if 'installed_package' in meta: - call_pip_uninstall(meta['installed_package']) - if remove_package_meta_data(name): - print_green('{} uninstalled sucessfully!'.format(name)) - else: - print_error('Failed to uninstall {}!'.format(name)) - -def package_show(args): - '''show specified packages''' - builtin_name = args.name[0] - meta = get_builtin_algo_meta(builtin_name=builtin_name) - if meta: - print(json.dumps(meta, indent=4)) - else: - print_error('package {} not found'.format(builtin_name)) - -def print_package_list(meta): - print('+-----------------+------------+-----------+--------=-------------+------------------------------------------+') - print('| Name | Type | Installed | Class Name | Module Name |') - print('+-----------------+------------+-----------+----------------------+------------------------------------------+') - MAX_MODULE_NAME = 38 - for t in ['tuners', 'assessors', 'advisors']: - for p in meta[t]: - module_name = '.'.join(p['class_name'].split('.')[:-1]) - if len(module_name) > MAX_MODULE_NAME: - module_name = module_name[:MAX_MODULE_NAME-3] + '...' - class_name = p['class_name'].split('.')[-1] - print('| {:15s} | {:10s} | {:9s} | {:20s} | {:40s} |'.format(p['name'], t, p['installed'], class_name, module_name[:38])) - print('+-----------------+------------+-----------+----------------------+------------------------------------------+') - -def package_list(args): - '''list all packages''' - if args.all: - meta = get_builtin_algo_meta() - else: - meta = read_installed_package_meta() - - installed_names = defaultdict(list) - for t in ['tuners', 'assessors', 'advisors']: - for p in meta[t]: - p['installed'] = 'Yes' - installed_names[t].append(p['name']) - for k, v in INSTALLABLE_PACKAGE_META.items(): - t = v['type']+'s' - if k not in installed_names[t]: - meta[t].append({ - 'name': k, - 'class_name': v['class_name'], - 'class_args_validator': v['class_args_validator'], - 'installed': 'No' - }) - - print_package_list(meta) - -def save_package_meta_data(meta_data): - assert meta_data['type'] in PACKAGE_TYPES - assert 'name' in meta_data - assert 'class_name' in meta_data - - config = read_installed_package_meta() - - if meta_data['name'] in [x['name'] for x in config[meta_data['type']+'s']]: - raise ValueError('name %s already installed' % meta_data['name']) - - package_meta = {k: meta_data[k] for k in ['name', 'class_name', 'class_args_validator'] if k in meta_data} - if 'package_name' in meta_data: - package_meta['installed_package'] = meta_data['package_name'] - config[meta_data['type']+'s'].append(package_meta) - write_package_meta(config) - -def remove_package_meta_data(name): - config = read_installed_package_meta() - - updated = False - for t in ALGO_TYPES: - for meta in config[t]: - if meta['name'] == name: - config[t].remove(meta) - updated = True - if updated: - write_package_meta(config) - return True - return False - -def get_nni_meta(source): - if not os.path.exists(source): - print_error('{} does not exist'.format(source)) - return None - - if os.path.isdir(source): - if not os.path.exists(os.path.join(source, 'setup.py')): - print_error('setup.py not found') - return None - pkg = pkginfo.Develop(source) - else: - if not source.endswith('.whl'): - print_error('File name {} must ends with \'.whl\''.format(source)) - return False - pkg = pkginfo.Wheel(source) - - classifiers = pkg.classifiers - meta = parse_classifiers(classifiers) - meta['package_name'] = pkg.name - return meta - -def parse_classifiers(classifiers): - parts = [] - for c in classifiers: - if c.startswith('NNI Package'): - parts = [x.strip() for x in c.split('::')] - break - if len(parts) < 4 or not all(parts): - raise ValueError('Can not find correct NNI meta data in package classifiers.') - meta = { - 'type': parts[1], - 'name': parts[2], - 'class_name': parts[3] - } - if len(parts) >= 5: - meta['class_args_validator'] = parts[4] - - return meta diff --git a/nni/tools/package_utils/__init__.py b/nni/tools/package_utils/__init__.py index 9a1c004053..64702b5d4d 100644 --- a/nni/tools/package_utils/__init__.py +++ b/nni/tools/package_utils/__init__.py @@ -6,18 +6,13 @@ import os from pathlib import Path import sys - import ruamel.yaml as yaml - import nni -from .constants import BuiltinAlgorithms ALGO_TYPES = ['tuners', 'assessors', 'advisors'] def get_all_builtin_names(algo_type): - """Get all valid builtin names, including: - 1. BuiltinAlgorithms which is pre-installed. - 2. User installed packages in /config/installed_packages.yml + """Get all builtin names of registered algorithms of specified type Parameters ---------- @@ -30,109 +25,33 @@ def get_all_builtin_names(algo_type): all builtin tuner names. """ assert algo_type in ALGO_TYPES - merged_dict = _get_merged_builtin_dict() - - builtin_names = [x['name'] for x in merged_dict[algo_type]] - return builtin_names -def get_not_installable_builtin_names(algo_type=None): - """Get builtin names in BuiltinAlgorithms which do not need to be installed - and can be used once NNI is installed. + return [x['builtinName'] for x in read_registerd_algo_meta()[algo_type]] - Parameters - ---------- - algo_type: str | None - can be one of 'tuners', 'assessors', 'advisors' or None - - Returns: list of string - ------- - All builtin names of specified type, for example, if algo_type is 'tuners', returns - all builtin tuner names. - If algo_type is None, returns all builtin names of all types. - """ - if algo_type is None: - meta = BuiltinAlgorithms - else: - assert algo_type in ALGO_TYPES - meta = { - algo_type: BuiltinAlgorithms[algo_type] - } - names = [] - for t in ALGO_TYPES: - if t in meta: - names.extend([x['name'] for x in meta[t]]) - return names -def get_builtin_algo_meta(algo_type=None, builtin_name=None): - """ Get meta information of builtin algorithms from: - 1. Pre-installed BuiltinAlgorithms - 2. User installed packages in /config/installed_packages.yml +def get_registered_algo_meta(builtin_name, algo_type=None): + """ Get meta information of registered algorithms. Parameters ---------- - algo_type: str | None - can be one of 'tuners', 'assessors', 'advisors' or None - builtin_name: str | None + builtin_name: str builtin name. - - Returns: dict | list of dict | None - ------- - If builtin_name is specified, returns meta information of speicified builtin - alogorithms, for example: - { - 'name': 'Random', - 'class_name': 'nni.hyperopt_tuner.hyperopt_tuner.HyperoptTuner', - 'class_args': { - 'algorithm_name': 'random_search' - }, - 'accept_class_args': False, - 'class_args_validator': 'nni.hyperopt_tuner.hyperopt_tuner.HyperoptClassArgsValidator' - } - If builtin_name is None, returns multiple meta information in a list. - """ - merged_dict = _get_merged_builtin_dict() - - if algo_type is None and builtin_name is None: - return merged_dict - - if algo_type: - assert algo_type in ALGO_TYPES - metas = merged_dict[algo_type] - else: - metas = merged_dict['tuners'] + merged_dict['assessors'] + merged_dict['advisors'] - if builtin_name: - for m in metas: - if m['name'] == builtin_name: - return m - else: - return metas - - return None - -def get_installed_package_meta(algo_type, builtin_name): - """ Get meta information of user installed algorithms from: - /config/installed_packages.yml - - Parameters - ---------- algo_type: str | None can be one of 'tuners', 'assessors', 'advisors' or None - builtin_name: str - builtin name. Returns: dict | None ------- Returns meta information of speicified builtin alogorithms, for example: { - 'class_args_validator': 'nni.smac_tuner.smac_tuner.SMACClassArgsValidator', - 'class_name': 'nni.smac_tuner.smac_tuner.SMACTuner', - 'name': 'SMAC' + 'classArgsValidator': 'nni.smac_tuner.smac_tuner.SMACClassArgsValidator', + 'className': 'nni.smac_tuner.smac_tuner.SMACTuner', + 'builtinName': 'SMAC' } """ assert builtin_name is not None if algo_type: assert algo_type in ALGO_TYPES - config = read_installed_package_meta() + config = read_registerd_algo_meta() candidates = [] if algo_type: @@ -141,11 +60,11 @@ def get_installed_package_meta(algo_type, builtin_name): for algo_type in ALGO_TYPES: candidates.extend(config[algo_type]) for meta in candidates: - if meta['name'] == builtin_name: + if meta['builtinName'] == builtin_name: return meta return None -def _parse_full_class_name(full_class_name): +def parse_full_class_name(full_class_name): if not full_class_name: return None, None parts = full_class_name.split('.') @@ -168,10 +87,10 @@ def get_builtin_module_class_name(algo_type, builtin_name): """ assert algo_type in ALGO_TYPES assert builtin_name is not None - meta = get_builtin_algo_meta(algo_type, builtin_name) + meta = get_registered_algo_meta(builtin_name, algo_type) if not meta: return None, None - return _parse_full_class_name(meta['class_name']) + return parse_full_class_name(meta['className']) def create_validator_instance(algo_type, builtin_name): """Create instance of validator class @@ -190,10 +109,10 @@ def create_validator_instance(algo_type, builtin_name): """ assert algo_type in ALGO_TYPES assert builtin_name is not None - meta = get_builtin_algo_meta(algo_type, builtin_name) - if not meta or 'class_args_validator' not in meta: + meta = get_registered_algo_meta(builtin_name, algo_type) + if not meta or 'classArgsValidator' not in meta: return None - module_name, class_name = _parse_full_class_name(meta['class_args_validator']) + module_name, class_name = parse_full_class_name(meta['classArgsValidator']) class_module = importlib.import_module(module_name) class_constructor = getattr(class_module, class_name) @@ -229,17 +148,17 @@ class name: HyperoptTuner 2. merge user specified class args together with builtin class args. """ assert algo_meta - module_name, class_name = _parse_full_class_name(algo_meta['class_name']) + module_name, class_name = parse_full_class_name(algo_meta['className']) class_args = {} - if 'class_args' in algo_meta: - class_args = algo_meta['class_args'] + if 'classArgs' in algo_meta: + class_args = algo_meta['classArgs'] if input_class_args is not None: class_args.update(input_class_args) return module_name, class_name, class_args - algo_meta = get_builtin_algo_meta(algo_type, builtin_name) + algo_meta = get_registered_algo_meta(builtin_name, algo_type) module_name, class_name, class_args = parse_algo_meta(algo_meta, input_class_args) if importlib.util.find_spec(module_name) is None: @@ -287,15 +206,26 @@ def create_customized_class_instance(class_params): return instance -def get_package_config_path(): - # FIXME: this might not be the desired location - config_dir = Path(nni.__path__[0]).parent / 'nni_config' - if not os.path.exists(config_dir): - os.makedirs(config_dir, exist_ok=True) - return os.path.join(config_dir, 'installed_packages.yml') +def _using_conda_or_virtual_environment(): + return sys.prefix != sys.base_prefix or os.path.isdir(os.path.join(sys.prefix, 'conda-meta')) -def read_installed_package_meta(): - config_file = get_package_config_path() +def get_registered_algo_config_path(): + # Find the path for registered_algorithms.yml for this nni installation, + # the registered_algorithms.yml is copied into this location in setup.py, + # so we need to ensure that we use the same logic as setup.py to find the location. + + if _using_conda_or_virtual_environment(): + nni_config_dir = os.path.join(sys.prefix, 'nni') + elif sys.platform == 'win32': + nni_config_dir = os.path.join(os.getenv('APPDATA'), 'nni') + else: + nni_config_dir = os.path.expanduser('~/.config/nni') + if not os.path.exists(nni_config_dir): + os.makedirs(nni_config_dir, exist_ok=True) + return os.path.join(nni_config_dir, 'registered_algorithms.yml') + +def read_registerd_algo_meta(): + config_file = get_registered_algo_config_path() if os.path.exists(config_file): with open(config_file, 'r') as f: config = yaml.load(f, Loader=yaml.Loader) @@ -306,16 +236,7 @@ def read_installed_package_meta(): config[t] = [] return config -def write_package_meta(config): - config_file = get_package_config_path() +def write_registered_algo_meta(config): + config_file = get_registered_algo_config_path() with open(config_file, 'w') as f: f.write(yaml.dump(dict(config), default_flow_style=False)) - -def _get_merged_builtin_dict(): - def merge_meta_dict(d1, d2): - res = defaultdict(list) - for t in ALGO_TYPES: - res[t] = d1[t] + d2[t] - return res - - return merge_meta_dict(BuiltinAlgorithms, read_installed_package_meta()) diff --git a/nni/tools/package_utils/constants.py b/nni/tools/package_utils/constants.py deleted file mode 100644 index 952310b5f9..0000000000 --- a/nni/tools/package_utils/constants.py +++ /dev/null @@ -1,91 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT license. - -BuiltinAlgorithms = { - 'tuners': [ - { - 'name': 'TPE', - 'class_name': 'nni.algorithms.hpo.hyperopt_tuner.hyperopt_tuner.HyperoptTuner', - 'class_args': { - 'algorithm_name': 'tpe' - }, - 'class_args_validator': 'nni.algorithms.hpo.hyperopt_tuner.hyperopt_tuner.HyperoptClassArgsValidator' - }, - { - 'name': 'Random', - 'class_name': 'nni.algorithms.hpo.hyperopt_tuner.hyperopt_tuner.HyperoptTuner', - 'class_args': { - 'algorithm_name': 'random_search' - }, - 'accept_class_args': False, - 'class_args_validator': 'nni.algorithms.hpo.hyperopt_tuner.hyperopt_tuner.HyperoptClassArgsValidator' - }, - { - 'name': 'Anneal', - 'class_name': 'nni.algorithms.hpo.hyperopt_tuner.hyperopt_tuner.HyperoptTuner', - 'class_args': { - 'algorithm_name': 'anneal' - }, - 'class_args_validator': 'nni.algorithms.hpo.hyperopt_tuner.hyperopt_tuner.HyperoptClassArgsValidator' - }, - { - 'name': 'Evolution', - 'class_name': 'nni.algorithms.hpo.evolution_tuner.evolution_tuner.EvolutionTuner', - 'class_args_validator': 'nni.algorithms.hpo.evolution_tuner.evolution_tuner.EvolutionClassArgsValidator' - }, - { - 'name': 'BatchTuner', - 'class_name': 'nni.algorithms.hpo.batch_tuner.batch_tuner.BatchTuner', - 'accept_class_args': False, - }, - { - 'name': 'GridSearch', - 'class_name': 'nni.algorithms.hpo.gridsearch_tuner.gridsearch_tuner.GridSearchTuner', - 'accept_class_args': False, - }, - { - 'name': 'NetworkMorphism', - 'class_name': 'nni.algorithms.hpo.networkmorphism_tuner.networkmorphism_tuner.NetworkMorphismTuner', - 'class_args_validator': 'nni.algorithms.hpo.networkmorphism_tuner.networkmorphism_tuner.NetworkMorphismClassArgsValidator' - }, - { - 'name': 'MetisTuner', - 'class_name': 'nni.algorithms.hpo.metis_tuner.metis_tuner.MetisTuner', - 'class_args_validator': 'nni.algorithms.hpo.metis_tuner.metis_tuner.MetisClassArgsValidator' - }, - { - 'name': 'GPTuner', - 'class_name': 'nni.algorithms.hpo.gp_tuner.gp_tuner.GPTuner', - 'class_args_validator': 'nni.algorithms.hpo.gp_tuner.gp_tuner.GPClassArgsValidator' - }, - { - 'name': 'PBTTuner', - 'class_name': 'nni.algorithms.hpo.pbt_tuner.pbt_tuner.PBTTuner', - 'class_args_validator': 'nni.algorithms.hpo.pbt_tuner.pbt_tuner.PBTClassArgsValidator' - }, - { - 'name': 'RegularizedEvolutionTuner', - 'class_name': 'nni.algorithms.hpo.regularized_evolution_tuner.regularized_evolution_tuner.RegularizedEvolutionTuner', - 'class_args_validator': 'nni.algorithms.hpo.regularized_evolution_tuner.regularized_evolution_tuner.EvolutionClassArgsValidator' - } - ], - 'assessors': [ - { - 'name': 'Medianstop', - 'class_name': 'nni.algorithms.hpo.medianstop_assessor.medianstop_assessor.MedianstopAssessor', - 'class_args_validator': 'nni.algorithms.hpo.medianstop_assessor.medianstop_assessor.MedianstopClassArgsValidator' - }, - { - 'name': 'Curvefitting', - 'class_name': 'nni.algorithms.hpo.curvefitting_assessor.curvefitting_assessor.CurvefittingAssessor', - 'class_args_validator': 'nni.algorithms.hpo.curvefitting_assessor.curvefitting_assessor.CurvefittingClassArgsValidator' - }, - ], - 'advisors': [ - { - 'name': 'Hyperband', - 'class_name': 'nni.algorithms.hpo.hyperband_advisor.hyperband_advisor.Hyperband', - 'class_args_validator': 'nni.algorithms.hpo.hyperband_advisor.hyperband_advisor.HyperbandClassArgsValidator' - } - ] -} diff --git a/nni/utils.py b/nni/utils.py index 7a4e2957fe..026e0fbc64 100644 --- a/nni/utils.py +++ b/nni/utils.py @@ -109,6 +109,7 @@ def extract_scalar_history(trial_history, scalar_key='default'): def convert_dict2tuple(value): """ convert dict type to tuple to solve unhashable problem. + NOTE: this function will change original data. """ if isinstance(value, dict): for _keys in value: diff --git a/pipelines/fast-test.yml b/pipelines/fast-test.yml index 7e0fd53ece..a5808cfa58 100644 --- a/pipelines/fast-test.yml +++ b/pipelines/fast-test.yml @@ -2,25 +2,30 @@ # so that a bug in any module will cause at least one platform to fail quickly. jobs: -- job: 'ubuntu_latest' +- job: ubuntu_latest pool: # FIXME: In ubuntu-20.04 Python interpreter crashed during SMAC UT - vmImage: 'ubuntu-18.04' + vmImage: ubuntu-18.04 # This platform tests lint and doc first. steps: + - task: UsePythonVersion@0 + inputs: + versionSpec: 3.6 + displayName: Configure Python version + - script: | set -e - python3 -m pip install -U --upgrade pip setuptools - python3 -m pip install -U pytest coverage - python3 -m pip install -U pylint flake8 + python3 -m pip install --upgrade pip setuptools + python3 -m pip install pytest coverage + python3 -m pip install pylint flake8 echo "##vso[task.setvariable variable=PATH]${HOME}/.local/bin:${PATH}" - displayName: 'Install Python tools' + displayName: Install Python tools - script: | python3 setup.py develop - displayName: 'Install NNI' + displayName: Install NNI - script: | set -e @@ -28,21 +33,19 @@ jobs: yarn eslint cd ../webui yarn eslint - displayName: 'ESLint' + displayName: ESLint - script: | set -e sudo apt-get install -y pandoc - python3 -m pip install -U --upgrade pygments - python3 -m pip install -U torch==1.7.0+cpu torchvision==0.8.1+cpu -f https://download.pytorch.org/whl/torch_stable.html - python3 -m pip install -U tensorflow==2.3.1 - python3 -m pip install -U keras==2.4.2 - python3 -m pip install -U gym onnx peewee thop - python3 -m pip install -U sphinx==1.8.3 sphinx-argparse==0.2.5 sphinx-markdown-tables==0.0.9 sphinx-rtd-theme==0.4.2 sphinxcontrib-websupport==1.1.0 recommonmark==0.5.0 nbsphinx + python3 -m pip install --upgrade pygments + python3 -m pip install --upgrade torch>=1.7.0+cpu torchvision>=0.8.1+cpu -f https://download.pytorch.org/whl/torch_stable.html + python3 -m pip install --upgrade tensorflow + python3 -m pip install --upgrade gym onnx peewee thop + python3 -m pip install sphinx==1.8.3 sphinx-argparse==0.2.5 sphinx-markdown-tables==0.0.9 sphinx-rtd-theme==0.4.2 sphinxcontrib-websupport==1.1.0 recommonmark==0.5.0 nbsphinx sudo apt-get install swig -y - nnictl package install --name=SMAC - nnictl package install --name=BOHB - displayName: 'Install extra dependencies' + python3 -m pip install -e .[SMAC,BOHB] + displayName: Install extra dependencies - script: | set -e @@ -50,17 +53,17 @@ jobs: python3 -m flake8 nni --count --select=E9,F63,F72,F82 --show-source --statistics EXCLUDES=examples/trials/mnist-nas/*/mnist*.py,examples/trials/nas_cifar10/src/cifar10/general_child.py python3 -m flake8 examples --count --exclude=$EXCLUDES --select=E9,F63,F72,F82 --show-source --statistics - displayName: 'pylint and flake8' + displayName: pylint and flake8 - script: | cd docs/en_US sphinx-build -M html . _build -W --keep-going -T - displayName: 'Check Sphinx documentation' + displayName: Check Sphinx documentation - script: | cd test python3 -m pytest ut - displayName: 'Python unit test' + displayName: Python unit test - script: | set -e @@ -68,52 +71,56 @@ jobs: yarn test cd ../nasui CI=true yarn test - displayName: 'TypeScript unit test' + displayName: TypeScript unit test - script: | cd test python3 nni_test/nnitest/run_tests.py --config config/pr_tests.yml - displayName: 'Simple integration test' + displayName: Simple integration test -- job: 'ubuntu_legacy' +- job: ubuntu_legacy pool: - vmImage: 'ubuntu-18.04' + vmImage: ubuntu-18.04 # This platform runs integration test first. steps: + - task: UsePythonVersion@0 + inputs: + versionSpec: 3.6 + displayName: Configure Python version + - script: | set -e - python3 -m pip install -U --upgrade pip setuptools - python3 -m pip install -U pytest coverage + python -m pip install --upgrade pip setuptools + python -m pip install pytest coverage echo "##vso[task.setvariable variable=PATH]${HOME}/.local/bin:${PATH}" - displayName: 'Install Python tools' + displayName: Install Python tools - script: | - python3 setup.py develop - displayName: 'Install NNI' + python setup.py develop + displayName: Install NNI - script: | set -e - python3 -m pip install -U torch==1.5.0+cpu torchvision==0.6.0+cpu -f https://download.pytorch.org/whl/torch_stable.html - python3 -m pip install -U tensorflow==1.15.2 - python3 -m pip install -U keras==2.1.6 - python3 -m pip install -U gym onnx peewee + python -m pip install torch==1.5.0+cpu torchvision==0.6.0+cpu -f https://download.pytorch.org/whl/torch_stable.html + python -m pip install tensorflow==1.15.4 + python -m pip install keras==2.1.6 + python -m pip install gym onnx peewee sudo apt-get install swig -y - nnictl package install --name=SMAC - nnictl package install --name=BOHB - displayName: 'Install extra dependencies' + python -m pip install -e .[SMAC,BOHB] + displayName: Install extra dependencies - script: | cd test - python3 nni_test/nnitest/run_tests.py --config config/pr_tests.yml - displayName: 'Simple integration test' + python nni_test/nnitest/run_tests.py --config config/pr_tests.yml + displayName: Simple integration test - script: | cd test - python3 -m pytest ut - displayName: 'Python unit test' + python -m pytest ut + displayName: Python unit test - script: | set -e @@ -121,12 +128,12 @@ jobs: yarn test cd ../nasui CI=true yarn test - displayName: 'TypeScript unit test' + displayName: TypeScript unit test -- job: 'macos' +- job: macos pool: - vmImage: 'macOS-10.15' + vmImage: macOS-10.15 # This platform runs TypeScript unit test first. @@ -134,86 +141,91 @@ jobs: - task: UsePythonVersion@0 inputs: versionSpec: 3.8 - displayName: Configure Python + displayName: Configure Python version - script: | set -e echo "##vso[task.setvariable variable=PATH]${PATH}:${HOME}/.local/bin" - python -m pip install -U --upgrade pip setuptools wheel - python -m pip install -U pytest coverage - displayName: 'Install Python tools' + python -m pip install --upgrade pip setuptools wheel + python -m pip install pytest coverage + displayName: Install Python tools - script: | - python3 setup.py develop - displayName: 'Install NNI' + python setup.py develop + displayName: Install NNI - script: | set -e export CI=true (cd ts/nni_manager && yarn test) (cd ts/nasui && yarn test) - displayName: 'TypeScript unit test' + displayName: TypeScript unit test - script: | set -e # pytorch Mac binary does not support CUDA, default is cpu version - python3 -m pip install -U torchvision==0.6.0 torch==1.5.0 - python3 -m pip install -U tensorflow==2.3.1 + python -m pip install torchvision==0.6.0 torch==1.5.0 + python -m pip install tensorflow==2.3.1 brew install swig@3 rm -f /usr/local/bin/swig ln -s /usr/local/opt/swig\@3/bin/swig /usr/local/bin/swig - nnictl package install --name=SMAC - displayName: 'Install extra dependencies' + python -m pip install -e .[SMAC] + displayName: Install extra dependencies - script: | cd test - python3 -m pytest ut - displayName: 'Python unit test' + python -m pytest ut + displayName: Python unit test - script: | cd test - python3 nni_test/nnitest/run_tests.py --config config/pr_tests.yml - displayName: 'Simple integration test' + python nni_test/nnitest/run_tests.py --config config/pr_tests.yml + displayName: Simple integration test # FIXME: Windows UT is still under debugging -- job: 'windows' +- job: windows pool: - vmImage: 'windows-2019' + vmImage: windows-2019 # This platform runs Python unit test first. steps: + - task: UsePythonVersion@0 + inputs: + versionSpec: 3.8 + displayName: Configure Python version + - script: | - python -m pip install -U --upgrade pip setuptools - python -m pip install -U pytest coverage - displayName: 'Install Python tools' + python -m pip install --upgrade pip setuptools + python -m pip install pytest coverage + displayName: Install Python tools - script: | python setup.py develop --no-user - displayName: 'Install NNI' + displayName: Install NNI - script: | - python -m pip install -U scikit-learn==0.23.2 - python -m pip install -U torch==1.5.0+cpu torchvision==0.6.0+cpu -f https://download.pytorch.org/whl/torch_stable.html - python -m pip install -U tensorflow==2.3.1 - displayName: 'Install extra dependencies' + python -m pip install scikit-learn==0.23.2 + python -m pip install torch==1.5.0+cpu torchvision==0.6.0+cpu -f https://download.pytorch.org/whl/torch_stable.html + python -m pip install tensorflow==2.3.1 + displayName: Install extra dependencies - script: | cd test python -m pytest ut - displayName: 'Python unit test' + displayName: Python unit test - script: | cd ts/nni_manager yarn test - displayName: 'TypeScript unit test' + displayName: TypeScript unit test - script: | cd test python nni_test/nnitest/run_tests.py --config config/pr_tests.yml - displayName: 'Simple integration test' + displayName: Simple integration test trigger: diff --git a/setup.py b/setup.py index c4da557267..a31129e9a6 100644 --- a/setup.py +++ b/setup.py @@ -65,7 +65,6 @@ 'ruamel.yaml', 'requests', 'responses', - 'scipy', 'schema', 'PythonWebHDFS', 'colorama', @@ -77,7 +76,9 @@ 'dataclasses ; python_version < "3.7"', 'numpy < 1.19.4 ; sys_platform == "win32"', 'numpy < 1.20 ; sys_platform != "win32" and python_version < "3.7"', - 'numpy ; sys.platform != "win32" and python_version >= "3.7"' + 'numpy ; sys.platform != "win32" and python_version >= "3.7"', + 'scipy < 1.6 ; python_version < "3.7"', + 'scipy ; python_version >= "3.7"', ] release = os.environ.get('NNI_RELEASE') @@ -110,6 +111,14 @@ def _setup(): python_requires = '>=3.6', install_requires = dependencies, + extras_require = { + 'SMAC': [ + 'ConfigSpaceNNI @ git+https://github.com/QuanluZhang/ConfigSpace.git', + 'smac @ git+https://github.com/QuanluZhang/SMAC3.git' + ], + 'BOHB': ['ConfigSpace==0.4.7', 'statsmodels==0.10.0'], + 'PPOTuner': ['enum34', 'gym'] + }, setup_requires = ['requests'], entry_points = { @@ -157,6 +166,19 @@ def _find_node_files(): def _using_conda_or_virtual_environment(): return sys.prefix != sys.base_prefix or os.path.isdir(os.path.join(sys.prefix, 'conda-meta')) +def _copy_data_files(): + # after installation, nni needs to find this location in nni.tools.package_utils.get_registered_algo_config_path + # since we can not import nni here, we need to ensure get_registered_algo_config_path use the same + # logic here to retrieve registered_algorithms.yml + if _using_conda_or_virtual_environment(): + nni_config_dir = os.path.join(sys.prefix, 'nni') + elif sys.platform == 'win32': + nni_config_dir = os.path.join(os.getenv('APPDATA'), 'nni') + else: + nni_config_dir = os.path.expanduser('~/.config/nni') + if not os.path.exists(nni_config_dir): + os.makedirs(nni_config_dir) + shutil.copyfile('./deployment/registered_algorithms.yml', os.path.join(nni_config_dir, 'registered_algorithms.yml')) class BuildTs(Command): description = 'build TypeScript modules' @@ -178,6 +200,7 @@ def run(self): sys.exit('Please set environment variable "NNI_RELEASE="') if os.path.islink('nni_node/main.js'): sys.exit('A development build already exists. Please uninstall NNI and run "python3 setup.py clean --all".') + _copy_data_files() super().run() class Develop(develop): @@ -203,6 +226,7 @@ def finalize_options(self): def run(self): if not self.skip_ts: setup_ts.build(release=None) + _copy_data_files() super().run() class Clean(clean): diff --git a/ts/nni_manager/rest_server/restValidationSchemas.ts b/ts/nni_manager/rest_server/restValidationSchemas.ts index be2c08d427..fff2551e38 100644 --- a/ts/nni_manager/rest_server/restValidationSchemas.ts +++ b/ts/nni_manager/rest_server/restValidationSchemas.ts @@ -101,6 +101,7 @@ export namespace ValidationSchemas { name: joi.string().min(1).required() }), // ############## adl ############### + namespace: joi.string(), adaptive: joi.boolean(), checkpoint: joi.object({ storageClass: joi.string().min(1).required(), diff --git a/ts/nni_manager/training_service/kubernetes/adl/adlApiClient.ts b/ts/nni_manager/training_service/kubernetes/adl/adlApiClient.ts index 36584b66be..ab5ac5be9e 100644 --- a/ts/nni_manager/training_service/kubernetes/adl/adlApiClient.ts +++ b/ts/nni_manager/training_service/kubernetes/adl/adlApiClient.ts @@ -13,14 +13,17 @@ class AdlClientV1 extends KubernetesCRDClient { /** * constructor, to initialize adl CRD definition */ - public constructor() { + protected readonly namespace: string; + + public constructor(namespace: string) { super(); + this.namespace = namespace; this.crdSchema = JSON.parse(fs.readFileSync('./config/adl/adaptdl-crd-v1.json', 'utf8')); this.client.addCustomResourceDefinition(this.crdSchema); } protected get operator(): any { - return this.client.apis['adaptdl.petuum.com'].v1.namespaces('default').adaptdljobs; + return this.client.apis['adaptdl.petuum.com'].v1.namespaces(this.namespace).adaptdljobs; } public get containerName(): string { @@ -29,7 +32,7 @@ class AdlClientV1 extends KubernetesCRDClient { public async getKubernetesPods(jobName: string): Promise { let result: Promise; - const response = await this.client.api.v1.namespaces('default').pods + const response = await this.client.api.v1.namespaces(this.namespace).pods .get({ qs: { labelSelector: `adaptdl/job=${jobName}` } }); if (response.statusCode && (response.statusCode >= 200 && response.statusCode <= 299)) { result = Promise.resolve(response.body); @@ -47,8 +50,8 @@ class AdlClientFactory { /** * Factory method to generate operator client */ - public static createClient(): KubernetesCRDClient { - return new AdlClientV1(); + public static createClient(namespace: string): KubernetesCRDClient { + return new AdlClientV1(namespace); } } diff --git a/ts/nni_manager/training_service/kubernetes/adl/adlConfig.ts b/ts/nni_manager/training_service/kubernetes/adl/adlConfig.ts index 682a3e01cb..17f7d480f0 100644 --- a/ts/nni_manager/training_service/kubernetes/adl/adlConfig.ts +++ b/ts/nni_manager/training_service/kubernetes/adl/adlConfig.ts @@ -58,6 +58,8 @@ export class AdlTrialConfig extends KubernetesTrialConfig { public readonly image: string; + public readonly namespace?: string; + public readonly imagePullSecrets?: ImagePullSecretConfig[]; public readonly nfs?: NFSConfig; @@ -72,7 +74,8 @@ export class AdlTrialConfig extends KubernetesTrialConfig { constructor(codeDir: string, command: string, gpuNum: number, - image: string, imagePullSecrets?: ImagePullSecretConfig[], + image: string, namespace?: string, + imagePullSecrets?: ImagePullSecretConfig[], nfs?: NFSConfig, checkpoint?: CheckpointConfig, cpuNum?: number, memorySize?: string, adaptive?: boolean @@ -81,6 +84,7 @@ export class AdlTrialConfig extends KubernetesTrialConfig { this.command = command; this.gpuNum = gpuNum; this.image = image; + this.namespace = namespace; this.imagePullSecrets = imagePullSecrets; this.nfs = nfs; this.checkpoint = checkpoint; diff --git a/ts/nni_manager/training_service/kubernetes/adl/adlJobInfoCollector.ts b/ts/nni_manager/training_service/kubernetes/adl/adlJobInfoCollector.ts index 5e9eb5bc60..3be29ec433 100644 --- a/ts/nni_manager/training_service/kubernetes/adl/adlJobInfoCollector.ts +++ b/ts/nni_manager/training_service/kubernetes/adl/adlJobInfoCollector.ts @@ -16,21 +16,21 @@ export class AdlJobInfoCollector extends KubernetesJobInfoCollector { super(jobMap); } - protected async retrieveSingleTrialJobInfo(kubernetesCRDClient: AdlClientV1 | undefined, + protected async retrieveSingleTrialJobInfo(adlClient: AdlClientV1 | undefined, kubernetesTrialJob: KubernetesTrialJobDetail): Promise { if (!this.statusesNeedToCheck.includes(kubernetesTrialJob.status)) { return Promise.resolve(); } - if (kubernetesCRDClient === undefined) { - return Promise.reject('kubernetesCRDClient is undefined'); + if (adlClient === undefined) { + return Promise.reject('AdlClient is undefined'); } let kubernetesJobInfo: any; let kubernetesPodsInfo: any; try { - kubernetesJobInfo = await kubernetesCRDClient.getKubernetesJob(kubernetesTrialJob.kubernetesJobName); - kubernetesPodsInfo = await kubernetesCRDClient.getKubernetesPods(kubernetesTrialJob.kubernetesJobName); + kubernetesJobInfo = await adlClient.getKubernetesJob(kubernetesTrialJob.kubernetesJobName); + kubernetesPodsInfo = await adlClient.getKubernetesPods(kubernetesTrialJob.kubernetesJobName); } catch (error) { // Notice: it maynot be a 'real' error since cancel trial job can also cause getKubernetesJob failed. this.log.error(`Get job ${kubernetesTrialJob.kubernetesJobName} info failed, error is ${error}`); diff --git a/ts/nni_manager/training_service/kubernetes/adl/adlTrainingService.ts b/ts/nni_manager/training_service/kubernetes/adl/adlTrainingService.ts index 9a07f022b7..53663dac4c 100644 --- a/ts/nni_manager/training_service/kubernetes/adl/adlTrainingService.ts +++ b/ts/nni_manager/training_service/kubernetes/adl/adlTrainingService.ts @@ -39,7 +39,6 @@ class AdlTrainingService extends KubernetesTrainingService implements Kubernetes super(); this.adlJobInfoCollector = new AdlJobInfoCollector(this.trialJobsMap); this.experimentId = getExperimentId(); - this.kubernetesCRDClient = AdlClientFactory.createClient(); this.configmapTemplateStr = fs.readFileSync( './config/adl/adaptdl-nni-configmap-template.json', 'utf8'); this.jobTemplateStr = fs.readFileSync('./config/adl/adaptdljob-template.json', 'utf8'); @@ -294,15 +293,34 @@ python3 -m nni.tools.trial_tool.trial_keeper --trial_command '{8}' \ return Promise.resolve(runScript); } + public async cleanUp(): Promise { + super.cleanUp(); + + // Delete Tensorboard deployment + try { + await this.genericK8sClient.deleteDeployment("adaptdl-tensorboard-" + this.experimentId.toLowerCase()); + this.log.info('tensorboard deployment deleted'); + } catch (error) { + this.log.error(`tensorboard deployment deletion failed: ${error.message}`); + } + } + public async setClusterMetadata(key: string, value: string): Promise { this.log.info('SetCluster ' + key + ', ' +value); switch (key) { case TrialConfigMetadataKey.NNI_MANAGER_IP: this.nniManagerIpConfig = JSON.parse(value); break; - case TrialConfigMetadataKey.TRIAL_CONFIG: + case TrialConfigMetadataKey.TRIAL_CONFIG: { this.adlTrialConfig = JSON.parse(value); + let namespace: string = 'default'; + if (this.adlTrialConfig.namespace !== undefined) { + namespace = this.adlTrialConfig.namespace; + } + this.genericK8sClient.setNamespace = namespace; + this.kubernetesCRDClient = AdlClientFactory.createClient(namespace); break; + } case TrialConfigMetadataKey.VERSION_CHECK: this.versionCheck = (value === 'true' || value === 'True'); break; diff --git a/ts/nni_manager/training_service/kubernetes/kubernetesApiClient.ts b/ts/nni_manager/training_service/kubernetes/kubernetesApiClient.ts index 4156a2bc4a..1f9c06f5c9 100644 --- a/ts/nni_manager/training_service/kubernetes/kubernetesApiClient.ts +++ b/ts/nni_manager/training_service/kubernetes/kubernetesApiClient.ts @@ -8,17 +8,22 @@ import { Client1_10, config } from 'kubernetes-client'; import { getLogger, Logger } from '../../common/log'; /** - * Generict Kubernetes client, target version >= 1.9 + * Generic Kubernetes client, target version >= 1.9 */ class GeneralK8sClient { protected readonly client: any; protected readonly log: Logger = getLogger(); + protected namespace: string = 'default'; constructor() { this.client = new Client1_10({ config: config.fromKubeconfig(), version: '1.9'}); this.client.loadSpec(); } + public set setNamespace(namespace: string) { + this.namespace = namespace; + } + private matchStorageClass(response: any): string { const adlSupportedProvisioners: RegExp[] = [ new RegExp("microk8s.io/hostpath"), @@ -60,7 +65,8 @@ class GeneralK8sClient { public async createDeployment(deploymentManifest: any): Promise { let result: Promise; - const response: any = await this.client.apis.apps.v1.namespaces('default').deployments.post({ body: deploymentManifest }) + const response: any = await this.client.apis.apps.v1.namespaces(this.namespace) + .deployments.post({ body: deploymentManifest }) if (response.statusCode && (response.statusCode >= 200 && response.statusCode <= 299)) { result = Promise.resolve(response.body.metadata.uid); } else { @@ -72,7 +78,7 @@ class GeneralK8sClient { public async deleteDeployment(deploymentName: string): Promise { let result: Promise; // TODO: change this hard coded deployment name after demo - const response: any = await this.client.apis.apps.v1.namespaces('default') + const response: any = await this.client.apis.apps.v1.namespaces(this.namespace) .deployment(deploymentName).delete(); if (response.statusCode && (response.statusCode >= 200 && response.statusCode <= 299)) { result = Promise.resolve(true); @@ -84,7 +90,7 @@ class GeneralK8sClient { public async createConfigMap(configMapManifest: any): Promise { let result: Promise; - const response: any = await this.client.api.v1.namespaces('default') + const response: any = await this.client.api.v1.namespaces(this.namespace) .configmaps.post({body: configMapManifest}); if (response.statusCode && (response.statusCode >= 200 && response.statusCode <= 299)) { result = Promise.resolve(true); @@ -97,7 +103,7 @@ class GeneralK8sClient { public async createPersistentVolumeClaim(pvcManifest: any): Promise { let result: Promise; - const response: any = await this.client.api.v1.namespaces('default') + const response: any = await this.client.api.v1.namespaces(this.namespace) .persistentvolumeclaims.post({body: pvcManifest}); if (response.statusCode && (response.statusCode >= 200 && response.statusCode <= 299)) { result = Promise.resolve(true); @@ -109,8 +115,8 @@ class GeneralK8sClient { public async createSecret(secretManifest: any): Promise { let result: Promise; - const response: any = await this.client.api.v1.namespaces('default').secrets - .post({body: secretManifest}); + const response: any = await this.client.api.v1.namespaces(this.namespace) + .secrets.post({body: secretManifest}); if (response.statusCode && (response.statusCode >= 200 && response.statusCode <= 299)) { result = Promise.resolve(true); } else { diff --git a/ts/nni_manager/training_service/kubernetes/kubernetesTrainingService.ts b/ts/nni_manager/training_service/kubernetes/kubernetesTrainingService.ts index 71e92d19c3..218fa87387 100644 --- a/ts/nni_manager/training_service/kubernetes/kubernetesTrainingService.ts +++ b/ts/nni_manager/training_service/kubernetes/kubernetesTrainingService.ts @@ -209,13 +209,6 @@ abstract class KubernetesTrainingService { return Promise.reject(error); } - try { - await this.genericK8sClient.deleteDeployment("adaptdl-tensorboard-" + getExperimentId().toLowerCase()) - this.log.info('tensorboard deployment deleted') - } catch (error) { - this.log.error(`tensorboard deployment deletion failed: ${error.message}`) - } - return Promise.resolve(); } diff --git a/ts/nni_manager/training_service/local/gpuScheduler.ts b/ts/nni_manager/training_service/local/gpuScheduler.ts index e7c2816474..b3f8e2c377 100644 --- a/ts/nni_manager/training_service/local/gpuScheduler.ts +++ b/ts/nni_manager/training_service/local/gpuScheduler.ts @@ -58,12 +58,12 @@ class GPUScheduler { return []; } - public getSystemGpuCount(): number { + public getSystemGpuCount(): number | undefined{ if (this.gpuSummary !== undefined) { return this.gpuSummary.gpuCount; } - return 0; + return undefined; } public async stop(): Promise { diff --git a/ts/nni_manager/training_service/local/localTrainingService.ts b/ts/nni_manager/training_service/local/localTrainingService.ts index ab9d037f99..7120cf1e3f 100644 --- a/ts/nni_manager/training_service/local/localTrainingService.ts +++ b/ts/nni_manager/training_service/local/localTrainingService.ts @@ -435,8 +435,8 @@ class LocalTrainingService implements TrainingService { } private checkSpecifiedGpuIndices(): void { - const gpuCount: number = this.gpuScheduler.getSystemGpuCount(); - if (this.designatedGpuIndices !== undefined) { + const gpuCount: number | undefined = this.gpuScheduler.getSystemGpuCount(); + if (this.designatedGpuIndices !== undefined && gpuCount !== undefined) { for (const index of this.designatedGpuIndices) { if (index >= gpuCount) { throw new Error(`Specified GPU index not found: ${index}`); diff --git a/ts/webui/src/App.scss b/ts/webui/src/App.scss index 1e85aacf9c..686a636e8d 100644 --- a/ts/webui/src/App.scss +++ b/ts/webui/src/App.scss @@ -18,6 +18,7 @@ .headerCon { width: 90%; + min-width: 1200px; max-width: 1490px; margin: 0 auto; } @@ -28,6 +29,7 @@ .content { width: 87%; + min-height: calc(100vh - 56); margin: 0 auto; min-width: 1200px; max-width: 1490px; diff --git a/ts/webui/src/App.tsx b/ts/webui/src/App.tsx index 830fb50a44..10bc23925b 100644 --- a/ts/webui/src/App.tsx +++ b/ts/webui/src/App.tsx @@ -2,6 +2,7 @@ import * as React from 'react'; import { Stack } from '@fluentui/react'; import { COLUMN } from './static/const'; import { EXPERIMENT, TRIALS } from './static/datamodel'; +import { isManagerExperimentPage } from './static/function'; import NavCon from './components/NavCon'; import MessageInfo from './components/modals/MessageInfo'; import { SlideNavBtns } from './components/slideNav/SlideNavBtns'; @@ -29,15 +30,15 @@ export const AppContext = React.createContext({ metricGraphMode: 'max', bestTrialEntries: '10', maxDurationUnit: 'm', - // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars - changeColumn: (val: string[]) => {}, - // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars - changeMetricGraphMode: (val: 'max' | 'min') => {}, - // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars - changeMaxDurationUnit: (val: string) => {}, - // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars - changeEntries: (val: string) => {}, - // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-empty-function + changeColumn: (_val: string[]): void => {}, + // eslint-disable-next-line @typescript-eslint/no-empty-function + changeMetricGraphMode: (_val: 'max' | 'min'): void => {}, + // eslint-disable-next-line @typescript-eslint/no-empty-function + changeMaxDurationUnit: (_val: string): void => {}, + // eslint-disable-next-line @typescript-eslint/no-empty-function + changeEntries: (_val: string): void => {}, + // eslint-disable-next-line @typescript-eslint/no-empty-function updateOverviewPage: () => {} }); @@ -139,69 +140,57 @@ class App extends React.Component<{}, AppState> { { errorWhere: TRIALS.latestMetricDataError(), errorMessage: TRIALS.getLatestMetricDataErrorMessage() }, { errorWhere: TRIALS.metricDataRangeError(), errorMessage: TRIALS.metricDataRangeErrorMessage() } ]; + return ( - -
-
- -
-
- - - {/* search space & config */} - - - - {/* if api has error field, show error message */} - {errorList.map( - (item, key) => - item.errorWhere && ( -
- -
- ) - )} - {isillegalFinal && ( -
- + + {isManagerExperimentPage() ? null : ( + +
+
+
- )} - - {this.props.children} - +
+ + + {/* search space & config */} + + {/* if api has error field, show error message */} + {errorList.map( + (item, key) => + item.errorWhere && ( +
+ +
+ ) + )} + {isillegalFinal && ( +
+ +
+ )} + + {this.props.children} + +
+
- - + )} +
); } diff --git a/ts/webui/src/components/NavCon.tsx b/ts/webui/src/components/NavCon.tsx index 79bd1cb3dc..40f68478db 100644 --- a/ts/webui/src/components/NavCon.tsx +++ b/ts/webui/src/components/NavCon.tsx @@ -1,35 +1,16 @@ import * as React from 'react'; import axios from 'axios'; import { WEBUIDOC, MANAGER_IP } from '../static/const'; -import { - Stack, - initializeIcons, - StackItem, - CommandBarButton, - IContextualMenuProps, - IStackTokens, - IStackStyles -} from '@fluentui/react'; +import { Stack, StackItem, CommandBarButton, IContextualMenuProps } from '@fluentui/react'; +import { Link } from 'react-router-dom'; +import { infoIconAbout, timeIcon, disableUpdates, requency, closeTimer, ChevronRightMed } from './buttons/Icon'; import ExperimentSummaryPanel from './modals/ExperimentSummaryPanel'; -import { infoIconAbout, timeIcon, disableUpdates, requency, closeTimer } from './buttons/Icon'; import { OVERVIEWTABS, DETAILTABS, NNILOGO } from './stateless-component/NNItabs'; import { EXPERIMENT } from '../static/datamodel'; +import { stackTokens, stackStyle } from './NavConst'; import '../static/style/nav/nav.scss'; import '../static/style/icon.scss'; -initializeIcons(); -const stackTokens: IStackTokens = { - childrenGap: 15 -}; -const stackStyle: IStackStyles = { - root: { - minWidth: 400, - height: 56, - display: 'flex', - verticalAlign: 'center' - } -}; - interface NavState { version: string; menuVisible: boolean; @@ -133,42 +114,50 @@ class NavCon extends React.Component { }; return ( - - {NNILOGO} - {OVERVIEWTABS} - {DETAILTABS} - - - - {/* refresh button danyi*/} - {/* TODO: fix bug */} - {/* */} -
+ + + {NNILOGO} + {OVERVIEWTABS} + {DETAILTABS} + + + + {/* refresh button danyi*/} + {/* TODO: fix bug */} + {/* */} +
+ +
{refreshFrequency}
+
-
{refreshFrequency}
-
- + +
+ All experiment + {ChevronRightMed} +
+ +
+
+ {isvisibleExperimentDrawer && ( + - -
- - {isvisibleExperimentDrawer && ( - - )} + )} + ); } diff --git a/ts/webui/src/components/NavConst.ts b/ts/webui/src/components/NavConst.ts new file mode 100644 index 0000000000..9ebb93db7c --- /dev/null +++ b/ts/webui/src/components/NavConst.ts @@ -0,0 +1,15 @@ +import { IStackTokens, IStackStyles } from '@fluentui/react'; + +const stackTokens: IStackTokens = { + childrenGap: 15 +}; +const stackStyle: IStackStyles = { + root: { + minWidth: 400, + height: 56, + display: 'flex', + verticalAlign: 'center' + } +}; + +export { stackTokens, stackStyle }; diff --git a/ts/webui/src/components/Overview.tsx b/ts/webui/src/components/Overview.tsx index 447b06671b..ab63848ee6 100644 --- a/ts/webui/src/components/Overview.tsx +++ b/ts/webui/src/components/Overview.tsx @@ -6,7 +6,7 @@ import { AppContext } from '../App'; import { Title } from './overview/Title'; import SuccessTable from './overview/table/SuccessTable'; import Accuracy from './overview/Accuracy'; -import { ReBasicInfo } from './overview/experiment/BasicInfo'; +import { BasicInfo } from './overview/params/BasicInfo'; import { ExpDuration } from './overview/count/ExpDuration'; import { ExpDurationContext } from './overview/count/ExpDurationContext'; import { TrialCount } from './overview/count/TrialCount'; @@ -86,7 +86,7 @@ class Overview extends React.Component<{}, OverviewState> { </TitleContext.Provider> <BestMetricContext.Provider value={{ bestAccuracy: bestAccuracy }}> - <ReBasicInfo /> + <BasicInfo /> </BestMetricContext.Provider> </div> {/* duration & trial numbers */} diff --git a/ts/webui/src/components/buttons/Icon.tsx b/ts/webui/src/components/buttons/Icon.tsx index b552de115d..3c221180da 100644 --- a/ts/webui/src/components/buttons/Icon.tsx +++ b/ts/webui/src/components/buttons/Icon.tsx @@ -19,6 +19,9 @@ const LineChart = <Icon iconName='LineChart' />; const Edit = <Icon iconName='Edit' />; const CheckMark = <Icon iconName='CheckMark' />; const Cancel = <Icon iconName='Cancel' />; +const ReplyAll = { iconName: 'ReplyAll' }; +const RevToggleKey = { iconName: 'RevToggleKey' }; +const ChevronRightMed = <Icon iconName='ChevronRightMed' />; export { infoIcon, @@ -37,5 +40,8 @@ export { LineChart, Edit, CheckMark, - Cancel + Cancel, + ReplyAll, + RevToggleKey, + ChevronRightMed }; diff --git a/ts/webui/src/components/managementExp/ExperimentManager.tsx b/ts/webui/src/components/managementExp/ExperimentManager.tsx new file mode 100644 index 0000000000..aebda22a61 --- /dev/null +++ b/ts/webui/src/components/managementExp/ExperimentManager.tsx @@ -0,0 +1,434 @@ +import * as React from 'react'; +import { Stack, DetailsList, DefaultButton, Icon, SearchBox, IColumn } from '@fluentui/react'; +import { ExperimentsManager } from '../../static/model/experimentsManager'; +import { expformatTimestamp, copyAndSort } from '../../static/function'; +import { AllExperimentList, SortInfo } from '../../static/interface'; +import MessageInfo from '../modals/MessageInfo'; +import { compareDate, filterByStatusOrPlatform, getSortedSource } from './expFunction'; +import { MAXSCREENCOLUMNWIDHT, MINSCREENCOLUMNWIDHT } from './experimentConst'; +import { Hearder } from './Header'; +import NameColumn from './TrialIdColumn'; +import FilterBtns from './FilterBtns'; +import '../../App.scss'; +import '../../static/style/nav/nav.scss'; +import '../../static/style/experiment/experiment.scss'; +import '../../static/style/overview/probar.scss'; +import '../../static/style/tableStatus.css'; + +interface ExpListState { + columns: IColumn[]; + platform: string[]; + errorMessage: string; + hideFilter: boolean; + searchInputVal: string; + selectedStatus: string; + selectedPlatform: string; + selectedStartDate?: Date; + selectedEndDate?: Date; + sortInfo: SortInfo; + source: AllExperimentList[]; + originExperimentList: AllExperimentList[]; + searchSource: AllExperimentList[]; +} + +class Experiment extends React.Component<{}, ExpListState> { + constructor(props) { + super(props); + this.state = { + platform: [], + columns: this.columns, + errorMessage: '', + hideFilter: true, + searchInputVal: '', + selectedStatus: '', + selectedPlatform: '', + source: [], // data in table + originExperimentList: [], // api /experiments-info + searchSource: [], // search box search result + sortInfo: { field: '', isDescend: false } + }; + } + + async componentDidMount(): Promise<void> { + const EXPERIMENTMANAGER = new ExperimentsManager(); + await EXPERIMENTMANAGER.init(); + const result = EXPERIMENTMANAGER.getExperimentList(); + this.setState(() => ({ + source: result, + originExperimentList: result, + searchSource: result, + platform: EXPERIMENTMANAGER.getPlatformList(), + errorMessage: EXPERIMENTMANAGER.getExpErrorMessage() + })); + } + + render(): React.ReactNode { + const { + platform, + hideFilter, + selectedStatus, + source, + selectedPlatform, + selectedStartDate, + selectedEndDate, + errorMessage + } = this.state; + return ( + <Stack className='nni' style={{ minHeight: window.innerHeight }}> + <Hearder /> + {errorMessage !== undefined ? ( + <div className='warning'> + <MessageInfo info={errorMessage} typeInfo='error' /> + </div> + ) : null} + <Stack className='contentBox expBackground'> + <Stack className='content'> + <Stack className='experimentList'> + <Stack className='box' horizontal> + <div className='search'> + <SearchBox + className='search-input' + placeholder='Search the experiment by name and ID' + onEscape={this.setOriginSource.bind(this)} + onClear={this.setOriginSource.bind(this)} + onChange={this.searchNameAndId.bind(this)} + /> + </div> + <div className='filter'> + <DefaultButton + onClick={this.clickFilter.bind(this)} + className={`${!hideFilter ? 'filter-button-open' : null}`} + > + <Icon iconName='Equalizer' /> + <span className='margin'>Filter</span> + </DefaultButton> + </div> + </Stack> + <Stack className={`${hideFilter ? 'hidden' : ''} filter-condition`} horizontal gap={25}> + <FilterBtns + platform={platform} + selectedStatus={selectedStatus} + selectedPlatform={selectedPlatform} + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + selectedStartDate={selectedStartDate!} + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + selectedEndDate={selectedEndDate!} + selectStatus={this.selectStatus.bind(this)} + selectPlatform={this.selectPlatform.bind(this)} + getSelectedData={this.getSelectedData.bind(this)} + setSearchSource={this.setSearchSource.bind(this)} + /> + </Stack> + <DetailsList + columns={this.columns} + items={source} + setKey='set' + compact={true} + selectionMode={0} // close selector function + className='table' + /> + </Stack> + </Stack> + </Stack> + </Stack> + ); + } + + private onColumnClick = (_ev: React.MouseEvent<HTMLElement>, getColumn: IColumn): void => { + const { columns, source } = this.state; + const newColumns: IColumn[] = columns.slice(); + const currColumn: IColumn = newColumns.filter(item => getColumn.key === item.key)[0]; + newColumns.forEach((newCol: IColumn) => { + if (newCol === currColumn) { + currColumn.isSortedDescending = !currColumn.isSortedDescending; + currColumn.isSorted = true; + } else { + newCol.isSorted = false; + newCol.isSortedDescending = true; + } + }); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const newItems = copyAndSort(source, currColumn.fieldName!, currColumn.isSortedDescending); + this.setState(() => ({ + columns: newColumns, + source: newItems, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + sortInfo: { field: currColumn.fieldName!, isDescend: currColumn.isSortedDescending } + })); + }; + + private columns: IColumn[] = [ + { + name: 'Name', + key: 'experimentName', + fieldName: 'experimentName', // required! + minWidth: MINSCREENCOLUMNWIDHT, + maxWidth: MAXSCREENCOLUMNWIDHT, + isResizable: true, + data: 'number', + onColumnClick: this.onColumnClick, + onRender: (item: any): React.ReactNode => <div className='succeed-padding'>{item.experimentName}</div> + }, + { + name: 'ID', + key: 'id', + fieldName: 'id', + minWidth: MINSCREENCOLUMNWIDHT, + maxWidth: MAXSCREENCOLUMNWIDHT, + isResizable: true, + className: 'tableHead leftTitle', + data: 'string', + onColumnClick: this.onColumnClick, + onRender: (item: any): React.ReactNode => <NameColumn port={item.port} status={item.status} id={item.id} /> + }, + { + name: 'Status', + key: 'status', + fieldName: 'status', + minWidth: MINSCREENCOLUMNWIDHT, + maxWidth: MAXSCREENCOLUMNWIDHT, + isResizable: true, + onColumnClick: this.onColumnClick, + onRender: (item: any): React.ReactNode => ( + <div className={`${item.status} commonStyle succeed-padding`}>{item.status}</div> + ) + }, + { + name: 'Port', + key: 'port', + fieldName: 'port', + minWidth: MINSCREENCOLUMNWIDHT - 15, + maxWidth: MAXSCREENCOLUMNWIDHT - 30, + isResizable: true, + data: 'number', + onColumnClick: this.onColumnClick, + onRender: (item: any): React.ReactNode => ( + <div className='succeed-padding'> + <div>{item.port !== undefined ? item.port : '--'}</div> + </div> + ) + }, + { + name: 'Platform', + key: 'platform', + fieldName: 'platform', + minWidth: MINSCREENCOLUMNWIDHT - 15, + maxWidth: MAXSCREENCOLUMNWIDHT - 30, + isResizable: true, + data: 'string', + onColumnClick: this.onColumnClick, + onRender: (item: any): React.ReactNode => <div className='commonStyle succeed-padding'>{item.platform}</div> + }, + { + name: 'Start time', + key: 'startTime', + fieldName: 'startTime', + minWidth: MINSCREENCOLUMNWIDHT + 15, + maxWidth: MAXSCREENCOLUMNWIDHT + 30, + isResizable: true, + data: 'number', + onColumnClick: this.onColumnClick, + onRender: (item: any): React.ReactNode => ( + <div className='succeed-padding'> + <div>{expformatTimestamp(item.startTime)}</div> + </div> + ) + }, + { + name: 'End time', + key: 'endTime', + fieldName: 'endTime', + minWidth: MINSCREENCOLUMNWIDHT + 15, + maxWidth: MAXSCREENCOLUMNWIDHT + 30, + isResizable: true, + data: 'number', + onColumnClick: this.onColumnClick, + onRender: (item: any): React.ReactNode => ( + <div className='succeed-padding'> + <div>{expformatTimestamp(item.endTime)}</div> + </div> + ) + } + ]; + + private clickFilter(_e: any): void { + const { hideFilter } = this.state; + if (!hideFilter === true) { + this.setSearchSource(); + } + this.setState(() => ({ hideFilter: !hideFilter })); + } + + private setOriginSource(): void { + let { originExperimentList } = this.state; + const { sortInfo } = this.state; + if (originExperimentList !== undefined) { + originExperimentList = this.commonSelectString(originExperimentList, ''); + const sortedData = getSortedSource(originExperimentList, sortInfo); + this.setState(() => ({ + source: sortedData + })); + } + } + + private searchNameAndId(_event, newValue): void { + const { originExperimentList, sortInfo } = this.state; + if (newValue !== undefined) { + if (newValue === '') { + this.setOriginSource(); + } else { + let result = originExperimentList.filter( + item => + item.experimentName.toLowerCase().includes(newValue.toLowerCase()) || + item.id.toLowerCase().includes(newValue.toLowerCase()) + ); + result = this.commonSelectString(result, ''); + const sortedResult = getSortedSource(result, sortInfo); + this.setState(() => ({ + source: sortedResult, + searchSource: sortedResult + })); + } + this.setState(() => ({ + searchInputVal: newValue + })); + } + } + + /*** + * status, platform + * param + * data: searchSource + * field: no care selected filed + */ + private commonSelectString = (data: AllExperimentList[], field: string): AllExperimentList[] => { + const { selectedStatus, selectedPlatform, selectedStartDate, selectedEndDate } = this.state; + const hasStatus = selectedStatus === '' ? false : true; + const hasPlatform = selectedPlatform === '' ? false : true; + const hasStartDate = selectedStartDate === undefined ? false : true; + const hasEndDate = selectedEndDate === undefined ? false : true; + + if (field === 'status') { + if (hasPlatform) { + data = filterByStatusOrPlatform(selectedPlatform, 'platform', data); + } + } + if (field === 'platform') { + if (hasStatus) { + data = filterByStatusOrPlatform(selectedStatus, 'status', data); + } + } + + if (field === '') { + if (hasPlatform) { + data = filterByStatusOrPlatform(selectedPlatform, 'platform', data); + } + if (hasStatus) { + data = filterByStatusOrPlatform(selectedStatus, 'status', data); + } + } + + if (hasStartDate) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + data = data.filter(temp => compareDate(new Date(temp.startTime), selectedStartDate!)); + } + if (hasEndDate) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + data = data.filter(temp => compareDate(new Date(temp.endTime), selectedEndDate!)); + } + + return data; + }; + + // status platform startTime endTime + private selectStatus = (_event: React.FormEvent<HTMLDivElement>, item: any): void => { + if (item !== undefined) { + const { searchSource, sortInfo } = this.state; + let result = filterByStatusOrPlatform(item.key, 'status', searchSource); + result = this.commonSelectString(result, 'status'); + this.setState({ selectedStatus: item.key, source: getSortedSource(result, sortInfo) }); + } + }; + + private selectPlatform = (_event: React.FormEvent<HTMLDivElement>, item: any): void => { + if (item !== undefined) { + const { searchSource, sortInfo } = this.state; + let result = filterByStatusOrPlatform(item.key, 'platform', searchSource); + result = this.commonSelectString(result, 'platform'); + this.setState({ selectedPlatform: item.key, source: getSortedSource(result, sortInfo) }); + } + }; + + private getSelectedData(type: string, date: Date | null | undefined): void { + if (date !== null && date !== undefined) { + const { + selectedStatus, + selectedPlatform, + selectedStartDate, + selectedEndDate, + searchSource, + sortInfo + } = this.state; + const hasStatus = selectedStatus === '' ? false : true; + const hasPlatform = selectedPlatform === '' ? false : true; + const hasStartDate = selectedStartDate === undefined ? false : true; + const hasEndDate = selectedEndDate === undefined ? false : true; + let result; + if (type === 'start') { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + result = searchSource.filter(item => compareDate(new Date(item.startTime), date)); + if (hasStatus) { + result = result.filter(temp => temp.status === selectedStatus); + } + if (hasPlatform) { + result = result.filter(temp => temp.platform === selectedPlatform); + } + if (hasEndDate) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + result = result.filter(temp => compareDate(new Date(temp.endTime), selectedEndDate!)); + } + this.setState(() => ({ + source: getSortedSource(result, sortInfo), + selectedStartDate: date + })); + } else { + result = searchSource.filter(item => compareDate(new Date(item.endTime), date)); + + if (hasStatus) { + result = result.filter(temp => temp.status === selectedStatus); + } + if (hasPlatform) { + result = result.filter(temp => temp.platform === selectedPlatform); + } + if (hasStartDate) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + result = result.filter(temp => compareDate(new Date(temp.startTime), selectedStartDate!)); + } + this.setState(() => ({ + source: getSortedSource(result, sortInfo), + selectedEndDate: date + })); + } + } + } + + // reset + private setSearchSource(): void { + const { sortInfo, searchInputVal, originExperimentList } = this.state; + // hert re-search data for fix this status: filter first -> searchBox search result null -> close filter + const result = originExperimentList.filter( + item => + item.experimentName.toLowerCase().includes(searchInputVal.toLowerCase()) || + item.id.toLowerCase().includes(searchInputVal.toLowerCase()) + ); + this.setState(() => ({ + source: getSortedSource(result, sortInfo), + selectedStatus: '', + selectedPlatform: '', + selectedStartDate: undefined, + selectedEndDate: undefined + })); + } +} + +export default Experiment; diff --git a/ts/webui/src/components/managementExp/FilterBtns.tsx b/ts/webui/src/components/managementExp/FilterBtns.tsx new file mode 100644 index 0000000000..8c0563329e --- /dev/null +++ b/ts/webui/src/components/managementExp/FilterBtns.tsx @@ -0,0 +1,81 @@ +import * as React from 'react'; +import { DefaultButton, Icon, Dropdown, DatePicker, DayOfWeek } from '@fluentui/react'; +import { EXPERIMENTSTATUS } from '../../static/const'; +import { fillOptions } from './expFunction'; + +interface FilterBtnsProps { + platform: string[]; + selectedStatus: string; + selectedPlatform: string; + selectedStartDate: Date; + selectedEndDate: Date; + selectStatus: (_event: React.FormEvent<HTMLDivElement>, item: any) => void; + selectPlatform: (_event: React.FormEvent<HTMLDivElement>, item: any) => void; + getSelectedData: (type: string, date: Date | null | undefined) => void; + setSearchSource: () => void; +} + +class FilterBtns extends React.Component<FilterBtnsProps, {}> { + constructor(props: FilterBtnsProps) { + super(props); + } + + render(): React.ReactNode { + const { + platform, + selectedStatus, + selectedPlatform, + selectedStartDate, + selectedEndDate, + selectStatus, + selectPlatform, + getSelectedData, + setSearchSource + } = this.props; + + return ( + <React.Fragment> + <Dropdown + label='Status' + selectedKey={selectedStatus} + onChange={selectStatus.bind(this)} + placeholder='Select an option' + options={fillOptions(EXPERIMENTSTATUS)} + className='filter-condition-status' + /> + <Dropdown + label='Platform' + selectedKey={selectedPlatform} + onChange={selectPlatform.bind(this)} + placeholder='Select an option' + options={fillOptions(platform)} + className='filter-condition-platform' + /> + <DatePicker + label='Start time' + firstDayOfWeek={DayOfWeek.Sunday} + showMonthPickerAsOverlay={true} + placeholder='Select a date...' + ariaLabel='Select a date' + value={selectedStartDate} + onSelectDate={getSelectedData.bind(this, 'start')} + /> + <DatePicker + label='End time' + firstDayOfWeek={DayOfWeek.Sunday} + showMonthPickerAsOverlay={true} + placeholder='Select a date...' + ariaLabel='Select a date' + value={selectedEndDate} + onSelectDate={getSelectedData.bind(this, 'end')} + /> + <DefaultButton onClick={setSearchSource.bind(this)} className='reset'> + <Icon iconName='Refresh' /> + <span className='margin'>Reset</span> + </DefaultButton> + </React.Fragment> + ); + } +} + +export default FilterBtns; diff --git a/ts/webui/src/components/managementExp/Header.tsx b/ts/webui/src/components/managementExp/Header.tsx new file mode 100644 index 0000000000..d32fc9854c --- /dev/null +++ b/ts/webui/src/components/managementExp/Header.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { Stack, StackItem, CommandBarButton } from '@fluentui/react'; +import { RevToggleKey } from '../buttons/Icon'; +import { NNILOGO } from '../stateless-component/NNItabs'; +import { stackTokens, stackStyle } from '../NavConst'; + +export const Hearder = (): any => ( + <div className='header'> + <div className='headerCon'> + <Stack className='nav' horizontal> + <StackItem grow={30} styles={{ root: { minWidth: 300, display: 'flex', verticalAlign: 'center' } }}> + <span className='desktop-logo'>{NNILOGO}</span> + <span className='logoTitle'>Neural Network Intelligence</span> + </StackItem> + <StackItem grow={70} className='navOptions'> + <Stack horizontal horizontalAlign='end' tokens={stackTokens} styles={stackStyle}> + <Link to='/oview' className='experiment'> + <CommandBarButton iconProps={RevToggleKey} text='Back to the experiment' /> + </Link> + </Stack> + </StackItem> + </Stack> + </div> + </div> +); diff --git a/ts/webui/src/components/managementExp/TrialIdColumn.tsx b/ts/webui/src/components/managementExp/TrialIdColumn.tsx new file mode 100644 index 0000000000..159b95f482 --- /dev/null +++ b/ts/webui/src/components/managementExp/TrialIdColumn.tsx @@ -0,0 +1,33 @@ +import * as React from 'react'; + +interface TrialIdColumnProps { + port: number; + id: string; + status: string; +} + +class TrialIdColumn extends React.Component<TrialIdColumnProps, {}> { + constructor(props: TrialIdColumnProps) { + super(props); + } + + render(): React.ReactNode { + const { port, id, status } = this.props; + const hostname = window.location.hostname; + const protocol = window.location.protocol; + const webuiPortal = `${protocol}//${hostname}:${port}/oview`; + return ( + <div className='succeed-padding ellipsis'> + {status === 'STOPPED' ? ( + <div>{id}</div> + ) : ( + <a href={webuiPortal} className='link' target='_blank' rel='noopener noreferrer'> + {id} + </a> + )} + </div> + ); + } +} + +export default TrialIdColumn; diff --git a/ts/webui/src/components/managementExp/expFunction.ts b/ts/webui/src/components/managementExp/expFunction.ts new file mode 100644 index 0000000000..4d161cbeb2 --- /dev/null +++ b/ts/webui/src/components/managementExp/expFunction.ts @@ -0,0 +1,37 @@ +import { AllExperimentList, SortInfo } from '../../static/interface'; +import { copyAndSort } from '../../static/function'; + +function compareDate(date1: Date, date2: Date): boolean { + if (date1 !== undefined && date2 !== undefined) { + if (date1.getFullYear() === date2.getFullYear()) { + if (date1.getMonth() === date2.getMonth()) { + if (date1.getDate() === date2.getDate()) { + return true; + } + } + } + } + + return false; +} + +const filterByStatusOrPlatform = (val: string, type: string, data: AllExperimentList[]): AllExperimentList[] => { + return data.filter(temp => temp[type] === val); +}; + +function fillOptions(arr: string[]): any { + const list: Array<object> = []; + + arr.map(item => { + list.push({ key: item, text: item }); + }); + + return list; +} + +function getSortedSource(source: AllExperimentList[], sortInfo: SortInfo): AllExperimentList[] { + const keepSortedSource = copyAndSort(source, sortInfo.field, sortInfo.isDescend); + return keepSortedSource; +} + +export { compareDate, filterByStatusOrPlatform, fillOptions, getSortedSource }; diff --git a/ts/webui/src/components/managementExp/experimentConst.ts b/ts/webui/src/components/managementExp/experimentConst.ts new file mode 100644 index 0000000000..d71cab4399 --- /dev/null +++ b/ts/webui/src/components/managementExp/experimentConst.ts @@ -0,0 +1,4 @@ +const MAXSCREENCOLUMNWIDHT = 180; +const MINSCREENCOLUMNWIDHT = 139; + +export { MAXSCREENCOLUMNWIDHT, MINSCREENCOLUMNWIDHT }; diff --git a/ts/webui/src/components/modals/Compare.tsx b/ts/webui/src/components/modals/Compare.tsx index 936c2714d3..fc20bd95da 100644 --- a/ts/webui/src/components/modals/Compare.tsx +++ b/ts/webui/src/components/modals/Compare.tsx @@ -58,16 +58,16 @@ class Compare extends React.Component<CompareProps, {}> { super(props); } - private _generateTooltipSummary(row: Item, metricKey: string): string { - return renderToString( + private _generateTooltipSummary = (row: Item, value: string): string => + renderToString( <div className='tooldetailAccuracy'> + <div>Trial No.: {row.sequenceId}</div> <div>Trial ID: {row.id}</div> - <div>Default metric: {row.metrics.get(metricKey) || 'N/A'}</div> + <div>Intermediate metric: {value}</div> </div> ); - } - private _intermediates(items: Item[], metricKey: string): React.ReactNode { + private _intermediates(items: Item[]): React.ReactNode { // Precondition: make sure `items` is not empty const xAxisMax = Math.max(...items.map(item => item.intermediates.length)); const xAxis = Array(xAxisMax) @@ -84,7 +84,7 @@ class Compare extends React.Component<CompareProps, {}> { trigger: 'item', enterable: true, position: (point: number[], data: TooltipForIntermediate): [number, number] => { - if (data.dataIndex < length / 2) { + if (data.dataIndex < xAxisMax / 2) { return [point[0], 80]; } else { return [point[0] - 300, 80]; @@ -92,7 +92,7 @@ class Compare extends React.Component<CompareProps, {}> { }, formatter: (data: TooltipForIntermediate): string => { const item = items.find(k => k.id === data.seriesName) as Item; - return this._generateTooltipSummary(item, metricKey); + return this._generateTooltipSummary(item, data.data); } }, grid: { @@ -187,9 +187,13 @@ class Compare extends React.Component<CompareProps, {}> { {parameterKeys.map(k => this._renderRow(`space_${k}`, k, 'value', items, item => item.parameters.get(k)) )} - {metricKeys.map(k => - this._renderRow(`metrics_${k}`, `Metric: ${k}`, 'value', items, item => item.metrics.get(k)) - )} + {metricKeys !== undefined + ? metricKeys.map(k => + this._renderRow(`metrics_${k}`, `Metric: ${k}`, 'value', items, item => + item.metrics.get(k) + ) + ) + : null} </tbody> </table> ); @@ -209,8 +213,6 @@ class Compare extends React.Component<CompareProps, {}> { metrics: flatten(trial.metrics(TRIALS.inferredMetricSpace())), intermediates: _parseIntermediates(trial) })); - const metricKeys = this._overlapKeys(items.map(item => item.metrics)); - const defaultMetricKey = !metricKeys || metricKeys.includes('default') ? 'default' : metricKeys[0]; return ( <Modal @@ -232,7 +234,7 @@ class Compare extends React.Component<CompareProps, {}> { /> </div> <Stack className='compare-modal-intermediate'> - {this._intermediates(items, defaultMetricKey)} + {this._intermediates(items)} <Stack className='compare-yAxis'># Intermediate result</Stack> </Stack> {showDetails && <Stack>{this._columns(items)}</Stack>} diff --git a/ts/webui/src/components/overview/command/Command1.tsx b/ts/webui/src/components/overview/command/Command1.tsx index ace0acc99f..5b5f27f132 100644 --- a/ts/webui/src/components/overview/command/Command1.tsx +++ b/ts/webui/src/components/overview/command/Command1.tsx @@ -37,9 +37,9 @@ export const Command1 = (): any => { <div className='basic' style={rightEidtParam}> <div> <p className='command'>Training platform</p> - <div className='nowrap'>{EXPERIMENT.profile.params.trainingServicePlatform}</div> + <div className='ellipsis'>{EXPERIMENT.profile.params.trainingServicePlatform}</div> <p className='lineMargin'>{title.join('/')}</p> - <div className='nowrap'>{builtinName.join('/')}</div> + <div className='ellipsis'>{builtinName.join('/')}</div> </div> </div> ); diff --git a/ts/webui/src/components/overview/command/Command2.tsx b/ts/webui/src/components/overview/command/Command2.tsx index 6666b1b028..e87aa7a048 100644 --- a/ts/webui/src/components/overview/command/Command2.tsx +++ b/ts/webui/src/components/overview/command/Command2.tsx @@ -24,10 +24,10 @@ export const Command2 = (): any => { return ( <div className='basic' style={leftProgress}> <p className='command'>Log directory</p> - <div className='nowrap'> + <div className='ellipsis'> <TooltipHost content={EXPERIMENT.profile.logDir || 'unknown'} - className='nowrap' + className='ellipsis' directionalHint={DirectionalHint.bottomCenter} tooltipProps={{ calloutProps: { @@ -43,10 +43,10 @@ export const Command2 = (): any => { </TooltipHost> </div> <p className='lineMargin'>Trial command</p> - <div className='nowrap'> + <div className='ellipsis'> <TooltipHost content={trialCommand || 'unknown'} - className='nowrap' + className='ellipsis' directionalHint={DirectionalHint.bottomCenter} tooltipProps={{ calloutProps: { diff --git a/ts/webui/src/components/overview/experiment/BasicInfo.tsx b/ts/webui/src/components/overview/params/BasicInfo.tsx similarity index 90% rename from ts/webui/src/components/overview/experiment/BasicInfo.tsx rename to ts/webui/src/components/overview/params/BasicInfo.tsx index b7811c52ea..f7979a3441 100644 --- a/ts/webui/src/components/overview/experiment/BasicInfo.tsx +++ b/ts/webui/src/components/overview/params/BasicInfo.tsx @@ -6,10 +6,10 @@ import { formatTimestamp } from '../../../static/function'; import { useId } from '@uifabric/react-hooks'; import { BestMetricContext } from '../../Overview'; import { styles } from './basicInfoStyles'; -import '../../../static/style/progress/progress.scss'; -import '../../../static/style/progress/probar.scss'; +import '../../../static/style/overview/probar.scss'; +import '../../../static/style/overview/basic.scss'; -export const ReBasicInfo = (): any => { +export const BasicInfo = (): any => { const labelId: string = useId('callout-label'); const descriptionId: string = useId('callout-description'); const ref = React.createRef<HTMLDivElement>(); @@ -26,9 +26,9 @@ export const ReBasicInfo = (): any => { <Stack horizontal horizontalAlign='space-between' className='marginTop'> <div className='basic'> <p>Name</p> - <div className='nowrap'>{EXPERIMENT.profile.params.experimentName}</div> + <div className='ellipsis'>{EXPERIMENT.profile.params.experimentName}</div> <p className='marginTop'>ID</p> - <div className='nowrap'>{EXPERIMENT.profile.id}</div> + <div className='ellipsis'>{EXPERIMENT.profile.id}</div> </div> <div className='basic'> <p>Status</p> @@ -86,9 +86,9 @@ export const ReBasicInfo = (): any => { </div> <div className='basic'> <p>Start time</p> - <div className='nowrap'>{formatTimestamp(EXPERIMENT.profile.startTime)}</div> + <div className='ellipsis'>{formatTimestamp(EXPERIMENT.profile.startTime)}</div> <p className='marginTop'>End time</p> - <div className='nowrap'>{formatTimestamp(EXPERIMENT.profile.endTime)}</div> + <div className='ellipsis'>{formatTimestamp(EXPERIMENT.profile.endTime)}</div> </div> </Stack> {/* learn about click -> default active key is dispatcher. */} diff --git a/ts/webui/src/components/overview/experiment/basicInfoStyles.ts b/ts/webui/src/components/overview/params/basicInfoStyles.ts similarity index 100% rename from ts/webui/src/components/overview/experiment/basicInfoStyles.ts rename to ts/webui/src/components/overview/params/basicInfoStyles.ts diff --git a/ts/webui/src/components/overview/table/SuccessTable.tsx b/ts/webui/src/components/overview/table/SuccessTable.tsx index 0a90d0ff93..fa425d2fc4 100644 --- a/ts/webui/src/components/overview/table/SuccessTable.tsx +++ b/ts/webui/src/components/overview/table/SuccessTable.tsx @@ -106,7 +106,7 @@ class SuccessTable extends React.Component<SuccessTableProps, SuccessTableState> </React.Fragment> ); - private columns = [ + private columns: IColumn[] = [ { key: '_expand', name: '', diff --git a/ts/webui/src/components/trial-detail/DefaultMetricPoint.tsx b/ts/webui/src/components/trial-detail/DefaultMetricPoint.tsx index 3427c0c28d..79800ca926 100644 --- a/ts/webui/src/components/trial-detail/DefaultMetricPoint.tsx +++ b/ts/webui/src/components/trial-detail/DefaultMetricPoint.tsx @@ -73,18 +73,24 @@ class DefaultPoint extends React.Component<DefaultPointProps, DefaultPointState> data.data[0] < maxSequenceId ? point[0] : point[0] - 300, 80 ], - formatter: (data: TooltipForAccuracy): React.ReactNode => - '<div class="tooldetailAccuracy">' + - '<div>Trial No.: ' + - data.data[0] + - '</div>' + - '<div>Default metric: ' + - data.data[1] + - '</div>' + - '<div>Parameters: <pre>' + - JSON.stringify(data.data[2], null, 4) + - '</pre></div>' + - '</div>' + formatter: (data: TooltipForAccuracy): React.ReactNode => { + return ( + '<div class="tooldetailAccuracy">' + + '<div>Trial No.: ' + + data.data[0] + + '</div>' + + '<div>Trial ID: ' + + data.data[2] + + '</div>' + + '<div>Default metric: ' + + data.data[1] + + '</div>' + + '<div>Parameters: <pre>' + + JSON.stringify(data.data[3], null, 4) + + '</pre></div>' + + '</div>' + ); + } }, dataZoom: [ { @@ -110,7 +116,7 @@ class DefaultPoint extends React.Component<DefaultPointProps, DefaultPointState> } generateScatterSeries(trials: Trial[]): any { - const data = trials.map(trial => [trial.sequenceId, trial.accuracy, trial.description.parameters]); + const data = trials.map(trial => [trial.sequenceId, trial.accuracy, trial.id, trial.description.parameters]); return { symbolSize: 6, type: 'scatter', @@ -120,7 +126,7 @@ class DefaultPoint extends React.Component<DefaultPointProps, DefaultPointState> generateBestCurveSeries(trials: Trial[]): any { let best = trials[0]; - const data = [[best.sequenceId, best.accuracy, best.description.parameters]]; + const data = [[best.sequenceId, best.accuracy, best.id, best.description.parameters]]; for (let i = 1; i < trials.length; i++) { const trial = trials[i]; @@ -128,10 +134,10 @@ class DefaultPoint extends React.Component<DefaultPointProps, DefaultPointState> const delta = trial.accuracy! - best.accuracy!; const better = EXPERIMENT.optimizeMode === 'minimize' ? delta < 0 : delta > 0; if (better) { - data.push([trial.sequenceId, trial.accuracy, trial.description.parameters]); + data.push([trial.sequenceId, trial.accuracy, best.id, trial.description.parameters]); best = trial; } else { - data.push([trial.sequenceId, best.accuracy, trial.description.parameters]); + data.push([trial.sequenceId, best.accuracy, best.id, trial.description.parameters]); } } diff --git a/ts/webui/src/components/trial-detail/Intermediate.tsx b/ts/webui/src/components/trial-detail/Intermediate.tsx index 72dcc94cee..ee7ea89190 100644 --- a/ts/webui/src/components/trial-detail/Intermediate.tsx +++ b/ts/webui/src/components/trial-detail/Intermediate.tsx @@ -61,6 +61,7 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> const temp = source[item]; trialIntermediate.push({ name: temp.id, + trialNum: temp.sequenceId, data: temp.description.intermediate, type: 'line', hyperPara: temp.description.parameters @@ -94,13 +95,18 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> }, formatter: function(data: TooltipForIntermediate): React.ReactNode { const trialId = data.seriesName; - let obj = {}; + let parameters = {}; + let trialNum = 0; const temp = trialIntermediate.find(key => key.name === trialId); if (temp !== undefined) { - obj = temp.hyperPara; + parameters = temp.hyperPara; + trialNum = temp.trialNum; } return ( '<div class="tooldetailAccuracy">' + + '<div>Trial No.: ' + + trialNum + + '</div>' + '<div>Trial ID: ' + trialId + '</div>' + @@ -109,7 +115,7 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> '</div>' + '<div>Parameters: ' + '<pre>' + - JSON.stringify(obj, null, 4) + + JSON.stringify(parameters, null, 4) + '</pre>' + '</div>' + '</div>' diff --git a/ts/webui/src/index.tsx b/ts/webui/src/index.tsx index af67396b86..1cd2170de6 100644 --- a/ts/webui/src/index.tsx +++ b/ts/webui/src/index.tsx @@ -4,27 +4,29 @@ import App from './App'; import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; const Overview = lazy(() => import('./components/Overview')); const TrialsDetail = lazy(() => import('./components/TrialsDetail')); +const Experiment = lazy(() => import('./components/managementExp/ExperimentManager')); import './index.css'; import './static/style/loading.scss'; import * as serviceWorker from './serviceWorker'; ReactDOM.render( <Router> - <App> + <Suspense + fallback={ + <div className='loading'> + <img src={require('./static/img/loading.gif')} /> + </div> + } + > + <Route path='/experiment' component={Experiment} exact /> <Switch> - <Suspense - fallback={ - <div className='loading'> - <img src={require('./static/img/loading.gif')} /> - </div> - } - > + <App> <Route path='/' component={Overview} exact /> <Route path='/oview' component={Overview} /> <Route path='/detail' component={TrialsDetail} /> - </Suspense> + </App> </Switch> - </App> + </Suspense> </Router>, document.getElementById('root') diff --git a/ts/webui/src/static/const.ts b/ts/webui/src/static/const.ts index 7f4d6a79c5..553e151703 100644 --- a/ts/webui/src/static/const.ts +++ b/ts/webui/src/static/const.ts @@ -15,6 +15,16 @@ const trialJobStatus = [ 'SYS_CANCELED', 'EARLY_STOPPED' ]; +const EXPERIMENTSTATUS = [ + 'INITIALIZED', + 'RUNNING', + 'ERROR', + 'STOPPING', + 'STOPPED', + 'DONE', + 'NO_MORE_TRIAL', + 'TUNER_NO_MORE_TRIAL' +]; const CONTROLTYPE = ['MAX_EXEC_DURATION', 'MAX_TRIAL_NUM', 'TRIAL_CONCURRENCY', 'SEARCH_SPACE']; const MONACO = { readOnly: true, @@ -64,6 +74,7 @@ export { MANAGER_IP, DOWNLOAD_IP, trialJobStatus, + EXPERIMENTSTATUS, COLUMNPro, WEBUIDOC, CONTROLTYPE, diff --git a/ts/webui/src/static/function.ts b/ts/webui/src/static/function.ts index 40f191594e..2091c75e8f 100644 --- a/ts/webui/src/static/function.ts +++ b/ts/webui/src/static/function.ts @@ -236,6 +236,14 @@ function formatTimestamp(timestamp?: number, placeholder?: string): string { return timestamp ? new Date(timestamp).toLocaleString('en-US') : placeholder; } +function expformatTimestamp(timestamp: number | string): string { + if (typeof timestamp === 'number') { + return new Date(timestamp).toLocaleString('en-US'); + } else { + return 'N/A'; + } +} + function metricAccuracy(metric: MetricDataRecord): number { const data = parseMetrics(metric.data); // return typeof data === 'number' ? data : NaN; @@ -262,6 +270,10 @@ function formatComplexTypeValue(value: any): string | number { } } +function isManagerExperimentPage(): boolean { + return location.pathname.indexOf('experiment') === -1 ? false : true; +} + function caclMonacoEditorHeight(height): number { // [Search space 56px] + [marginBottom 18px] + // button[height: 32px, marginTop: 45px, marginBottom: 7px] @@ -306,12 +318,14 @@ export { filterDuration, formatAccuracy, formatTimestamp, + expformatTimestamp, metricAccuracy, parseMetrics, isArrayType, requestAxios, isNaNorInfinity, formatComplexTypeValue, + isManagerExperimentPage, caclMonacoEditorHeight, copyAndSort }; diff --git a/ts/webui/src/static/interface.ts b/ts/webui/src/static/interface.ts index 3171216a02..99e89237ae 100644 --- a/ts/webui/src/static/interface.ts +++ b/ts/webui/src/static/interface.ts @@ -120,6 +120,7 @@ interface Intermedia { type: string; data: Array<number | object>; // intermediate data hyperPara: object; // each trial hyperpara value + trialNum: number; } interface MetricDataRecord { @@ -218,6 +219,19 @@ interface SortInfo { isDescend?: boolean; } +interface AllExperimentList { + id: string; + experimentName: string; + port: number; + status: string; + platform: string; + startTime: number; + endTime: number; + tag: string[]; + pid: number; + webuiUrl: string[]; + logDir: string[]; +} export { TableObj, TableRecord, @@ -240,5 +254,6 @@ export { EventMap, SingleAxis, MultipleAxes, - SortInfo + SortInfo, + AllExperimentList }; diff --git a/ts/webui/src/static/model/experimentsManager.ts b/ts/webui/src/static/model/experimentsManager.ts new file mode 100644 index 0000000000..e95bc9f2cb --- /dev/null +++ b/ts/webui/src/static/model/experimentsManager.ts @@ -0,0 +1,43 @@ +import { MANAGER_IP } from '../const'; +import { AllExperimentList } from '../interface'; +import { requestAxios } from '../function'; + +class ExperimentsManager { + private experimentList: AllExperimentList[] = []; + private platform: string[] = []; + private errorMessage: string = ''; + + public getExperimentList(): AllExperimentList[] { + return this.experimentList; + } + + public getPlatformList(): string[] { + return this.platform; + } + + public getExpErrorMessage(): string { + return this.errorMessage; + } + + public async init(): Promise<void> { + await requestAxios(`${MANAGER_IP}/experiments-info`) + .then(data => { + const platforms: Set<string> = new Set(); + for (const item of data) { + if (item.port !== undefined) { + if (typeof item.port === 'string') { + item.port = JSON.parse(item.port); + } + } + platforms.add(item.platform); + } + this.experimentList = data; + this.platform = Array.from(platforms); + }) + .catch(error => { + this.errorMessage = error.message; + }); + } +} + +export { ExperimentsManager }; diff --git a/ts/webui/src/static/style/common.scss b/ts/webui/src/static/style/common.scss index 6ecf745243..90218499bb 100644 --- a/ts/webui/src/static/style/common.scss +++ b/ts/webui/src/static/style/common.scss @@ -1,5 +1,27 @@ -.cursor{ - &:hover, & i:hover{ - cursor: pointer; - } -} \ No newline at end of file +.ellipsis { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.link { + outline: none; + color: #333 !important; + text-decoration: none; + + &:hover { + color: #0071bc !important; + text-decoration: underline; + } + &:active, + &:visited { + color: #0071bc; + } +} + +.cursor { + &:hover, + & i:hover { + cursor: pointer; + } +} diff --git a/ts/webui/src/static/style/experiment/experiment.scss b/ts/webui/src/static/style/experiment/experiment.scss new file mode 100644 index 0000000000..384a0c1055 --- /dev/null +++ b/ts/webui/src/static/style/experiment/experiment.scss @@ -0,0 +1,64 @@ +.expBackground { + background: #f2f2f2; + height: 100%; + .content { + background: #fff; + } +} + +.experimentList { + padding: 42px; + + .box { + .search { + width: 90%; + &-input { + width: 330px; + } + } + + .filter { + width: 10%; + text-align: right; + + &-button-open { + background: #f3f2f1; + } + } + } + + .filter-condition { + margin-top: 26px; + .reset { + width: 80px; + position: relative; + top: 29px; + } + + &-status { + width: 194px; + } + &-platform { + width: 150px; + } + } + + .hidden { + display: none; + } + + .margin { + margin-left: 10px; + } + + .tagContainer { + width: 100%; + + .tag { + font-weight: 500; + background: #f2f2f2; + margin: 0 4px; + padding: 0 6px; + } + } +} diff --git a/ts/webui/src/static/style/nav/nav.scss b/ts/webui/src/static/style/nav/nav.scss index 58d0769267..1dd51b08df 100644 --- a/ts/webui/src/static/style/nav/nav.scss +++ b/ts/webui/src/static/style/nav/nav.scss @@ -1,83 +1,112 @@ $barHeight: 56px; .navOptions { - .ms-Button-icon { - color: #fff; - - &:hover { - color: #fff; - } - } - - .ms-Button--commandBar { - background-color: #0071bc; - user-select: none; - - &:hover, - &:active { - color: #fff; - - .ms-Button-icon { - color: #fff; - } - } - - .ms-Button-textContainer { - color: #fff; - } - - .ms-Button-menuIcon { - color: #fff; - background-color: transparent; - } - } + .ms-Button-icon { + color: #fff; + + &:hover { + color: #fff; + } + } + + .ms-Button--commandBar { + background-color: #0071bc; + user-select: none; + + &:hover, + &:active { + color: #fff; + + .ms-Button-icon { + color: #fff; + } + } + + .ms-Button-textContainer { + color: #fff; + } + + .ms-Button-menuIcon { + color: #fff; + background-color: transparent; + } + } + + .experiment { + position: relative; + top: 3px; + text-decoration: none; + } } .nav { - height: $barHeight; - line-height: $barHeight; - - /* desktop mode useful */ - .desktop-logo { - position: relative; - top: 6px; - } - - &-refresh { - position: relative; - display: flex; - } - - &-refresh-num { - position: absolute; - top: -13px; - left: 17px; - color: #fff; - font-size: 12px; - } + width: 100%; + min-width: 1200px; + height: $barHeight; + line-height: $barHeight; + + /* desktop mode useful */ + .desktop-logo { + position: relative; + top: 6px; + } + + .logoTitle { + font-size: 18px; + color: #fff; + } + + &-refresh { + position: relative; + display: flex; + } + + &-refresh-num { + position: absolute; + top: -13px; + left: 17px; + color: #fff; + font-size: 12px; + } } /* overview and detail tabs common style */ a.common-tabs { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - font-size: 16px; - color: #b8c7ce; - text-decoration: none; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + font-size: 16px; + color: #b8c7ce; + text-decoration: none; } .common-tabs:visited, .selected:hover { - color: #fff; - text-decoration: none; + color: #fff; + text-decoration: none; } .common-tabs:hover, .selected { - color: #fff; - border-bottom: 1px solid #fff; + color: #fff; + border-bottom: 1px solid #fff; } .left-right-margin { - margin-left: 20px; - margin-right: 20px; + margin-left: 20px; + margin-right: 20px; +} + +.expNavTitle { + span { + color: #fff; + text-decoration: none; + position: relative; + top: -4px; + } + i { + color: #fff; + font-size: 12px; + position: relative; + top: -3px; + padding-left: 4px; + } } diff --git a/ts/webui/src/static/style/overview/basic.scss b/ts/webui/src/static/style/overview/basic.scss new file mode 100644 index 0000000000..7bf600a54c --- /dev/null +++ b/ts/webui/src/static/style/overview/basic.scss @@ -0,0 +1,23 @@ +.status { + color: #0573bc; + font-size: 20px; + font-weight: 600; + + .status-text { + display: inline-block; + } + + .color { + color: #333; + } +} + +.inputBox { + height: 32px; + margin-top: 5px; +} + +/* office-fabric-ui progressIndicator */ +.ms-ProgressIndicator-itemProgress { + padding: 0; +} diff --git a/ts/webui/src/static/style/overview/count.scss b/ts/webui/src/static/style/overview/count.scss index b01205ce7a..5189ff0fbc 100644 --- a/ts/webui/src/static/style/overview/count.scss +++ b/ts/webui/src/static/style/overview/count.scss @@ -58,6 +58,7 @@ $margin: 24px; .concurrency { .editparam { margin-top: 5px; + position: relative; } } .editparam { @@ -124,5 +125,6 @@ $margin: 24px; .info { position: absolute; z-index: 999; - left: 0; + left: -50%; + width: 270%; } diff --git a/ts/webui/src/static/style/overview/overview.scss b/ts/webui/src/static/style/overview/overview.scss index 274c7d0a23..a1b92d6409 100644 --- a/ts/webui/src/static/style/overview/overview.scss +++ b/ts/webui/src/static/style/overview/overview.scss @@ -61,30 +61,24 @@ $boxGapPadding: 10px; } .basic { - line-height: 21px; - font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; - - p { - color: #8f8f8f; - font-size: 14px; - font-weight: normal; - - span { - color: #484848; - } - } - - div { - font-size: 16px; - font-weight: 500; - color: #484848; - } - - .nowrap { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } + line-height: 21px; + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; + + p { + font-size: 14px; + color: #8f8f8f; + + span { + color: #484848; + } + } + + div { + font-size: 16px; + font-weight: 500; + color: #484848; + } + } .overviewBestMetric { diff --git a/ts/webui/src/static/style/progress/probar.scss b/ts/webui/src/static/style/overview/probar.scss similarity index 100% rename from ts/webui/src/static/style/progress/probar.scss rename to ts/webui/src/static/style/overview/probar.scss diff --git a/ts/webui/src/static/style/progress/progress.scss b/ts/webui/src/static/style/progress/progress.scss deleted file mode 100644 index c92fc0dc05..0000000000 --- a/ts/webui/src/static/style/progress/progress.scss +++ /dev/null @@ -1,66 +0,0 @@ - -.status { - color: #0573bc; - font-size: 20px; - font-weight: 600; - - .status-text { - display: inline-block; - } - - .color { - color: #333; - } -} - -.probar { - width: 100%; - height: 34px; - margin-top: 15px; - - .showProgress { - width: 300px; - height: 30px; - } - - .name { - width: 178px; - box-sizing: border-box; - line-height: 30px; - text-align: center; - color: #fff; - background-color: #999; - border: 2px solid #e6e6e6; - border-top-left-radius: 12px; - border-bottom-left-radius: 12px; - } - - .boundary { - width: 100%; - line-height: 24px; - font-size: 12px; - color: #212121; - - .right { - text-align: right; - } - } - - .description { - line-height: 34px; - margin-left: 6px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } -} - -.inputBox { - height: 32px; - margin-top: 5px; -} - -/* office-fabric-ui progressIndicator */ -.ms-ProgressIndicator-itemProgress { - padding: 0; -} diff --git a/ts/webui/src/static/style/table.scss b/ts/webui/src/static/style/table.scss index 054c7a63e9..c89b8e0ad8 100644 --- a/ts/webui/src/static/style/table.scss +++ b/ts/webui/src/static/style/table.scss @@ -13,12 +13,6 @@ } } -.ellipsis { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - #succeTable, #tableList { .commonTableStyle .leftTitle div { diff --git a/ts/webui/yarn.lock b/ts/webui/yarn.lock index 986954a2bd..ac517c8be4 100644 --- a/ts/webui/yarn.lock +++ b/ts/webui/yarn.lock @@ -16,14 +16,10 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c" - integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ== - dependencies: - browserslist "^4.12.0" - invariant "^2.2.4" - semver "^5.5.0" +"@babel/compat-data@^7.12.5", "@babel/compat-data@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41" + integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw== "@babel/core@7.4.3": version "7.4.3" @@ -46,18 +42,18 @@ source-map "^0.5.0" "@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.4.5": - version "7.11.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651" - integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg== + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.6" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.5" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.5" - "@babel/types" "^7.11.5" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -67,12 +63,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.11.5", "@babel/generator@^7.11.6", "@babel/generator@^7.4.0": - version "7.11.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620" - integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA== +"@babel/generator@^7.12.5", "@babel/generator@^7.4.0": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" + integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== dependencies: - "@babel/types" "^7.11.5" + "@babel/types" "^7.12.5" jsesc "^2.5.1" source-map "^0.5.0" @@ -91,14 +87,14 @@ "@babel/helper-explode-assignable-expression" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-builder-react-jsx-experimental@^7.10.4", "@babel/helper-builder-react-jsx-experimental@^7.11.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz#4ea43dd63857b0a35cd1f1b161dc29b43414e79f" - integrity sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw== +"@babel/helper-builder-react-jsx-experimental@^7.12.4": + version "7.12.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz#55fc1ead5242caa0ca2875dcb8eed6d311e50f48" + integrity sha512-AjEa0jrQqNk7eDQOo0pTfUOwQBMF+xVqrausQwT9/rTKy0g04ggFNaJpaE09IQMn9yExluigWMJcj0WC7bq+Og== dependencies: "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-module-imports" "^7.10.4" - "@babel/types" "^7.11.5" + "@babel/helper-module-imports" "^7.12.1" + "@babel/types" "^7.12.1" "@babel/helper-builder-react-jsx@^7.10.4": version "7.10.4" @@ -108,37 +104,34 @@ "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-compilation-targets@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" - integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== +"@babel/helper-compilation-targets@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz#cb470c76198db6a24e9dbc8987275631e5d29831" + integrity sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw== dependencies: - "@babel/compat-data" "^7.10.4" - browserslist "^4.12.0" - invariant "^2.2.4" - levenary "^1.1.1" + "@babel/compat-data" "^7.12.5" + "@babel/helper-validator-option" "^7.12.1" + browserslist "^4.14.5" semver "^5.5.0" -"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5", "@babel/helper-create-class-features-plugin@^7.4.0": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" - integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== +"@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.4.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" + integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w== dependencies: "@babel/helper-function-name" "^7.10.4" - "@babel/helper-member-expression-to-functions" "^7.10.5" + "@babel/helper-member-expression-to-functions" "^7.12.1" "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" "@babel/helper-split-export-declaration" "^7.10.4" -"@babel/helper-create-regexp-features-plugin@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" - integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== +"@babel/helper-create-regexp-features-plugin@^7.12.1": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz#2084172e95443fa0a09214ba1bb328f9aea1278f" + integrity sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ== dependencies: "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-regex" "^7.10.4" - regexpu-core "^4.7.0" + regexpu-core "^4.7.1" "@babel/helper-define-map@^7.10.4", "@babel/helper-define-map@^7.4.0": version "7.10.5" @@ -150,11 +143,11 @@ lodash "^4.17.19" "@babel/helper-explode-assignable-expression@^7.10.4": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz#2d8e3470252cc17aba917ede7803d4a7a276a41b" - integrity sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ== + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz#8006a466695c4ad86a2a5f2fb15b5f2c31ad5633" + integrity sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.1" "@babel/helper-function-name@^7.1.0", "@babel/helper-function-name@^7.10.4": version "7.10.4" @@ -179,86 +172,79 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" - integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== +"@babel/helper-member-expression-to-functions@^7.12.1": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855" + integrity sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.12.7" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" + integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.5" -"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" - integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== +"@babel/helper-module-transforms@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" + integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-simple-access" "^7.12.1" "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/helper-validator-identifier" "^7.10.4" "@babel/template" "^7.10.4" - "@babel/types" "^7.11.0" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" lodash "^4.17.19" "@babel/helper-optimise-call-expression@^7.0.0", "@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz#7f94ae5e08721a49467346aa04fd22f750033b9c" + integrity sha512-I5xc9oSJ2h59OwyUqjv95HRyzxj53DAubUERgQMrpcCEYQyToeHA+NEcUEsVWB4j53RDeskeBJ0SgRAYHDBckw== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.7" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== -"@babel/helper-regex@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" - integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== - dependencies: - lodash "^4.17.19" - -"@babel/helper-remap-async-to-generator@^7.10.4": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz#4474ea9f7438f18575e30b0cac784045b402a12d" - integrity sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA== +"@babel/helper-remap-async-to-generator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" + integrity sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A== dependencies: "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-wrap-function" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.1" -"@babel/helper-replace-supers@^7.10.4", "@babel/helper-replace-supers@^7.4.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" - integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== +"@babel/helper-replace-supers@^7.12.1", "@babel/helper-replace-supers@^7.4.0": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz#f009a17543bbbbce16b06206ae73b63d3fca68d9" + integrity sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA== dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.12.1" "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" -"@babel/helper-simple-access@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" - integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== +"@babel/helper-simple-access@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" + integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== dependencies: - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.1" -"@babel/helper-skip-transparent-expression-wrappers@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" - integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q== +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.12.1" "@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0", "@babel/helper-split-export-declaration@^7.4.0": version "7.11.0" @@ -272,24 +258,29 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/helper-validator-option@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" + integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A== + "@babel/helper-wrap-function@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" - integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" + integrity sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow== dependencies: "@babel/helper-function-name" "^7.10.4" "@babel/template" "^7.10.4" "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helpers@^7.10.4", "@babel/helpers@^7.4.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" - integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== +"@babel/helpers@^7.12.5", "@babel/helpers@^7.4.3": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" + integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== dependencies: "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" "@babel/highlight@^7.0.0", "@babel/highlight@^7.10.4": version "7.10.4" @@ -300,18 +291,18 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5", "@babel/parser@^7.4.3": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" - integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.12.7", "@babel/parser@^7.4.3": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.7.tgz#fee7b39fe809d0e73e5b25eecaf5780ef3d73056" + integrity sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg== -"@babel/plugin-proposal-async-generator-functions@^7.10.4", "@babel/plugin-proposal-async-generator-functions@^7.2.0": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558" - integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg== +"@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz#dc6c1170e27d8aca99ff65f4925bd06b1c90550e" + integrity sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A== dependencies: "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" "@babel/plugin-syntax-async-generators" "^7.8.0" "@babel/plugin-proposal-class-properties@7.4.0": @@ -322,12 +313,12 @@ "@babel/helper-create-class-features-plugin" "^7.4.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-proposal-class-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" - integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== +"@babel/plugin-proposal-class-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" + integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-proposal-decorators@7.4.0": @@ -339,50 +330,50 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-decorators" "^7.2.0" -"@babel/plugin-proposal-dynamic-import@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" - integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== +"@babel/plugin-proposal-dynamic-import@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc" + integrity sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-export-namespace-from@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54" - integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg== +"@babel/plugin-proposal-export-namespace-from@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" + integrity sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.10.4", "@babel/plugin-proposal-json-strings@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" - integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== +"@babel/plugin-proposal-json-strings@^7.12.1", "@babel/plugin-proposal-json-strings@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c" + integrity sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-logical-assignment-operators@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8" - integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q== +"@babel/plugin-proposal-logical-assignment-operators@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751" + integrity sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" - integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" + integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" - integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== +"@babel/plugin-proposal-numeric-separator@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz#8bf253de8139099fea193b297d23a9d406ef056b" + integrity sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-numeric-separator" "^7.10.4" @@ -395,46 +386,46 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.11.0", "@babel/plugin-proposal-object-rest-spread@^7.4.3": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" - integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== +"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.4.3": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.10.4" + "@babel/plugin-transform-parameters" "^7.12.1" -"@babel/plugin-proposal-optional-catch-binding@^7.10.4", "@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" - integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== +"@babel/plugin-proposal-optional-catch-binding@^7.12.1", "@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" + integrity sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" - integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== +"@babel/plugin-proposal-optional-chaining@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz#e02f0ea1b5dc59d401ec16fb824679f683d3303c" + integrity sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-private-methods@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" - integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== +"@babel/plugin-proposal-private-methods@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz#86814f6e7a21374c980c10d38b4493e703f4a389" + integrity sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" - integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== +"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" + integrity sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-async-generators@^7.2.0", "@babel/plugin-syntax-async-generators@^7.8.0": @@ -444,17 +435,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" - integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== +"@babel/plugin-syntax-class-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" + integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-decorators@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz#6853085b2c429f9d322d02f5a635018cdeb2360c" - integrity sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw== + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.1.tgz#81a8b535b284476c41be6de06853a8802b98c5dd" + integrity sha512-ir9YW5daRrTYiy9UJ2TzdNIJEZu8KclVzDcfSt4iEmOtwQ4llPtWInNKJyKnVXp1vE4bbVd5S31M/im3mYMO1w== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -480,9 +471,9 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-flow@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz#53351dd7ae01995e567d04ce42af1a6e0ba846a6" - integrity sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ== + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.1.tgz#a77670d9abe6d63e8acadf4c31bb1eb5a506bbdd" + integrity sha512-1lBLLmtxrwpm4VKmtVFselI/P3pX+G63fAtUUt6b2Nzgao77KNDwyuRt90Mj2/9pKobtt68FdvjfqohZjg/FCA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -493,10 +484,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz#39abaae3cbf710c4373d8429484e6ba21340166c" - integrity sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g== +"@babel/plugin-syntax-jsx@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -542,47 +533,47 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" - integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== +"@babel/plugin-syntax-top-level-await@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" + integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-typescript@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz#2f55e770d3501e83af217d782cb7517d7bb34d25" - integrity sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ== +"@babel/plugin-syntax-typescript@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz#460ba9d77077653803c3dd2e673f76d66b4029e5" + integrity sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-arrow-functions@^7.10.4", "@babel/plugin-transform-arrow-functions@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" - integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== +"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" + integrity sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-async-to-generator@^7.10.4", "@babel/plugin-transform-async-to-generator@^7.4.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" - integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== +"@babel/plugin-transform-async-to-generator@^7.12.1", "@babel/plugin-transform-async-to-generator@^7.4.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" + integrity sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A== dependencies: - "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-module-imports" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" -"@babel/plugin-transform-block-scoped-functions@^7.10.4", "@babel/plugin-transform-block-scoped-functions@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" - integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== +"@babel/plugin-transform-block-scoped-functions@^7.12.1", "@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" + integrity sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.10.4", "@babel/plugin-transform-block-scoping@^7.4.0": - version "7.11.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215" - integrity sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew== +"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.4.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1" + integrity sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -600,24 +591,24 @@ "@babel/helper-split-export-declaration" "^7.4.0" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.10.4", "@babel/plugin-transform-classes@^7.4.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" - integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.4.3": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" + integrity sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog== dependencies: "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-define-map" "^7.10.4" "@babel/helper-function-name" "^7.10.4" "@babel/helper-optimise-call-expression" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" "@babel/helper-split-export-declaration" "^7.10.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.10.4", "@babel/plugin-transform-computed-properties@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" - integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== +"@babel/plugin-transform-computed-properties@^7.12.1", "@babel/plugin-transform-computed-properties@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" + integrity sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -628,32 +619,32 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.10.4", "@babel/plugin-transform-destructuring@^7.4.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" - integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.4.3": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" + integrity sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.3", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" - integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== +"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.3", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" + integrity sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-duplicate-keys@^7.10.4", "@babel/plugin-transform-duplicate-keys@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" - integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== +"@babel/plugin-transform-duplicate-keys@^7.12.1", "@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228" + integrity sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-exponentiation-operator@^7.10.4", "@babel/plugin-transform-exponentiation-operator@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" - integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== +"@babel/plugin-transform-exponentiation-operator@^7.12.1", "@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0" + integrity sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" @@ -666,106 +657,106 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-flow" "^7.2.0" -"@babel/plugin-transform-for-of@^7.10.4", "@babel/plugin-transform-for-of@^7.4.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" - integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== +"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.4.3": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa" + integrity sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-function-name@^7.10.4", "@babel/plugin-transform-function-name@^7.4.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" - integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== +"@babel/plugin-transform-function-name@^7.12.1", "@babel/plugin-transform-function-name@^7.4.3": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" + integrity sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw== dependencies: "@babel/helper-function-name" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-literals@^7.10.4", "@babel/plugin-transform-literals@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" - integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== +"@babel/plugin-transform-literals@^7.12.1", "@babel/plugin-transform-literals@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" + integrity sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.10.4", "@babel/plugin-transform-member-expression-literals@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" - integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== +"@babel/plugin-transform-member-expression-literals@^7.12.1", "@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" + integrity sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-modules-amd@^7.10.4", "@babel/plugin-transform-modules-amd@^7.2.0": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" - integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw== +"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" + integrity sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ== dependencies: - "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-module-transforms" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.10.4", "@babel/plugin-transform-modules-commonjs@^7.4.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" - integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== +"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.4.3": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" + integrity sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag== dependencies: - "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-module-transforms" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-simple-access" "^7.12.1" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.10.4", "@babel/plugin-transform-modules-systemjs@^7.4.0": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" - integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw== +"@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.4.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086" + integrity sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q== dependencies: "@babel/helper-hoist-variables" "^7.10.4" - "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-module-transforms" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-identifier" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.10.4", "@babel/plugin-transform-modules-umd@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" - integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== +"@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902" + integrity sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q== dependencies: - "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-module-transforms" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4", "@babel/plugin-transform-named-capturing-groups-regex@^7.4.2": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" - integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.4.2": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753" + integrity sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.1" -"@babel/plugin-transform-new-target@^7.10.4", "@babel/plugin-transform-new-target@^7.4.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" - integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== +"@babel/plugin-transform-new-target@^7.12.1", "@babel/plugin-transform-new-target@^7.4.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0" + integrity sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-object-super@^7.10.4", "@babel/plugin-transform-object-super@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" - integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== +"@babel/plugin-transform-object-super@^7.12.1", "@babel/plugin-transform-object-super@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" + integrity sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" -"@babel/plugin-transform-parameters@^7.10.4", "@babel/plugin-transform-parameters@^7.4.3": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" - integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw== +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.4.3": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" + integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg== dependencies: - "@babel/helper-get-function-arity" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-property-literals@^7.10.4", "@babel/plugin-transform-property-literals@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" - integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== +"@babel/plugin-transform-property-literals@^7.12.1", "@babel/plugin-transform-property-literals@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" + integrity sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -778,9 +769,9 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-react-constant-elements@^7.0.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz#0f485260bf1c29012bb973e7e404749eaac12c9e" - integrity sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g== + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.1.tgz#4471f0851feec3231cc9aaa0dccde39947c1ac1e" + integrity sha512-KOHd0tIRLoER+J+8f9DblZDa1fLGPwaaN1DI1TVHuQFOpjHV22C3CUB3obeC4fexHY9nx+fH0hQNvLFFfA1mxA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -791,67 +782,65 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz#b5795f4e3e3140419c3611b7a2a3832b9aef328d" - integrity sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw== +"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d" + integrity sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-jsx-development@^7.10.4": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.11.5.tgz#e1439e6a57ee3d43e9f54ace363fb29cefe5d7b6" - integrity sha512-cImAmIlKJ84sDmpQzm4/0q/2xrXlDezQoixy3qoz1NJeZL/8PRon6xZtluvr4H4FzwlDGI5tCcFupMnXGtr+qw== +"@babel/plugin-transform-react-jsx-development@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.7.tgz#4c2a647de79c7e2b16bfe4540677ba3121e82a08" + integrity sha512-Rs3ETtMtR3VLXFeYRChle5SsP/P9Jp/6dsewBQfokDSzKJThlsuFcnzLTDRALiUmTC48ej19YD9uN1mupEeEDg== dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.11.5" + "@babel/helper-builder-react-jsx-experimental" "^7.12.4" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.12.1" -"@babel/plugin-transform-react-jsx-self@^7.0.0", "@babel/plugin-transform-react-jsx-self@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz#cd301a5fed8988c182ed0b9d55e9bd6db0bd9369" - integrity sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg== +"@babel/plugin-transform-react-jsx-self@^7.0.0", "@babel/plugin-transform-react-jsx-self@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.1.tgz#ef43cbca2a14f1bd17807dbe4376ff89d714cf28" + integrity sha512-FbpL0ieNWiiBB5tCldX17EtXgmzeEZjFrix72rQYeq9X6nUK38HCaxexzVQrZWXanxKJPKVVIU37gFjEQYkPkA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-source@^7.0.0", "@babel/plugin-transform-react-jsx-source@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz#34f1779117520a779c054f2cdd9680435b9222b4" - integrity sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA== +"@babel/plugin-transform-react-jsx-source@^7.0.0", "@babel/plugin-transform-react-jsx-source@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.1.tgz#d07de6863f468da0809edcf79a1aa8ce2a82a26b" + integrity sha512-keQ5kBfjJNRc6zZN1/nVHCd6LLIHq4aUKcVnvE/2l+ZZROSbqoiGFRtT5t3Is89XJxBQaP7NLZX2jgGHdZvvFQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz#673c9f913948764a4421683b2bef2936968fddf2" - integrity sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A== +"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.7.tgz#8b14d45f6eccd41b7f924bcb65c021e9f0a06f7f" + integrity sha512-YFlTi6MEsclFAPIDNZYiCRbneg1MFGao9pPG9uD5htwE0vDbPaMUMeYd6itWjw7K4kro4UbdQf3ljmFl9y48dQ== dependencies: "@babel/helper-builder-react-jsx" "^7.10.4" - "@babel/helper-builder-react-jsx-experimental" "^7.10.4" + "@babel/helper-builder-react-jsx-experimental" "^7.12.4" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.12.1" -"@babel/plugin-transform-react-pure-annotations@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz#3eefbb73db94afbc075f097523e445354a1c6501" - integrity sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A== +"@babel/plugin-transform-react-pure-annotations@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" + integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== dependencies: "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-regenerator@^7.10.4", "@babel/plugin-transform-regenerator@^7.4.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" - integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== +"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.4.3": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753" + integrity sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.10.4", "@babel/plugin-transform-reserved-words@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" - integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== +"@babel/plugin-transform-reserved-words@^7.12.1", "@babel/plugin-transform-reserved-words@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8" + integrity sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -865,66 +854,64 @@ resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.10.4", "@babel/plugin-transform-shorthand-properties@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" - integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== +"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" + integrity sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-spread@^7.11.0", "@babel/plugin-transform-spread@^7.2.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc" - integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw== +"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" + integrity sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng== dependencies: "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" -"@babel/plugin-transform-sticky-regex@^7.10.4", "@babel/plugin-transform-sticky-regex@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" - integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== +"@babel/plugin-transform-sticky-regex@^7.12.7", "@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz#560224613ab23987453948ed21d0b0b193fa7fad" + integrity sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-regex" "^7.10.4" -"@babel/plugin-transform-template-literals@^7.10.4", "@babel/plugin-transform-template-literals@^7.2.0": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" - integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw== +"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843" + integrity sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-typeof-symbol@^7.10.4", "@babel/plugin-transform-typeof-symbol@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" - integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== +"@babel/plugin-transform-typeof-symbol@^7.12.1", "@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz#9ca6be343d42512fbc2e68236a82ae64bc7af78a" + integrity sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-typescript@^7.3.2": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz#2b4879676af37342ebb278216dd090ac67f13abb" - integrity sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w== + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz#d92cc0af504d510e26a754a7dbc2e5c8cd9c7ab4" + integrity sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.5" + "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-typescript" "^7.10.4" + "@babel/plugin-syntax-typescript" "^7.12.1" -"@babel/plugin-transform-unicode-escapes@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" - integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== +"@babel/plugin-transform-unicode-escapes@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz#5232b9f81ccb07070b7c3c36c67a1b78f1845709" + integrity sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-unicode-regex@^7.10.4", "@babel/plugin-transform-unicode-regex@^7.4.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" - integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== +"@babel/plugin-transform-unicode-regex@^7.12.1", "@babel/plugin-transform-unicode-regex@^7.4.3": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb" + integrity sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" "@babel/preset-env@7.4.3": @@ -982,29 +969,30 @@ semver "^5.5.0" "@babel/preset-env@^7.1.6": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.5.tgz#18cb4b9379e3e92ffea92c07471a99a2914e4272" - integrity sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA== + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.7.tgz#54ea21dbe92caf6f10cb1a0a576adc4ebf094b55" + integrity sha512-OnNdfAr1FUQg7ksb7bmbKoby4qFOHw6DKWWUNB9KqnnCldxhxJlP+21dpyaWFmf2h0rTbOkXJtAGevY3XW1eew== dependencies: - "@babel/compat-data" "^7.11.0" - "@babel/helper-compilation-targets" "^7.10.4" - "@babel/helper-module-imports" "^7.10.4" + "@babel/compat-data" "^7.12.7" + "@babel/helper-compilation-targets" "^7.12.5" + "@babel/helper-module-imports" "^7.12.5" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-proposal-async-generator-functions" "^7.10.4" - "@babel/plugin-proposal-class-properties" "^7.10.4" - "@babel/plugin-proposal-dynamic-import" "^7.10.4" - "@babel/plugin-proposal-export-namespace-from" "^7.10.4" - "@babel/plugin-proposal-json-strings" "^7.10.4" - "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" - "@babel/plugin-proposal-numeric-separator" "^7.10.4" - "@babel/plugin-proposal-object-rest-spread" "^7.11.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" - "@babel/plugin-proposal-optional-chaining" "^7.11.0" - "@babel/plugin-proposal-private-methods" "^7.10.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" + "@babel/helper-validator-option" "^7.12.1" + "@babel/plugin-proposal-async-generator-functions" "^7.12.1" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-dynamic-import" "^7.12.1" + "@babel/plugin-proposal-export-namespace-from" "^7.12.1" + "@babel/plugin-proposal-json-strings" "^7.12.1" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-numeric-separator" "^7.12.7" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.7" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.10.4" + "@babel/plugin-syntax-class-properties" "^7.12.1" "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.0" @@ -1014,45 +1002,42 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.10.4" - "@babel/plugin-transform-arrow-functions" "^7.10.4" - "@babel/plugin-transform-async-to-generator" "^7.10.4" - "@babel/plugin-transform-block-scoped-functions" "^7.10.4" - "@babel/plugin-transform-block-scoping" "^7.10.4" - "@babel/plugin-transform-classes" "^7.10.4" - "@babel/plugin-transform-computed-properties" "^7.10.4" - "@babel/plugin-transform-destructuring" "^7.10.4" - "@babel/plugin-transform-dotall-regex" "^7.10.4" - "@babel/plugin-transform-duplicate-keys" "^7.10.4" - "@babel/plugin-transform-exponentiation-operator" "^7.10.4" - "@babel/plugin-transform-for-of" "^7.10.4" - "@babel/plugin-transform-function-name" "^7.10.4" - "@babel/plugin-transform-literals" "^7.10.4" - "@babel/plugin-transform-member-expression-literals" "^7.10.4" - "@babel/plugin-transform-modules-amd" "^7.10.4" - "@babel/plugin-transform-modules-commonjs" "^7.10.4" - "@babel/plugin-transform-modules-systemjs" "^7.10.4" - "@babel/plugin-transform-modules-umd" "^7.10.4" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" - "@babel/plugin-transform-new-target" "^7.10.4" - "@babel/plugin-transform-object-super" "^7.10.4" - "@babel/plugin-transform-parameters" "^7.10.4" - "@babel/plugin-transform-property-literals" "^7.10.4" - "@babel/plugin-transform-regenerator" "^7.10.4" - "@babel/plugin-transform-reserved-words" "^7.10.4" - "@babel/plugin-transform-shorthand-properties" "^7.10.4" - "@babel/plugin-transform-spread" "^7.11.0" - "@babel/plugin-transform-sticky-regex" "^7.10.4" - "@babel/plugin-transform-template-literals" "^7.10.4" - "@babel/plugin-transform-typeof-symbol" "^7.10.4" - "@babel/plugin-transform-unicode-escapes" "^7.10.4" - "@babel/plugin-transform-unicode-regex" "^7.10.4" + "@babel/plugin-syntax-top-level-await" "^7.12.1" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-async-to-generator" "^7.12.1" + "@babel/plugin-transform-block-scoped-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.1" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-computed-properties" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-dotall-regex" "^7.12.1" + "@babel/plugin-transform-duplicate-keys" "^7.12.1" + "@babel/plugin-transform-exponentiation-operator" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-function-name" "^7.12.1" + "@babel/plugin-transform-literals" "^7.12.1" + "@babel/plugin-transform-member-expression-literals" "^7.12.1" + "@babel/plugin-transform-modules-amd" "^7.12.1" + "@babel/plugin-transform-modules-commonjs" "^7.12.1" + "@babel/plugin-transform-modules-systemjs" "^7.12.1" + "@babel/plugin-transform-modules-umd" "^7.12.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" + "@babel/plugin-transform-new-target" "^7.12.1" + "@babel/plugin-transform-object-super" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-property-literals" "^7.12.1" + "@babel/plugin-transform-regenerator" "^7.12.1" + "@babel/plugin-transform-reserved-words" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/plugin-transform-sticky-regex" "^7.12.7" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/plugin-transform-typeof-symbol" "^7.12.1" + "@babel/plugin-transform-unicode-escapes" "^7.12.1" + "@babel/plugin-transform-unicode-regex" "^7.12.1" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.11.5" - browserslist "^4.12.0" - core-js-compat "^3.6.2" - invariant "^2.2.2" - levenary "^1.1.1" + "@babel/types" "^7.12.7" + core-js-compat "^3.7.0" semver "^5.5.0" "@babel/preset-modules@^0.1.3": @@ -1078,17 +1063,17 @@ "@babel/plugin-transform-react-jsx-source" "^7.0.0" "@babel/preset-react@^7.0.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.4.tgz#92e8a66d816f9911d11d4cc935be67adfc82dbcf" - integrity sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw== + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.7.tgz#36d61d83223b07b6ac4ec55cf016abb0f70be83b" + integrity sha512-wKeTdnGUP5AEYCYQIMeXMMwU7j+2opxrG0WzuZfxuuW9nhKvvALBjl67653CWamZJVefuJGI219G591RSldrqQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-react-display-name" "^7.10.4" - "@babel/plugin-transform-react-jsx" "^7.10.4" - "@babel/plugin-transform-react-jsx-development" "^7.10.4" - "@babel/plugin-transform-react-jsx-self" "^7.10.4" - "@babel/plugin-transform-react-jsx-source" "^7.10.4" - "@babel/plugin-transform-react-pure-annotations" "^7.10.4" + "@babel/plugin-transform-react-display-name" "^7.12.1" + "@babel/plugin-transform-react-jsx" "^7.12.7" + "@babel/plugin-transform-react-jsx-development" "^7.12.7" + "@babel/plugin-transform-react-jsx-self" "^7.12.1" + "@babel/plugin-transform-react-jsx-source" "^7.12.1" + "@babel/plugin-transform-react-pure-annotations" "^7.12.1" "@babel/preset-typescript@7.3.3": version "7.3.3" @@ -1105,41 +1090,41 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" - integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.2", "@babel/runtime@^7.8.4": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.4", "@babel/template@^7.4.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== +"@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.4.0": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" + integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/parser" "^7.12.7" + "@babel/types" "^7.12.7" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5", "@babel/traverse@^7.4.3": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" - integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.9", "@babel/traverse@^7.4.3": + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.9.tgz#fad26c972eabbc11350e0b695978de6cc8e8596f" + integrity sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.5" + "@babel/generator" "^7.12.5" "@babel/helper-function-name" "^7.10.4" "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.5" - "@babel/types" "^7.11.5" + "@babel/parser" "^7.12.7" + "@babel/types" "^7.12.7" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" - integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz#6039ff1e242640a29452c9ae572162ec9a8f5d13" + integrity sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ== dependencies: "@babel/helper-validator-identifier" "^7.10.4" lodash "^4.17.19" @@ -1186,43 +1171,79 @@ dependencies: tslib "^1.10.0" -"@fluentui/react-focus@^7.16.10": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@fluentui/react-focus/-/react-focus-7.16.10.tgz#e82e0719f48877bfc7220d359db4859c4d10b99d" - integrity sha512-+4aP36KjD2RrijRBr6aPYNiBm9M9+33DOHpAdcE0K93TToLIlQ/WIwZGDNbM/6dPFD6vgUj+ya5rvfy6sbibjw== +"@fluentui/react-compose@^0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@fluentui/react-compose/-/react-compose-0.19.12.tgz#405dfc19b4ae2b5f1c86bf7091ac15a205978206" + integrity sha512-GTcZ3kd2rTk3Q7xXJB8cTPfv0Q0vOdeIrLcJ02lXfjE9h3GPTE62rV4iFzBIZyXIKL8IdR6Jh8WNIBkVMWhhxw== + dependencies: + "@types/classnames" "^2.2.9" + "@uifabric/set-version" "^7.0.23" + "@uifabric/utilities" "^7.33.2" + classnames "^2.2.6" + tslib "^1.10.0" + +"@fluentui/react-focus@^7.16.19": + version "7.16.19" + resolved "https://registry.yarnpkg.com/@fluentui/react-focus/-/react-focus-7.16.19.tgz#7e7be46b6a7c004b61c360f61a275004abdb0f93" + integrity sha512-BUnSJ7CRs0gfaEXVr5w9YQsZXB18J35k7H7eyB5wLLLgwdK/ogt6uYcu3p0q5ZEjju8C/wmJ2zgwFCMKiAyTUA== dependencies: "@fluentui/keyboard-key" "^0.2.12" + "@fluentui/react-theme-provider" "^0.18.0" "@uifabric/merge-styles" "^7.19.1" "@uifabric/set-version" "^7.0.23" - "@uifabric/styling" "^7.16.10" - "@uifabric/utilities" "^7.32.4" + "@uifabric/styling" "^7.16.18" + "@uifabric/utilities" "^7.33.2" tslib "^1.10.0" -"@fluentui/react-window-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@fluentui/react-window-provider/-/react-window-provider-0.3.3.tgz#2950c4e19b28f24079d0e9d6a7a7e4d5b79ad115" - integrity sha512-MVPf2hqOQ17LAZsuvGcr3oOHksAskUm+fCYdXFhbVoAgsCDVTIuH6i8XgHFd6YjBtzjZmI4+k/3NTQfDqBX8EQ== +"@fluentui/react-stylesheets@^0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@fluentui/react-stylesheets/-/react-stylesheets-0.2.4.tgz#65cc6136f84ff3fd3d1c9188bed0a34b9573f589" + integrity sha512-zTyDxBsQsm5iz59SXn83+BrC3tUnwQdJc/xcPYWWVISIyPby/75URbWK5uYJ5p5Qy0GrpgKDGYAbpXZlN89SRQ== + dependencies: + "@uifabric/set-version" "^7.0.23" + tslib "^1.10.0" + +"@fluentui/react-theme-provider@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@fluentui/react-theme-provider/-/react-theme-provider-0.18.0.tgz#72fc1809a2b0720bdb66b9ff7d0505e69e036308" + integrity sha512-dKSOZ1Sl2uVrDzjvfRtwHUluedU0MhEASukyeqGTpKTmg3ucPMYEZn+dgzFqRNpjs9trbb++N8R6Z19CWokXOw== + dependencies: + "@fluentui/react-compose" "^0.19.12" + "@fluentui/react-stylesheets" "^0.2.4" + "@fluentui/react-window-provider" "^1.0.1" + "@fluentui/theme" "^1.7.0" + "@uifabric/merge-styles" "^7.19.1" + "@uifabric/react-hooks" "^7.13.9" + "@uifabric/set-version" "^7.0.23" + "@uifabric/utilities" "^7.33.2" + classnames "^2.2.6" + tslib "^1.10.0" + +"@fluentui/react-window-provider@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@fluentui/react-window-provider/-/react-window-provider-1.0.1.tgz#8ec71db8cfd57e11f00ed42c5c1377ef4dfe5f6b" + integrity sha512-5hvruDyF0uE8+6YN6Y+d2sEzexBadxUNxUjDcDreTPsmtHPwF5FPBYLhoD7T84L5U4YNvKxKh25tYJm6E0GE2w== dependencies: "@uifabric/set-version" "^7.0.23" tslib "^1.10.0" "@fluentui/react@^7.135.0": - version "7.145.0" - resolved "https://registry.yarnpkg.com/@fluentui/react/-/react-7.145.0.tgz#d9ff288cbaf13a61c5d0d36d19eaa693519e4e4c" - integrity sha512-RNYTWwRQhIFKoMHmDkMLF48KcH91brHV/WXCEboIxsmtHm4HyYVG4Zpjib6UG2XOS1zk9sBefHao/zTx3pdG8Q== + version "7.153.4" + resolved "https://registry.yarnpkg.com/@fluentui/react/-/react-7.153.4.tgz#4aabeb9755ee08232d26bd05f3d0db29ea021a96" + integrity sha512-ksglyptT/nkjChmIZ2OiushPJMMBfYgJHclMYqfp8Z4TGeXWPaYT6l5HfKeEZJTsMz3WtJpy+6MB48Yh4PYOLA== dependencies: "@uifabric/set-version" "^7.0.23" - office-ui-fabric-react "^7.145.0" + office-ui-fabric-react "^7.153.4" tslib "^1.10.0" -"@fluentui/theme@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@fluentui/theme/-/theme-1.3.0.tgz#15a65c6ff20c11a1a7550919b1a71b9c922e9255" - integrity sha512-OVN3yPdJShOGhTakalI5DC9+8myOhLPKzY/ZlICnNoKhh7cbPVrvdCnv2fLcDyZYMQg0CnB3oAaghBHiIW3jmA== +"@fluentui/theme@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@fluentui/theme/-/theme-1.7.0.tgz#822adcc4b0c9cc057984b4ada21c30856907a8e6" + integrity sha512-pzqDZC2bVD6/S45Bnve4wmrXi4cN7XiCr+OhzvgmoQfDkm5vyXsa82/cVtif/zy1OFU96S9zOTtt3e+QQuGUUg== dependencies: "@uifabric/merge-styles" "^7.19.1" "@uifabric/set-version" "^7.0.23" - "@uifabric/utilities" "^7.32.4" + "@uifabric/utilities" "^7.33.2" tslib "^1.10.0" "@hapi/address@2.x.x": @@ -1414,10 +1435,10 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" -"@jest/types@^26.5.2": - version "26.5.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.5.2.tgz#44c24f30c8ee6c7f492ead9ec3f3c62a5289756d" - integrity sha512-QDs5d0gYiyetI8q+2xWdkixVQMklReZr4ltw7GFDtb4fuJIBCE6mzj2LnitGqCuAlLap6wPyb8fpoHgwZz5fdg== +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" @@ -1426,9 +1447,9 @@ chalk "^4.0.0" "@microsoft/load-themed-styles@^1.10.26": - version "1.10.108" - resolved "https://registry.yarnpkg.com/@microsoft/load-themed-styles/-/load-themed-styles-1.10.108.tgz#29dfb22e75a50e46a64cb338e2dc680b395f5f01" - integrity sha512-ETEADhZJwttKGPABitB7lDD/22ULL8AG1SKrn9uhYxjF1w1IaS6YS/yCPlDVALeh20zF8LJEEZ2MGb7DgVVYUw== + version "1.10.139" + resolved "https://registry.yarnpkg.com/@microsoft/load-themed-styles/-/load-themed-styles-1.10.139.tgz#d5d9c5a04d08054008f71defcc5a1abb2ecb743a" + integrity sha512-nqKpS5lfFaJGDATrwT+T2hM4WSMlBDwfh9W7+xgqfOQkV6h8y7uZq8Exro9C276Y3qd7M6jZ3pavSmsWgLk79w== "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -1471,13 +1492,13 @@ dependencies: "@babel/core" ">=7.9.0" -"@stylelint/postcss-markdown@^0.36.1": - version "0.36.1" - resolved "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz#829b87e6c0f108014533d9d7b987dc9efb6632e8" - integrity sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw== +"@stylelint/postcss-markdown@^0.36.2": + version "0.36.2" + resolved "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz#0a540c4692f8dcdfc13c8e352c17e7bfee2bb391" + integrity sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ== dependencies: - remark "^12.0.0" - unist-util-find-all-after "^3.0.1" + remark "^13.0.0" + unist-util-find-all-after "^3.0.2" "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": version "4.2.0" @@ -1583,9 +1604,9 @@ loader-utils "^1.1.0" "@types/babel__core@^7.1.0": - version "7.1.10" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.10.tgz#ca58fc195dd9734e77e57c6f2df565623636ab40" - integrity sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw== + version "7.1.12" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d" + integrity sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1601,24 +1622,29 @@ "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.3.tgz#b8aaeba0a45caca7b56a5de9459872dde3727214" - integrity sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q== + version "7.4.0" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" + integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.15.tgz#db9e4238931eb69ef8aab0ad6523d4d4caa39d03" - integrity sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A== + version "7.0.16" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.16.tgz#0bbbf70c7bc4193210dd27e252c51260a37cd6a7" + integrity sha512-S63Dt4CZOkuTmpLGGWtT/mQdVORJOpx6SZWGVaP56dda/0Nx5nEe82K7/LAm8zYr6SfMq+1N2OreIOrHAx656w== dependencies: "@babel/types" "^7.3.0" +"@types/classnames@^2.2.9": + version "2.2.11" + resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.11.tgz#2521cc86f69d15c5b90664e4829d84566052c1cf" + integrity sha512-2koNhpWm3DgWRp5tpkiJ8JGc1xTn2q0l+jUNUE7oMKXUf5NpI9AIdC4kbjGNFBdHtcxBD18LAksoudAVhFKCjw== + "@types/d3-array@^1": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-1.2.7.tgz#34dc654d34fc058c41c31dbca1ed68071a8fcc17" - integrity sha512-51vHWuUyDOi+8XuwPrTw3cFqyh2Slg9y8COYkRfjCPG9TfYqY0hoNPzv/8BrcAy0FeQBzqEo/D/8Nk2caOQJnA== + version "1.2.8" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-1.2.8.tgz#b852381cb68e31e46bfa23ee70a383cbc6d62146" + integrity sha512-wWV0wT6oLUGprrOR5LMK7Dh8EBiondhnqINsvazv6UucYfTdb2oaFF4knlqzZV2RKB9ZC9G7G1Iojt8b/wolsw== "@types/d3-axis@^1": version "1.0.14" @@ -1640,9 +1666,9 @@ integrity sha512-U6YojfET6ITL1/bUJo+/Lh3pMV9XPAfOWwbshl3y3RlgAX9VO/Bxa13IMAylZIDY4VsA3Gkh29kZP1AcAeyoYA== "@types/d3-collection@*": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-collection/-/d3-collection-1.0.8.tgz#aa9552c570a96e33c132e0fd20e331f64baa9dd5" - integrity sha512-y5lGlazdc0HNO0F3UUX2DPE7OmYvd9Kcym4hXwrJcNUkDaypR5pX+apuMikl9LfTxKItJsY9KYvzBulpCKyvuQ== + version "1.0.10" + resolved "https://registry.yarnpkg.com/@types/d3-collection/-/d3-collection-1.0.10.tgz#bca161e336156968f267c077f7f2bfa8ff224e58" + integrity sha512-54Fdv8u5JbuXymtmXm2SYzi1x/Svt+jfWBU5junkhrCewL92VjqtCBDn97coBRVwVFmYNnVTNDyV8gQyPYfm+A== "@types/d3-color@^1": version "1.4.1" @@ -1753,9 +1779,9 @@ integrity sha512-GjKQWVZO6Sa96HiKO6R93VBE8DUW+DDkFpIMf9vpY5S78qZTlRRSNUsHr/afDpF7TvLDV7VxrUFOWW7vdIlYkA== "@types/d3-shape@^1": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.4.tgz#5a6d8c3026ba8e8a1a985bda8da40acfc9b7b079" - integrity sha512-fxmOjs+UqNQGpztD5BOo+KriE0jLFrBP4Ct++0QExv/xfDOT1cpcMxgsZ+5qPmnR0t+GjbwAe1Um1PHpv3G4oA== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.5.tgz#c0164c1be1429473016f855871d487f806c4e968" + integrity sha512-aPEax03owTAKynoK8ZkmkZEDZvvT4Y5pWgii4Jp4oQt0gH45j6siDl9gNDVC5kl64XHN2goN9jbYoHK88tFAcA== dependencies: "@types/d3-path" "^1" @@ -1795,9 +1821,9 @@ "@types/d3-selection" "^1" "@types/d3@^5.7.2": - version "5.16.3" - resolved "https://registry.yarnpkg.com/@types/d3/-/d3-5.16.3.tgz#265d506a1b61f558084f2c660f8dd2c93a6d16c8" - integrity sha512-s3wrhYhu25XZQ5p1hI9gEMSX5bx7lg9hAmi0+i5r3v75Gz1zRTgB2Q0psx+SO+4K0AO/PPJ1pnHCz64pANN/4w== + version "5.16.4" + resolved "https://registry.yarnpkg.com/@types/d3/-/d3-5.16.4.tgz#a7dc24a3dc1c19922eee72ba16144fd5bcea987a" + integrity sha512-2u0O9iP1MubFiQ+AhR1id4Egs+07BLtvRATG6IL2Gs9+KzdrfaxCKNq5hxEyw1kxwsqB/lCgr108XuHcKtb/5w== dependencies: "@types/d3-array" "^1" "@types/d3-axis" "^1" @@ -1892,20 +1918,27 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.30.tgz#44cb52f32a809734ca562e685c6473b5754a7818" integrity sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA== +"@types/mdast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" + integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== + dependencies: + "@types/unist" "*" + "@types/minimist@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" - integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" + integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== "@types/node@*": - version "14.11.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.7.tgz#4d9673b8331ce262628ea89d9ef3964b6c1e5489" - integrity sha512-hSEXknS4KiayUdZ7401J/T6eykXHJkDEipnyQMJ4/GstK4kWjbHnwXlcpvIWfPKiEH1JU96DkbzJ1nHRmpmKLw== + version "14.14.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.10.tgz#5958a82e41863cfc71f2307b3748e3491ba03785" + integrity sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ== "@types/node@^10.14.2": - version "10.17.38" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.38.tgz#951dc5ba517af0381bd8134636f93bcd93ae3e1b" - integrity sha512-pIQORpqlV+QwNix8K1lMmyS7fp80MkQruXp3eMCYAliS3Z1RMYkd4Wf22+iaKLffkngtlIkhiuXOdwLq1zrclg== + version "10.17.48" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.48.tgz#726e7f25d00bf58d79c8f00dd586dd9a10d06a4f" + integrity sha512-Agl6xbYP6FOMDeAsr3QVZ+g7Yzg0uhPHWx0j5g4LFdUBHVtqtU+gH660k/lCEe506jJLOGbEzsnqPDTZGJQLag== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1934,10 +1967,10 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^15.x || ^16.x": - version "16.9.51" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.51.tgz#f8aa51ffa9996f1387f63686696d9b59713d2b60" - integrity sha512-lQa12IyO+DMlnSZ3+AGHRUiUcpK47aakMMoBG8f7HGxJT8Yfe+WE128HIXaHOHVPReAW0oDS3KAI0JI2DDe1PQ== +"@types/react@*": + version "17.0.0" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.0.tgz#5af3eb7fad2807092f0046a1302b7823e27919b8" + integrity sha512-aj/L7RIMsRlWML3YB6KZiXB3fV2t41+5RBGYF8z+tAKU43Px8C3cYUZsDvf1/+Bm4FK21QWBrDutu8ZJ/70qOw== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -1950,12 +1983,20 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@types/react@^15.x || ^16.x": + version "16.14.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.2.tgz#85dcc0947d0645349923c04ccef6018a1ab7538c" + integrity sha512-BzzcAlyDxXl2nANlabtT4thtvbbnhee8hMmH/CcJrISDBVcJS1iOsP1f0OAgSdGE0MsY9tqcrb9YoZcOFv9dbQ== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== -"@types/unist@^2.0.0", "@types/unist@^2.0.2": +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== @@ -1973,9 +2014,9 @@ "@types/yargs-parser" "*" "@types/yargs@^15.0.0": - version "15.0.8" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.8.tgz#7644904cad7427eb704331ea9bf1ee5499b82e23" - integrity sha512-b0BYzFUzBpOhPjpl1wtAHU994jBeKF4TKVlT7ssFv44T617XNcPdRoG4AzHLVshLzlrF7i3lTelH7UbuNYV58Q== + version "15.0.11" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.11.tgz#361d7579ecdac1527687bcebf9946621c12ab78c" + integrity sha512-jfcNBxHFYJ4nPIacsi3woz1+kvUO6s1CyeEhtnDHBjHUMNj5UlW2GynmnSgiJJEdNg9yW5C8lfoNRZrHGv5EqA== dependencies: "@types/yargs-parser" "*" @@ -2022,24 +2063,24 @@ semver "^7.3.2" tsutils "^3.17.1" -"@uifabric/foundation@^7.9.10": - version "7.9.10" - resolved "https://registry.yarnpkg.com/@uifabric/foundation/-/foundation-7.9.10.tgz#3855fe1490e20eb2ac5c8bfb428d7488dd6989bf" - integrity sha512-DeKN+beoqn6HsMW+Ezici1umj7j8aaNykOhLjqg11XRevJh7ifKQOrpePXM+m13B2VAdm2nPyfO3d7eYFvu7Zw== +"@uifabric/foundation@^7.9.20": + version "7.9.20" + resolved "https://registry.yarnpkg.com/@uifabric/foundation/-/foundation-7.9.20.tgz#993b6d762fd6c6ee878a3ae6a229795c260a1e7c" + integrity sha512-AcOClWfs+rNK0XyPLKTK2Nqeom7zOESOfL3Tbwl5VuDlSrlGW9yNywuuo6gJSOyXCJQO5dJFVdGExmB0EM4vkw== dependencies: "@uifabric/merge-styles" "^7.19.1" "@uifabric/set-version" "^7.0.23" - "@uifabric/styling" "^7.16.10" - "@uifabric/utilities" "^7.32.4" + "@uifabric/styling" "^7.16.18" + "@uifabric/utilities" "^7.33.2" tslib "^1.10.0" -"@uifabric/icons@^7.5.9": - version "7.5.9" - resolved "https://registry.yarnpkg.com/@uifabric/icons/-/icons-7.5.9.tgz#08f5772a0eb7e224fda3434dd3ab29143f21517a" - integrity sha512-kiFw2hm2++OwcVT8ZkHm/UIsyA+4CXBgttmtMaEXMB6/VSt6mfAc+3gs0ehnfXbrBTLUIM9omxXUrrtULSWLTw== +"@uifabric/icons@^7.5.17": + version "7.5.17" + resolved "https://registry.yarnpkg.com/@uifabric/icons/-/icons-7.5.17.tgz#8a24d1716f5d71b9caa83fa828142bc3fc408c04" + integrity sha512-2S1kse0gtseTuV2r59iWukLxxoOJ6GgP2Yhxt9oxzaP9QubpYdxCUepvJmfPQQvvy4GELdykDUWQ6/hbzliJyw== dependencies: "@uifabric/set-version" "^7.0.23" - "@uifabric/styling" "^7.16.10" + "@uifabric/styling" "^7.16.18" tslib "^1.10.0" "@uifabric/merge-styles@^7.19.1": @@ -2050,14 +2091,14 @@ "@uifabric/set-version" "^7.0.23" tslib "^1.10.0" -"@uifabric/react-hooks@^7.13.6": - version "7.13.6" - resolved "https://registry.yarnpkg.com/@uifabric/react-hooks/-/react-hooks-7.13.6.tgz#0626791fe283b235b8ddfedc51f693b50b2792b6" - integrity sha512-DvfphxrTsjo3oYioRZ0D8mXdpxWQhhIHeWk1cfdq0MVGqRyKM+cm++9pJpvItFvnTNba38jzKdggqRSUWi+clg== +"@uifabric/react-hooks@^7.13.9": + version "7.13.9" + resolved "https://registry.yarnpkg.com/@uifabric/react-hooks/-/react-hooks-7.13.9.tgz#82373cdfbccc81b6fa00586dd8994bb47c97e99b" + integrity sha512-VtDg2b3ypYXX7MLp1STk1Fj6ZIeZktXnm0hu1Os/pGvq6xkuLRly5XP6ZSHitm8K7ZcMo48CcNL8smmiXprBQg== dependencies: - "@fluentui/react-window-provider" "^0.3.3" + "@fluentui/react-window-provider" "^1.0.1" "@uifabric/set-version" "^7.0.23" - "@uifabric/utilities" "^7.32.4" + "@uifabric/utilities" "^7.33.2" tslib "^1.10.0" "@uifabric/set-version@^7.0.23": @@ -2067,22 +2108,22 @@ dependencies: tslib "^1.10.0" -"@uifabric/styling@^7.16.10": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@uifabric/styling/-/styling-7.16.10.tgz#c9f25c4a269b2a75214928376088dbbd20820e65" - integrity sha512-qhTJME41VM63paw690xp9SxD3NJP7a4YGUQTifLU0q2GM0e7AMQVDPQ+Cd8Fv9YBS1lJKHi069hVRwSfBejlwg== +"@uifabric/styling@^7.16.18": + version "7.16.18" + resolved "https://registry.yarnpkg.com/@uifabric/styling/-/styling-7.16.18.tgz#e3bcf130f4360ba5dfe078616498164f0423dbdc" + integrity sha512-jINFRMWfSIOZ4H29YNBHtwZU4f8JFprnyBX2E0Wq9rjqRzgcmdYbN2yn88gym6aC3houSDcYM0rdfG4ETjRQSA== dependencies: - "@fluentui/theme" "^1.3.0" + "@fluentui/theme" "^1.7.0" "@microsoft/load-themed-styles" "^1.10.26" "@uifabric/merge-styles" "^7.19.1" "@uifabric/set-version" "^7.0.23" - "@uifabric/utilities" "^7.32.4" + "@uifabric/utilities" "^7.33.2" tslib "^1.10.0" -"@uifabric/utilities@^7.32.4": - version "7.32.4" - resolved "https://registry.yarnpkg.com/@uifabric/utilities/-/utilities-7.32.4.tgz#6e784c29101742196da69d0b60e63cf193c10c71" - integrity sha512-IKZc03uyfTrgcCGSPAUWfFl9CyxzpSrxrYwAuO4NgDEySdOlkYBRwsRUh6UwWfM+sJdhg7Y3nupzNU3VSC/arg== +"@uifabric/utilities@^7.33.2": + version "7.33.2" + resolved "https://registry.yarnpkg.com/@uifabric/utilities/-/utilities-7.33.2.tgz#426f9a8d1f9f7738e65abe4a9e36b65583476d81" + integrity sha512-v2c3IUJdpru/hoGNOwIW549O5D4XBAc5sLpB7RREGI5ywoWuIJlNyYtBEGOwhAY62J2blj11qi86Ep+oZDM/Kw== dependencies: "@fluentui/dom-utilities" "^1.1.1" "@uifabric/merge-styles" "^7.19.1" @@ -2342,9 +2383,9 @@ ajv-keywords@^3.1.0: integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.9.1: - version "6.12.5" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da" - integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -2522,12 +2563,14 @@ array-flatten@^2.1.0: integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== array-includes@^3.0.3, array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + version "3.1.2" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" + integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0" + es-abstract "^1.18.0-next.1" + get-intrinsic "^1.0.1" is-string "^1.0.5" array-union@^1.0.1: @@ -2668,9 +2711,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" - integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axios@^0.19.0: version "0.19.2" @@ -2789,9 +2832,9 @@ babel-plugin-macros@2.5.1: resolve "^1.10.0" babel-plugin-named-asset-import@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz#c9750a1b38d85112c9e166bf3ef7c5dbc605f4be" - integrity sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA== + version "0.3.7" + resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz#156cd55d3f1228a5765774340937afc8398067dd" + integrity sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw== babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" @@ -2877,9 +2920,9 @@ base62@^1.1.0: integrity sha512-V6YHUbjLxN1ymqNLb1DPHoU1CpfdL7d2YTIp5W3U4hhoG4hhxNmsFDs66M9EXxBiSEke5Bt5dwdfMwwZF70iLA== base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base@^0.11.1: version "0.11.2" @@ -2957,7 +3000,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== -bn.js@^5.1.1: +bn.js@^5.0.0, bn.js@^5.1.1: version "5.1.3" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== @@ -3088,11 +3131,11 @@ browserify-des@^1.0.0: safe-buffer "^5.1.2" browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: - bn.js "^4.1.0" + bn.js "^5.0.0" randombytes "^2.0.1" browserify-sign@^4.0.0: @@ -3126,15 +3169,16 @@ browserslist@4.7.0: electron-to-chromium "^1.3.247" node-releases "^1.1.29" -browserslist@^4.0.0, browserslist@^4.1.1, browserslist@^4.12.0, browserslist@^4.4.2, browserslist@^4.5.2, browserslist@^4.8.5: - version "4.14.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015" - integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA== +browserslist@^4.0.0, browserslist@^4.1.1, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.15.0, browserslist@^4.4.2, browserslist@^4.5.2: + version "4.15.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.15.0.tgz#3d48bbca6a3f378e86102ffd017d9a03f122bdb0" + integrity sha512-IJ1iysdMkGmjjYeRlDU8PQejVwxvVO5QOfXH7ylW31GO6LwNRSmm/SgRXtNsEXqMLl2e+2H5eEJ7sfynF8TCaQ== dependencies: - caniuse-lite "^1.0.30001135" - electron-to-chromium "^1.3.571" - escalade "^3.1.0" - node-releases "^1.1.61" + caniuse-lite "^1.0.30001164" + colorette "^1.2.1" + electron-to-chromium "^1.3.612" + escalade "^3.1.1" + node-releases "^1.1.67" bser@2.1.1: version "2.1.1" @@ -3253,6 +3297,14 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +call-bind@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" + integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.0" + call-limit@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.1.tgz#ef15f2670db3f1992557e2d965abc459e6e358d4" @@ -3322,7 +3374,7 @@ camelcase@^4.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -camelcase@^5.0.0, camelcase@^5.2.0, camelcase@^5.3.1: +camelcase@^5.2.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -3337,10 +3389,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000939, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001135: - version "1.0.30001146" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001146.tgz#c61fcb1474520c1462913689201fb292ba6f447c" - integrity sha512-VAy5RHDfTJhpxnDdp2n40GPPLp3KqNrXz1QqFv4J64HvArKs8nuNMOWkB3ICOaBTU/Aj4rYAo/ytdQDDFF/Pug== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000939, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001164: + version "1.0.30001165" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz#32955490d2f60290bb186bb754f2981917fa744f" + integrity sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA== capture-exit@^2.0.0: version "2.0.0" @@ -3364,11 +3416,6 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -ccount@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17" - integrity sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw== - chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3397,11 +3444,6 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -character-entities-html4@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" - integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g== - character-entities-legacy@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" @@ -3442,9 +3484,9 @@ chokidar@^2.0.0, chokidar@^2.0.4, chokidar@^2.1.8: fsevents "^1.2.7" chokidar@^3.4.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" - integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== + version "3.4.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" + integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -3452,7 +3494,7 @@ chokidar@^3.4.1: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.4.0" + readdirp "~3.5.0" optionalDependencies: fsevents "~2.1.2" @@ -3503,6 +3545,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +classnames@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + clean-css@4.2.x: version "4.2.3" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" @@ -3545,10 +3592,10 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -cliui@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.1.tgz#a4cb67aad45cd83d8d05128fc9f4d8fbb887e6b3" - integrity sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ== +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" strip-ansi "^6.0.0" @@ -3614,11 +3661,6 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== - collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -3651,21 +3693,21 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== +color-string@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" + integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" color@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" - integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" + integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== dependencies: color-convert "^1.9.1" - color-string "^1.5.2" + color-string "^1.5.4" colorette@^1.2.1: version "1.2.1" @@ -3808,9 +3850,9 @@ configstore@^3.0.0: xdg-basedir "^3.0.0" confusing-browser-globals@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" - integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== + version "1.0.10" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" + integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== connect-history-api-fallback@^1.3.0: version "1.6.0" @@ -3890,23 +3932,23 @@ copy-to-clipboard@^3.0.8: dependencies: toggle-selection "^1.0.6" -core-js-compat@^3.0.0, core-js-compat@^3.6.2: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" - integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== +core-js-compat@^3.0.0, core-js-compat@^3.7.0: + version "3.8.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.1.tgz#8d1ddd341d660ba6194cbe0ce60f4c794c87a36e" + integrity sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ== dependencies: - browserslist "^4.8.5" + browserslist "^4.15.0" semver "7.0.0" core-js@^2.4.0: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.5.0: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" - integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + version "3.8.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.1.tgz#f51523668ac8a294d1285c3b9db44025fda66d47" + integrity sha512-9Id2xHY1W7m8hCl8NkhQn5CufmF/WuR30BTRewvCXc1aZd3kMECwNZ69ndLbekKfakw9Rf2Xyc+QR6E7Gg+obg== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -4112,12 +4154,12 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" -css-tree@1.0.0-alpha.39: - version "1.0.0-alpha.39" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" - integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== +css-tree@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" + integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== dependencies: - mdn-data "2.0.6" + mdn-data "2.0.14" source-map "^0.6.1" css-what@2.1: @@ -4126,9 +4168,9 @@ css-what@2.1: integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== css-what@^3.2.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.1.tgz#81cb70b609e4b1351b1e54cbc90fd9c54af86e2e" - integrity sha512-wHOppVDKl4vTAOWzJt5Ek37Sgd9qq1Bmj/T1OjvicWbU5W7ru7Pqbn0Jdqii3Drx/h+dixHKXNhZYx7blthL7g== + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== cssdb@^4.3.0: version "4.4.0" @@ -4214,11 +4256,11 @@ cssnano@^4.1.0: postcss "^7.0.0" csso@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" - integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: - css-tree "1.0.0-alpha.39" + css-tree "^1.1.2" cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: version "0.3.8" @@ -4233,14 +4275,14 @@ cssstyle@^1.0.0, cssstyle@^1.1.1: cssom "0.3.x" csstype@^2.2.0: - version "2.6.13" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.13.tgz#a6893015b90e84dd6e85d0e3b442a1e84f2dbe0f" - integrity sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A== + version "2.6.14" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.14.tgz#004822a4050345b55ad4dcc00be1d9cf2f4296de" + integrity sha512-2mSc+VEpGPblzAxyeR+vZhJKgYg0Og0nnRi7pmRXFYYxSfnOnW8A5wwQb4n4cE2nIOzqKOAzLCaEX6aBmNEv8A== csstype@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.3.tgz#2b410bbeba38ba9633353aff34b05d9755d065f8" - integrity sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag== + version "3.0.5" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.5.tgz#7fdec6a28a67ae18647c51668a9ff95bb2fa7bb8" + integrity sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ== currently-unhandled@^0.4.1: version "0.4.1" @@ -4543,16 +4585,16 @@ debug@3.1.0, debug@=3.1.0: ms "2.0.0" debug@^3.1.0, debug@^3.1.1, debug@^3.2.5: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" - integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== +debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" @@ -4569,7 +4611,7 @@ decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.1.0, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -4734,10 +4776,10 @@ diff-sequences@^24.9.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== -diff-sequences@^26.5.0: - version "26.5.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.5.0.tgz#ef766cf09d43ed40406611f11c6d8d9dd8b2fefd" - integrity sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q== +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== diffie-hellman@^5.0.0: version "5.0.3" @@ -4831,9 +4873,9 @@ domelementtype@1, domelementtype@^1.3.1: integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971" - integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" + integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== domexception@^1.0.1: version "1.0.1" @@ -4947,10 +4989,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.571: - version "1.3.578" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.578.tgz#e6671936f4571a874eb26e2e833aa0b2c0b776e0" - integrity sha512-z4gU6dA1CbBJsAErW5swTGAaU2TBzc2mPAonJb00zqW1rOraDo2zfBMDRvaz9cVic+0JEZiYbHWPw/fTaZlG2Q== +electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.612: + version "1.3.616" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.616.tgz#de63d1c79bb8eb61168774df0c11c9e1af69f9e8" + integrity sha512-CI8L38UN2BEnqXw3/oRIQTmde0LiSeqWSRlPA42ZTYgJQ8fYenzAM2Z3ni+jtILTcrs5aiXZCGJ96Pm+3/yGyQ== elliptic@^6.5.3: version "6.5.3" @@ -5019,9 +5061,9 @@ entities@^1.1.1: integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" - integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== env-paths@^2.2.0: version "2.2.0" @@ -5055,7 +5097,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: version "1.17.7" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== @@ -5072,7 +5114,7 @@ es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstrac string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" -es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1: +es-abstract@^1.18.0-next.1: version "1.18.0-next.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== @@ -5111,16 +5153,11 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -escalade@^3.0.2: +escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escalade@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e" - integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig== - escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -5131,6 +5168,11 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escodegen@^1.11.0, escodegen@^1.9.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" @@ -5144,9 +5186,9 @@ escodegen@^1.11.0, escodegen@^1.9.1: source-map "~0.6.1" eslint-config-prettier@^6.1.0: - version "6.12.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.12.0.tgz#9eb2bccff727db1c52104f0b49e87ea46605a0d2" - integrity sha512-9jWPlFlgNwRUYVoujvWTQ1aMO8o6648r+K7qU7K5Jmkbyqav1fuEZC0COYpGBxyiAJb65Ra9hrmFx19xRGwXWw== + version "6.15.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== dependencies: get-stdin "^6.0.0" @@ -5222,9 +5264,9 @@ eslint-plugin-jsx-a11y@6.2.1: jsx-ast-utils "^2.0.1" eslint-plugin-prettier@^3.1.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz#168ab43154e2ea57db992a2cd097c828171f75c2" - integrity sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.2.0.tgz#af391b2226fa0e15c96f36c733f6e9035dbd952c" + integrity sha512-kOUSJnFjAUFKwVxuzy6sA5yyMx6+o9ino4gCdShzBNx4eyFRudWRYKCFolKjoM40PEiuU6Cn7wBLfq3WsGg7qg== dependencies: prettier-linter-helpers "^1.0.0" @@ -5626,9 +5668,9 @@ fastest-levenshtein@^1.0.12: integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== fastq@^1.6.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" - integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== + version "1.9.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" + integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== dependencies: reusify "^1.0.4" @@ -5672,6 +5714,13 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" +file-entry-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" + integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== + dependencies: + flat-cache "^3.0.4" + file-loader@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" @@ -5782,11 +5831,24 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + flatted@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flatted@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" + integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== + flatten@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" @@ -6006,9 +6068,9 @@ genfun@^5.0.0: integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== gentle-fs@^2.3.0, gentle-fs@^2.3.1: version "2.3.1" @@ -6032,6 +6094,15 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.0, get-intrinsic@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" + integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -6392,6 +6463,13 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.7.1, hosted-git-info@^2.8.8: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== +hosted-git-info@^3.0.6: + version "3.0.7" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.7.tgz#a30727385ea85acfcee94e0aad9e368c792e036c" + integrity sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ== + dependencies: + lru-cache "^6.0.0" + hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -6618,9 +6696,9 @@ identity-obj-proxy@3.0.0: harmony-reflect "^1.4.6" ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== iferr@^0.1.5: version "0.1.5" @@ -6675,9 +6753,9 @@ import-fresh@^2.0.0: resolve-from "^3.0.0" import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + version "3.2.2" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" + integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -6747,7 +6825,7 @@ inflight@^1.0.4, inflight@~1.0.6: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6873,11 +6951,6 @@ is-alphabetical@^1.0.0: resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== -is-alphanumeric@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4" - integrity sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ= - is-alphanumerical@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" @@ -6887,9 +6960,11 @@ is-alphanumerical@^1.0.0: is-decimal "^1.0.0" is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" is-arrayish@^0.2.1: version "0.2.1" @@ -6921,9 +6996,9 @@ is-buffer@^1.0.2, is-buffer@^1.1.5: integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-buffer@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-callable@^1.1.4, is-callable@^1.2.2: version "1.2.2" @@ -6963,6 +7038,13 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" +is-core-module@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -6982,7 +7064,7 @@ is-date-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== -is-decimal@^1.0.0, is-decimal@^1.0.2: +is-decimal@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== @@ -7082,9 +7164,9 @@ is-installed-globally@^0.1.0: is-path-inside "^1.0.0" is-negative-zero@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" - integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== is-npm@^1.0.0: version "1.0.0" @@ -7220,21 +7302,11 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" @@ -7369,14 +7441,14 @@ jest-config@^24.9.0: realpath-native "^1.1.0" jest-diff@*: - version "26.5.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.5.2.tgz#8e26cb32dc598e8b8a1b9deff55316f8313c8053" - integrity sha512-HCSWDUGwsov5oTlGzrRM+UPJI/Dpqi9jzeV0fdRNi3Ch5bnoXhnyJMmVg2juv9081zLIy3HGPI5mcuGgXM2xRA== + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== dependencies: chalk "^4.0.0" - diff-sequences "^26.5.0" + diff-sequences "^26.6.2" jest-get-type "^26.3.0" - pretty-format "^26.5.2" + pretty-format "^26.6.2" jest-diff@^24.9.0: version "24.9.0" @@ -7968,10 +8040,10 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -known-css-properties@^0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.19.0.tgz#5d92b7fa16c72d971bda9b7fe295bdf61836ee5b" - integrity sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA== +known-css-properties@^0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.20.0.tgz#0570831661b47dd835293218381166090ff60e96" + integrity sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw== last-call-webpack-plugin@^3.0.0: version "3.0.0" @@ -8013,13 +8085,6 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levenary@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" - integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== - dependencies: - leven "^3.1.0" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -8378,11 +8443,11 @@ log-symbols@^4.0.0: chalk "^4.0.0" loglevel@^1.4.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" - integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== -longest-streak@^2.0.1: +longest-streak@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== @@ -8427,6 +8492,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -8493,18 +8565,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== - -markdown-table@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" - integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== - dependencies: - repeat-string "^1.0.0" - matchmediaquery@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/matchmediaquery/-/matchmediaquery-0.3.1.tgz#8247edc47e499ebb7c58f62a9ff9ccf5b815c6d7" @@ -8526,27 +8586,47 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -mdast-util-compact@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz#cabc69a2f43103628326f35b1acf735d55c99490" - integrity sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA== +mdast-util-from-markdown@^0.8.0: + version "0.8.2" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.2.tgz#d9b5c4eae245e742de8542b9a9fe642c400e8f42" + integrity sha512-lEiC6zP3sLGJmseGHf33YInftqOs1p4Z3U/mxEtjMkNjWTHBJx5rPjbgTbpHba11/H/TgB0fgiaiQk0lzdgKHg== dependencies: - unist-util-visit "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.10.0" + parse-entities "^2.0.0" + +mdast-util-to-markdown@^0.5.0: + version "0.5.4" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.5.4.tgz#be680ed0c0e11a07d07c7adff9551eec09c1b0f9" + integrity sha512-0jQTkbWYx0HdEA/h++7faebJWr5JyBoBeiRf0u3F4F3QtnyyGaWIsOwo749kRb1ttKrLLr+wRtOkfou9yB0p6A== + dependencies: + "@types/unist" "^2.0.0" + longest-streak "^2.0.0" + mdast-util-to-string "^2.0.0" + parse-entities "^2.0.0" + repeat-string "^1.0.0" + zwitch "^1.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== mdn-data@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== -mdn-data@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" - integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== - meant@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.2.tgz#5d0c78310a3d8ae1408a16be0fe0bd42a969f560" - integrity sha512-KN+1uowN/NK+sT/Lzx7WSGIj2u+3xe5n2LbwObfjOhPZiA+cCfCm6idVl0RkEfjThkw5XJ96CyRcanq6GmKtUg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.3.tgz#67769af9de1d158773e928ae82c456114903554c" + integrity sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw== media-typer@0.3.0: version "0.3.0" @@ -8585,22 +8665,22 @@ meow@^3.7.0: redent "^1.0.0" trim-newlines "^1.0.0" -meow@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306" - integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA== +meow@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.0.0.tgz#1aa10ee61046719e334ffdc038bb5069250ec99a" + integrity sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg== dependencies: "@types/minimist" "^1.2.0" camelcase-keys "^6.2.2" decamelize-keys "^1.1.0" hard-rejection "^2.1.0" minimist-options "4.1.0" - normalize-package-data "^2.5.0" + normalize-package-data "^3.0.0" read-pkg-up "^7.0.1" redent "^3.0.0" trim-newlines "^3.0.0" - type-fest "^0.13.1" - yargs-parser "^18.1.3" + type-fest "^0.18.0" + yargs-parser "^20.2.3" merge-deep@^3.0.2: version "3.0.2" @@ -8636,6 +8716,14 @@ microevent.ts@~0.1.1: resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== +micromark@~2.10.0: + version "2.10.1" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.10.1.tgz#cd73f54e0656f10e633073db26b663a221a442a7" + integrity sha512-fUuVF8sC1X7wsCS29SYQ2ZfIZYbTymp0EYr6sab3idFjigFFjGa5UwoniPlV9tAgntjuapW1t9U+S0yDYeGKHQ== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -8709,11 +8797,11 @@ min-indent@^1.0.0: integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-create-react-context@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz#df60501c83151db69e28eac0ef08b4002efab040" - integrity sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA== + version "0.4.1" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== dependencies: - "@babel/runtime" "^7.5.5" + "@babel/runtime" "^7.12.1" tiny-warning "^1.0.3" mini-css-extract-plugin@0.5.0: @@ -8873,9 +8961,9 @@ mute-stream@~0.0.4: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.12.1, nan@^2.13.2: - version "2.14.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" - integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== nanomatch@^1.2.9: version "1.2.13" @@ -9020,10 +9108,10 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-releases@^1.1.29, node-releases@^1.1.61: - version "1.1.61" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e" - integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g== +node-releases@^1.1.29, node-releases@^1.1.67: + version "1.1.67" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" + integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== node-sass@^4.13.0: version "4.14.1" @@ -9073,6 +9161,16 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.0.tgz#1f8a7c423b3d2e85eb36985eaf81de381d01301a" + integrity sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw== + dependencies: + hosted-git-info "^3.0.6" + resolve "^1.17.0" + semver "^7.3.2" + validate-npm-package-license "^3.0.1" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -9208,15 +9306,15 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npm-user-validate@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951" - integrity sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE= +npm-user-validate@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.1.tgz#31428fc5475fe8416023f178c0ab47935ad8c561" + integrity sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw== npm@5.1.0, npm@>=6.14.4: - version "6.14.8" - resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.8.tgz#64ef754345639bc035982ec3f609353c8539033c" - integrity sha512-HBZVBMYs5blsj94GTeQZel7s9odVuuSUHy1+AlZh7rPVux1os2ashvEGLy/STNK7vUjbrCg5Kq9/GXisJgdf6A== + version "6.14.9" + resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.9.tgz#d2b4237562bfd95689249e2c2874700ed952ed82" + integrity sha512-yHi1+i9LyAZF1gAmgyYtVk+HdABlLy94PMIDoK1TRKWvmFQAt5z3bodqVwKvzY0s6dLqQPVsRLiwhJfNtiHeCg== dependencies: JSONStream "^1.3.5" abbrev "~1.1.1" @@ -9290,7 +9388,7 @@ npm@5.1.0, npm@>=6.14.4: npm-pick-manifest "^3.0.2" npm-profile "^4.0.4" npm-registry-fetch "^4.0.7" - npm-user-validate "~1.0.0" + npm-user-validate "^1.0.1" npmlog "~4.1.2" once "~1.4.0" opener "^1.5.1" @@ -9404,17 +9502,17 @@ object-hash@^1.1.4: integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== object-inspect@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== object-is@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.3.tgz#2e3b9e65560137455ee3bd62aec4d90a2ea1cc81" - integrity sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg== + version "1.1.4" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.4.tgz#63d6c83c00a43f4cbc9434eb9757c8a5b8565068" + integrity sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -9429,32 +9527,33 @@ object-visit@^1.0.0: isobject "^3.0.0" object.assign@^4.1.0, object.assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" - integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.0" has-symbols "^1.0.1" object-keys "^1.1.1" object.fromentries@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" - integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.3.tgz#13cefcffa702dc67750314a3305e8cb3fad1d072" + integrity sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.1" has "^1.0.3" object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + version "2.1.1" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" + integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.1" object.pick@^1.3.0: version "1.3.0" @@ -9464,13 +9563,13 @@ object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" + integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.1" has "^1.0.3" obuf@^1.0.0, obuf@^1.1.2: @@ -9478,22 +9577,22 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -office-ui-fabric-react@^7.145.0: - version "7.145.0" - resolved "https://registry.yarnpkg.com/office-ui-fabric-react/-/office-ui-fabric-react-7.145.0.tgz#e86a5fa08a2a3528f2a692bec88ea55c76b238b3" - integrity sha512-+eAo/bZpnTXmirwsPZxIbPhjQk+C34f0W/8tAHYWYASrRio9DWWDB0PRsSGUNrn1QubWxjudW294fovkewPeAQ== +office-ui-fabric-react@^7.153.4: + version "7.153.4" + resolved "https://registry.yarnpkg.com/office-ui-fabric-react/-/office-ui-fabric-react-7.153.4.tgz#7ba7833754c7390d13d1b81b5b346c6b85e2ff62" + integrity sha512-BF4eDxilcW2I6vboXECPqcz2nPYjFZtnHR7lSSY67xRWX0B1+g5xccxqUiDNO/vFmRzvTpD4j53JN70TIzJm1Q== dependencies: "@fluentui/date-time-utilities" "^7.9.0" - "@fluentui/react-focus" "^7.16.10" - "@fluentui/react-window-provider" "^0.3.3" + "@fluentui/react-focus" "^7.16.19" + "@fluentui/react-window-provider" "^1.0.1" "@microsoft/load-themed-styles" "^1.10.26" - "@uifabric/foundation" "^7.9.10" - "@uifabric/icons" "^7.5.9" + "@uifabric/foundation" "^7.9.20" + "@uifabric/icons" "^7.5.17" "@uifabric/merge-styles" "^7.19.1" - "@uifabric/react-hooks" "^7.13.6" + "@uifabric/react-hooks" "^7.13.9" "@uifabric/set-version" "^7.0.23" - "@uifabric/styling" "^7.16.10" - "@uifabric/utilities" "^7.32.4" + "@uifabric/styling" "^7.16.18" + "@uifabric/utilities" "^7.33.2" prop-types "^15.7.2" tslib "^1.10.0" @@ -10198,9 +10297,9 @@ postcss-focus-within@^3.0.0: postcss "^7.0.2" postcss-font-variant@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" - integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== dependencies: postcss "^7.0.2" @@ -10656,7 +10755,7 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== @@ -10709,7 +10808,7 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6: version "7.0.35" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== @@ -10746,12 +10845,12 @@ pretty-bytes@^5.1.0: integrity sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA== pretty-error@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" - integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + version "2.1.2" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== dependencies: - renderkid "^2.0.1" - utila "~0.4" + lodash "^4.17.20" + renderkid "^2.0.4" pretty-format@^24.9.0: version "24.9.0" @@ -10763,15 +10862,15 @@ pretty-format@^24.9.0: ansi-styles "^3.2.0" react-is "^16.8.4" -pretty-format@^26.5.2: - version "26.5.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.5.2.tgz#5d896acfdaa09210683d34b6dc0e6e21423cd3e1" - integrity sha512-VizyV669eqESlkOikKJI8Ryxl/kPpbdLwNdPs2GrbQs18MpySB5S0Yo0N7zkg2xTRiFq4CFw8ct5Vg4a0xP0og== +pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== dependencies: - "@jest/types" "^26.5.2" + "@jest/types" "^26.6.2" ansi-regex "^5.0.0" ansi-styles "^4.0.0" - react-is "^16.12.0" + react-is "^17.0.1" private@^0.1.6, private@~0.1.5: version "0.1.8" @@ -10814,12 +10913,12 @@ promise@^8.0.3: asap "~2.0.6" prompts@^2.0.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" - integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" + integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== dependencies: kleur "^3.0.3" - sisteransi "^1.0.4" + sisteransi "^1.0.5" promzard@^0.3.0: version "0.3.0" @@ -10950,9 +11049,9 @@ qs@~6.5.2: integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== query-string@^6.8.2: - version "6.13.5" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8" - integrity sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q== + version "6.13.7" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.7.tgz#af53802ff6ed56f3345f92d40a056f93681026ee" + integrity sha512-CsGs8ZYb39zu0WLkeOhe0NMePqgYdAuCqxOYKDR5LVCytDZYMGx3Bb+xypvQvPHVPijRXB0HZNFllCzHRe4gEA== dependencies: decode-uri-component "^0.2.0" split-on-first "^1.0.0" @@ -11084,9 +11183,9 @@ react-dev-utils@^9.0.0: text-table "0.2.0" react-dom@^16.8.6: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" - integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== + version "16.14.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" + integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -11094,15 +11193,20 @@ react-dom@^16.8.6: scheduler "^0.19.1" react-error-overlay@^6.0.3: - version "6.0.7" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" - integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== + version "6.0.8" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.8.tgz#474ed11d04fc6bda3af643447d85e9127ed6b5de" + integrity sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw== -react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: +react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" + integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== + react-json-tree@^0.11.2: version "0.11.2" resolved "https://registry.yarnpkg.com/react-json-tree/-/react-json-tree-0.11.2.tgz#af70199fcbc265699ade2aec492465c51608f95e" @@ -11135,9 +11239,9 @@ react-pagination@^1.0.0: react "^0.13.3" react-responsive@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/react-responsive/-/react-responsive-8.1.1.tgz#e4b1bd677798deecb4f1c3cff35a020ca0abdb27" - integrity sha512-kvgOGU4m64ALsDiNKgImW6xtbdx/aSuw8sTCHC8RsBlkXsDA/gMoZkYboZuk4V9DhX6bCFh4gBH2UqlYVPLvcA== + version "8.2.0" + resolved "https://registry.yarnpkg.com/react-responsive/-/react-responsive-8.2.0.tgz#e0ffb306cfd8f38c9c12e26725b9e1245fa9debc" + integrity sha512-iagCqVrw4QSjhxKp3I/YK6+ODkWY6G+YPElvdYKiUUbywwh9Ds0M7r26Fj2/7dWFFbOpcGnJE6uE7aMck8j5Qg== dependencies: hyphenate-style-name "^1.0.0" matchmediaquery "^0.3.0" @@ -11174,9 +11278,9 @@ react-router@5.2.0, react-router@^5.2.0: tiny-warning "^1.0.0" react-table@^7.0.0-rc.15: - version "7.5.2" - resolved "https://registry.yarnpkg.com/react-table/-/react-table-7.5.2.tgz#d82ceee3d4d40b119159bce1708f084a95d3435c" - integrity sha512-qiceR/gQUOBsO/q1z1wZ3RbRvkRt39Gbzo631HiPuWmo+eTmTgaXDqLGzCmU+bOr81PB6kDxXhoWQR8hiWaUJA== + version "7.6.2" + resolved "https://registry.yarnpkg.com/react-table/-/react-table-7.6.2.tgz#b60932fa6d457c2bca0da49815cd6a8fe9451f77" + integrity sha512-urwNZTieb+xg/+BITUIrqdH5jZfJlw7rKVAAq25iXpBPwbQojLCEKJuGycLbVwn8fzU+Ovly3y8HHNaLNrPCvQ== react@^0.13.3: version "0.13.3" @@ -11186,9 +11290,9 @@ react@^0.13.3: envify "^3.0.0" react@^16.8.6: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" - integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== + version "16.14.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -11371,10 +11475,10 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== dependencies: picomatch "^2.2.1" @@ -11426,9 +11530,9 @@ regenerate-unicode-properties@^8.2.0: regenerate "^1.4.0" regenerate@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" - integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.11.0: version "0.11.1" @@ -11473,7 +11577,7 @@ regexpp@^3.0.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== -regexpu-core@^4.7.0: +regexpu-core@^4.7.1: version "4.7.1" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== @@ -11517,79 +11621,51 @@ relateurl@0.2.x: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= -remark-parse@^8.0.0: - version "8.0.3" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - -remark-stringify@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-8.1.1.tgz#e2a9dc7a7bf44e46a155ec78996db896780d8ce5" - integrity sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A== - dependencies: - ccount "^1.0.0" - is-alphanumeric "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - longest-streak "^2.0.1" - markdown-escapes "^1.0.0" - markdown-table "^2.0.0" - mdast-util-compact "^2.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - stringify-entities "^3.0.0" - unherit "^1.0.4" - xtend "^4.0.1" + mdast-util-from-markdown "^0.8.0" -remark@^12.0.0: - version "12.0.1" - resolved "https://registry.yarnpkg.com/remark/-/remark-12.0.1.tgz#f1ddf68db7be71ca2bad0a33cd3678b86b9c709f" - integrity sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw== +remark-stringify@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.0.tgz#8ba0c9e4167c42733832215a81550489759e3793" + integrity sha512-8x29DpTbVzEc6Dwb90qhxCtbZ6hmj3BxWWDpMhA+1WM4dOEGH5U5/GFe3Be5Hns5MvPSFAr1e2KSVtKZkK5nUw== dependencies: - remark-parse "^8.0.0" - remark-stringify "^8.0.0" - unified "^9.0.0" + mdast-util-to-markdown "^0.5.0" + +remark@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/remark/-/remark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425" + integrity sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA== + dependencies: + remark-parse "^9.0.0" + remark-stringify "^9.0.0" + unified "^9.1.0" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= -renderkid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" - integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== +renderkid@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.4.tgz#d325e532afb28d3f8796ffee306be8ffd6fc864c" + integrity sha512-K2eXrSOJdq+HuKzlcjOlGoOarUu5SDguDEhE7+Ah4zuOWL40j8A/oHvLlLob9PSTNvVnBd+/q0Er1QfpEuem5g== dependencies: css-select "^1.1.0" dom-converter "^0.2" htmlparser2 "^3.3.0" + lodash "^4.17.20" strip-ansi "^3.0.0" - utila "^0.4.0" repeat-element@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.0.0, repeat-string@^1.5.4, repeat-string@^1.6.1: +repeat-string@^1.0.0, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -11601,11 +11677,6 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -replace-ext@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" - integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= - request-promise-core@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" @@ -11712,11 +11783,12 @@ resolve@1.10.0: dependencies: path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.8.1, resolve@^1.9.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== +resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.8.1, resolve@^1.9.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== dependencies: + is-core-module "^2.1.0" path-parse "^1.0.6" restore-cursor@^2.0.0: @@ -11771,6 +11843,13 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -11790,9 +11869,9 @@ run-async@^2.2.0: integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-parallel@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" @@ -11949,9 +12028,11 @@ semver@^6.0.0, semver@^6.2.0: integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" semver@~5.3.0: version "5.3.0" @@ -12115,7 +12196,7 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -sisteransi@^1.0.4: +sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== @@ -12332,9 +12413,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" - integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== spdy-transport@^3.0.0: version "3.0.0" @@ -12409,14 +12490,11 @@ stable@^0.1.8: integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== - -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.4.tgz#4b600971dcfc6aed0cbdf2a8268177cc916c87c8" + integrity sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w== + dependencies: + escape-string-regexp "^2.0.0" static-extend@^0.1.1: version "0.1.2" @@ -12532,20 +12610,20 @@ string-width@^4.1.0, string-width@^4.2.0: strip-ansi "^6.0.0" string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.5" string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.5" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -12566,17 +12644,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringify-entities@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.0.1.tgz#32154b91286ab0869ab2c07696223bd23b6dbfc0" - integrity sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ== - dependencies: - character-entities-html4 "^1.0.0" - character-entities-legacy "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.2" - is-hexadecimal "^1.0.0" - stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" @@ -12698,21 +12765,21 @@ stylelint-config-standard@^20.0.0: stylelint-config-recommended "^3.0.0" stylelint@^13.7.0: - version "13.7.2" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.7.2.tgz#6f3c58eea4077680ed0ceb0d064b22b100970486" - integrity sha512-mmieorkfmO+ZA6CNDu1ic9qpt4tFvH2QUB7vqXgrMVHe5ENU69q7YDq0YUg/UHLuCsZOWhUAvcMcLzLDIERzSg== + version "13.8.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.8.0.tgz#446765dbe25e3617f819a0165956faf2563ddc23" + integrity sha512-iHH3dv3UI23SLDrH4zMQDjLT9/dDIz/IpoFeuNxZmEx86KtfpjDOscxLTFioQyv+2vQjPlRZnK0UoJtfxLICXQ== dependencies: "@stylelint/postcss-css-in-js" "^0.37.2" - "@stylelint/postcss-markdown" "^0.36.1" + "@stylelint/postcss-markdown" "^0.36.2" autoprefixer "^9.8.6" balanced-match "^1.0.0" chalk "^4.1.0" cosmiconfig "^7.0.0" - debug "^4.1.1" + debug "^4.2.0" execall "^2.0.0" fast-glob "^3.2.4" fastest-levenshtein "^1.0.12" - file-entry-cache "^5.0.1" + file-entry-cache "^6.0.0" get-stdin "^8.0.0" global-modules "^2.0.0" globby "^11.0.1" @@ -12721,14 +12788,14 @@ stylelint@^13.7.0: ignore "^5.1.8" import-lazy "^4.0.0" imurmurhash "^0.1.4" - known-css-properties "^0.19.0" + known-css-properties "^0.20.0" lodash "^4.17.20" log-symbols "^4.0.0" mathml-tag-names "^2.1.3" - meow "^7.1.1" + meow "^8.0.0" micromatch "^4.0.2" normalize-selector "^0.2.0" - postcss "^7.0.32" + postcss "^7.0.35" postcss-html "^0.36.0" postcss-less "^3.1.4" postcss-media-query-parser "^0.2.3" @@ -12736,7 +12803,7 @@ stylelint@^13.7.0: postcss-safe-parser "^4.0.2" postcss-sass "^0.4.4" postcss-scss "^2.1.1" - postcss-selector-parser "^6.0.2" + postcss-selector-parser "^6.0.4" postcss-syntax "^0.36.2" postcss-value-parser "^4.1.0" resolve-from "^5.0.0" @@ -12747,8 +12814,8 @@ stylelint@^13.7.0: style-search "^0.1.0" sugarss "^2.0.0" svg-tags "^1.0.0" - table "^6.0.1" - v8-compile-cache "^2.1.1" + table "^6.0.3" + v8-compile-cache "^2.2.0" write-file-atomic "^3.0.3" sugarss@^2.0.0: @@ -12833,10 +12900,10 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -table@^6.0.1: - version "6.0.3" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.3.tgz#e5b8a834e37e27ad06de2e0fda42b55cfd8a0123" - integrity sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw== +table@^6.0.3: + version "6.0.4" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d" + integrity sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw== dependencies: ajv "^6.12.4" lodash "^4.17.20" @@ -12968,9 +13035,9 @@ timed-out@^4.0.0: integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= timers-browserify@^2.0.4: - version "2.0.11" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" - integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== dependencies: setimmediate "^1.0.4" @@ -13088,16 +13155,6 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== -trim-trailing-lines@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz#7f0739881ff76657b7776e10874128004b625a94" - integrity sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA== - -trim@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= - trough@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" @@ -13116,9 +13173,9 @@ ts-pnp@^1.0.0: integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.0.tgz#d624983f3e2c5e0b55307c3dd6c86acd737622c6" - integrity sha512-+Zw5lu0D9tvBMjGP8LpvMb0u2WW2QV3y+D8mO6J+cNzCYIN4sVy43Bf9vl92nqFahutN0I8zHa7cc4vihIshnw== + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tsutils@^3.17.1: version "3.17.1" @@ -13151,10 +13208,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== type-fest@^0.6.0: version "0.6.0" @@ -13209,14 +13266,6 @@ umask@^1.1.0, umask@~1.1.0: resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -13240,7 +13289,7 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== -unified@^9.0.0: +unified@^9.1.0: version "9.2.0" resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== @@ -13293,24 +13342,17 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" -unist-util-find-all-after@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz#95cc62f48812d879b4685a0512bf1b838da50e9a" - integrity sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw== +unist-util-find-all-after@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz#fdfecd14c5b7aea5e9ef38d5e0d5f774eeb561f6" + integrity sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ== dependencies: unist-util-is "^4.0.0" unist-util-is@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.2.tgz#c7d1341188aa9ce5b3cff538958de9895f14a5de" - integrity sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ== - -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== - dependencies: - unist-util-visit "^2.0.0" + version "4.0.4" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.4.tgz#3e9e8de6af2eb0039a59f50c9b3e99698a924f50" + integrity sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA== unist-util-stringify-position@^2.0.0: version "2.0.3" @@ -13319,23 +13361,6 @@ unist-util-stringify-position@^2.0.0: dependencies: "@types/unist" "^2.0.2" -unist-util-visit-parents@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz#4dd262fb9dcfe44f297d53e882fc6ff3421173d5" - integrity sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -13488,7 +13513,7 @@ util@^0.11.0: dependencies: inherits "2.0.3" -utila@^0.4.0, utila@~0.4: +utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= @@ -13503,10 +13528,10 @@ uuid@^3.0.1, uuid@^3.3.2, uuid@^3.3.3: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -v8-compile-cache@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" - integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== +v8-compile-cache@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" @@ -13547,11 +13572,6 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vfile-location@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.1.0.tgz#81cd8a04b0ac935185f4fce16f270503fc2f692f" - integrity sha512-FCZ4AN9xMcjFIG1oGmZKo61PjwJHRVA+0/tPUP2ul4uIwjGGndIxavEMRpWn5p4xwm/ZsdXp9YNygf1ZyE4x8g== - vfile-message@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" @@ -13561,13 +13581,12 @@ vfile-message@^2.0.0: unist-util-stringify-position "^2.0.0" vfile@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.0.tgz#26c78ac92eb70816b01d4565e003b7e65a2a0e01" - integrity sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw== + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== dependencies: "@types/unist" "^2.0.0" is-buffer "^2.0.0" - replace-ext "1.0.0" unist-util-stringify-position "^2.0.0" vfile-message "^2.0.0" @@ -13599,23 +13618,23 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" -watchpack-chokidar2@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" - integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== dependencies: chokidar "^2.1.8" watchpack@^1.5.0: - version "1.7.4" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" - integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== dependencies: graceful-fs "^4.1.2" neo-async "^2.5.0" optionalDependencies: chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.0" + watchpack-chokidar2 "^2.0.1" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" @@ -13760,9 +13779,9 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: iconv-lite "0.4.24" whatwg-fetch@^3.0.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz#e5f871572d6879663fa5674c8f833f15a8425ab3" - integrity sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ== + version "3.5.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868" + integrity sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A== whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" @@ -14040,20 +14059,20 @@ xmlchars@^2.1.1: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: +xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== -y18n@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.1.tgz#1ad2a7eddfa8bce7caa2e1f6b5da96c39d99d571" - integrity sha512-/jJ831jEs4vGDbYPQp4yGKDYPSCCEQ45uZWJHE1AoYBzqdZi8+LDWas0z4HrmJXmKdpFsTiowSHXdxyFhpmdMg== +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== yallist@^2.1.2: version "2.1.2" @@ -14065,38 +14084,40 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@^1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== -yargs-parser@^18.1.3: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^20.0.0: - version "20.2.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.0.tgz#944791ca2be2e08ddadd3d87e9de4c6484338605" - integrity sha512-2agPoRFPoIcFzOIp6656gcvsg2ohtscpw2OINr/q46+Sq41xz2OYLqx5HRHabmFU1OARIPAYH5uteICE7mn/5A== +yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== yargs@12.0.2, yargs@>=16.0.3, yargs@^11.0.0, yargs@^13.3.0, yargs@^13.3.2, yargs@^14.2.3, yargs@^8.0.2: - version "16.0.3" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.0.3.tgz#7a919b9e43c90f80d4a142a89795e85399a7e54c" - integrity sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA== + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: - cliui "^7.0.0" - escalade "^3.0.2" + cliui "^7.0.2" + escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" string-width "^4.2.0" - y18n "^5.0.1" - yargs-parser "^20.0.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" zrender@4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/zrender/-/zrender-4.3.2.tgz#ec7432f9415c82c73584b6b7b8c47e1b016209c6" integrity sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==